Android App中用Handler实现ViewPager页面的自动切换_Android

在很多电商网页及app上都有自动切换的商品的推广快,感觉体验挺不错的,正好今天学习使用ViewPager,因此也实现了一个功能类似的demo。

下面是其中的两个截图:

实现一个自动播放功能的ViewPager,要做的主要有以下的几个部分:

实现一个ViewPagerAdapter,用于为ViewPager提供展示内容(例如上面的两张小猫图片)

 public class ViewPagerAdapter extends PagerAdapter {
    private List<View> mData;
    public ViewPagerAdapter(List<View> mData) {
      this.mData = mData;
    }

    @Override
    public int getCount() {
      return mData.size();
    }

    @Override
    public boolean isViewFromObject(View arg0, Object arg1) {
      return arg0 == arg1;
    }

    @Override
    public Object instantiateItem(ViewGroup container, int position) {
      View v = mData.get(position);
      container.addView(v);
      return v;
    }

    @Override
    public void destroyItem(ViewGroup container, int position, Object object) {
//  super.destroyItem(container, position, object);
      container.removeView(mData.get(position));
    }

  }

实现一个OnPageChangeListener,这样在页面切换后可以提示当前页面所在的位置(例如上图中,左下角的3个圆点,红色表示当前页面)

 private class ViewPageChangeListener implements OnPageChangeListener {

    @Override
    public void onPageScrollStateChanged(int arg0) {
    }

    @Override
    public void onPageScrolled(int arg0, float arg1, int arg2) {
    }

    //监听页面改变事件来改变viewIndicator中的指示图片
    @Override
    public void onPageSelected(int arg0) {
      int len = viewIndicator.getChildCount();
      for(int i = 0; i < len; ++i)
        viewIndicator.getChildAt(i).setBackgroundResource(R.drawable.tip_normal);
      viewIndicator.getChildAt(arg0).setBackgroundResource(R.drawable.tip_select);
    }

  }

实现一个Handler,用于在一定的时间间隔后修改UI(将当前显示的图片切换到下一个)

private Handler mHandler = new Handler() {
    public void handleMessage(android.os.Message msg) {
      switch(msg.what) {
      case 1:
        int totalcount = pagers.size();//autoChangeViewPager.getChildCount();
        int currentItem = autoChangeViewPager.getCurrentItem();

        int toItem = currentItem + 1 == totalcount ? 0 : currentItem + 1;

        Log.i(TAG, "totalcount: " + totalcount + "  currentItem: " + currentItem + "  toItem: " + toItem);

        autoChangeViewPager.setCurrentItem(toItem, true);

        //每两秒钟发送一个message,用于切换viewPager中的图片
        this.sendEmptyMessageDelayed(1, 2000);
      }
    }
  };

上面这3段就是主要的代码,除此之外,还需要在onResume()中发送一个起始message以及在onStop()中停止ViewPager页面的自动切换等内容。
完整的代码如下:

public class MainActivity extends Activity {
  private static final String TAG = MainActivity.class.getSimpleName();
  private ViewPager autoChangeViewPager;

  //用来指示当前显示图片所在位置
  private LinearLayout viewIndicator;

  //包含要在ViewPager中显示的图片
  private List<View> pagers;
  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    autoChangeViewPager = (ViewPager) findViewById(R.id.autoVP);
    viewIndicator = (LinearLayout) findViewById(R.id.vpindicator);

    initAdapter();

    //监听页面改变事件来改变viewIndicator中的指示图片
    autoChangeViewPager.setOnPageChangeListener(new ViewPageChangeListener());

  }

  private void initAdapter() {
    //即将在viewPager中展示的图片资源
    int[] imgs = {R.drawable.i1, R.drawable.i2, R.drawable.i3};

    //init pagers;
    pagers = new ArrayList<View>();
    LinearLayout.LayoutParams img_params = new LayoutParams(
        LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT
        );
    for(int i = 0; i < imgs.length; ++i) {
      ImageView iv = new ImageView(this);
      iv.setBackgroundResource(imgs[i]);
      iv.setLayoutParams(img_params);
      final int index = i;
      iv.setOnClickListener(new OnClickListener() {
        //当viewPager中的图片被点击后,跳转到新的activity
        @Override
        public void onClick(View v) {
          Intent i = new Intent(MainActivity.this, InvokedActivity.class);
          i.putExtra("name", "cat " + index);
          MainActivity.this.startActivity(i);
        }
      });
      pagers.add(iv);
    }
    autoChangeViewPager.setAdapter(new ViewPagerAdapter(pagers));

    //init indicator
    LinearLayout.LayoutParams ind_params = new LayoutParams(
        LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT
        );
    for(int i = 0; i < imgs.length; ++i) {
      ImageView iv = new ImageView(this);
      if(i == 0)
        iv.setBackgroundResource(R.drawable.tip_select);
      else
        iv.setBackgroundResource(R.drawable.tip_normal);
      iv.setLayoutParams(ind_params);
      viewIndicator.addView(iv);
    }
  }

  @Override
  protected void onResume() {
    super.onResume();
    //activity启动两秒钟后,发送一个message,用来将viewPager中的图片切换到下一个
    mHandler.sendEmptyMessageDelayed(1, 2000);
  }

  @Override
  protected void onStop() {
    super.onStop();
    //停止viewPager中图片的自动切换
    mHandler.removeMessages(1);
  }

  public class ViewPagerAdapter extends PagerAdapter {
    private List<View> mData;
    public ViewPagerAdapter(List<View> mData) {
      this.mData = mData;
    }

    @Override
    public int getCount() {
      return mData.size();
    }

    @Override
    public boolean isViewFromObject(View arg0, Object arg1) {
      return arg0 == arg1;
    }

    @Override
    public Object instantiateItem(ViewGroup container, int position) {
      View v = mData.get(position);
      container.addView(v);
      return v;
    }

    @Override
    public void destroyItem(ViewGroup container, int position, Object object) {
//  super.destroyItem(container, position, object);
      container.removeView(mData.get(position));
    }

  }

  private class ViewPageChangeListener implements OnPageChangeListener {

    @Override
    public void onPageScrollStateChanged(int arg0) {
    }

    @Override
    public void onPageScrolled(int arg0, float arg1, int arg2) {
    }

    //监听页面改变事件来改变viewIndicator中的指示图片
    @Override
    public void onPageSelected(int arg0) {
      int len = viewIndicator.getChildCount();
      for(int i = 0; i < len; ++i)
        viewIndicator.getChildAt(i).setBackgroundResource(R.drawable.tip_normal);
      viewIndicator.getChildAt(arg0).setBackgroundResource(R.drawable.tip_select);
    }

  }

  private Handler mHandler = new Handler() {
    public void handleMessage(android.os.Message msg) {
      switch(msg.what) {
      case 1:
        int totalcount = pagers.size();//autoChangeViewPager.getChildCount();
        int currentItem = autoChangeViewPager.getCurrentItem();

        int toItem = currentItem + 1 == totalcount ? 0 : currentItem + 1;

        Log.i(TAG, "totalcount: " + totalcount + "  currentItem: " + currentItem + "  toItem: " + toItem);

        autoChangeViewPager.setCurrentItem(toItem, true);

        //每两秒钟发送一个message,用于切换viewPager中的图片
        this.sendEmptyMessageDelayed(1, 2000);
      }
    }
  };
}

布局文件如下:(上面代码中的InvokedActivity非常简单,此处就省略了)

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="match_parent"
  android:layout_height="match_parent" >

  <android.support.v4.view.ViewPager
    android:id="@+id/autoVP"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

  <LinearLayout
    android:id="@+id/vpindicator"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_gravity="bottom"
    android:orientation="horizontal" />

</FrameLayout>

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索android
, viewpager
handler
viewpager页面切换、css3实现页面滑动切换、vue 实现tab切换页面、qt5 qml 实现页面切换、html5实现app页面切换,以便于您获取更多的相关知识。

时间: 2024-09-11 20:15:54

Android App中用Handler实现ViewPager页面的自动切换_Android的相关文章

Android App中用Handler实现ViewPager页面的自动切换

在很多电商网页及app上都有自动切换的商品的推广快,感觉体验挺不错的,正好今天学习使用ViewPager,因此也实现了一个功能类似的demo. 下面是其中的两个截图: 实现一个自动播放功能的ViewPager,要做的主要有以下的几个部分: 实现一个ViewPagerAdapter,用于为ViewPager提供展示内容(例如上面的两张小猫图片) public class ViewPagerAdapter extends PagerAdapter { private List<View> mDat

android-jsp 页面图片自动切换代码

问题描述 jsp 页面图片自动切换代码 要求: 1.支持跨浏览器(常用的几种),IE需要支持低版本(IE6-IE8): 2.支持手机浏览(苹果IOS和android系统): 3.图片数量及切换的窗口大小可以自己设置(不要多处修改): 4.图片从有到左滚动,鼠标放上面,图片停止滚动,点击图片可以跳转到指定页面. 可以用jquery,多页面可以调用(只需修改图片参数即可). 效果类似下面网页:http://www.bj969.com/news/201601.xml 测试好了再回答,谢谢. 解决方案

分析Android App中内置换肤功能的实现方式_Android

Android平台api没有特意为换肤提供一套简便的机制,这可能是外国的软件更注重功能和易用,不流行换肤.系统不提供直接支持,只能自行研究. 换肤,可以认为是动态替换资源(文字.颜色.字体大小.图片.布局文件--).这个使用编程语言来动态设置是可以做到的,例如使用View的setBackgroundResource.setTextSize.setTextColor等函数.但我们不可能在每个activity里对页面里的所有控件都通过调用这些函数来换肤,这样的程序代码难以维护.扩展,也违背了UI和代

Android App中实现向右滑动销毁功能的要点解析_Android

今天给大家带来一个向右滑动销毁Activity的效果,Activtiy随着手指的移动而移动,该效果在Android应用中还是比较少见的,在IOS中就比较常见了,例如"网易新闻" ,"美食杰" , "淘宝"等应用采用此效果,而Android应用中"知乎"采用的也是这种滑动切换Activity的效果, 不过我发现"淘宝"并没有随着手势的移动而移动,只是捕捉到滑动手势,然后产生平滑切换界面的动画效果,这个在And

Android app开发中Retrofit框架的初步上手使用_Android

Retrofit 2.0先来说一下Retrofit 2.0版本中一些引人注意的地方. 在Retrofit 2.0中,最大的改动莫过于减小库的体积,首先,Retrofit 2.0去掉了对所有的HTTP客户端的兼容,而钟情于OkHttpClient一个,极大地减少了各种适配代码,原因一会儿说;其次,拆库,比如将对RxJava的支持设置为可选(需要额外引入库):再比如将各个序列化反序列化转换器支持设置为可选(需要额外引入库).于2.0抛弃HttpClient和HttpURLConnection,为了减

Android 高仿微信语音聊天页面高斯模糊(毛玻璃效果)_Android

目前的应用市场上,使用毛玻璃效果的APP随处可见,比如用过微信语音聊天的人可以发现,语音聊天页面就使用了高斯模糊效果. 先看下效果图:   仔细观察上图,我们可以发现,背景图以用户头像为模板,对其进行了高斯模糊,并把它作为整个页面的背景色. 关于Android如何快速实现高斯模糊(毛玻璃效果),网上一堆相关介绍,可参考下面文章一种快速毛玻璃虚化效果实现–Android. 下面直接给出模糊化工具类(已验证可行): import android.graphics.Bitmap; /** * 快速模糊

Android App中使用Glide加载图片的教程_Android

与其他图片加载库相同,Glide除了可以加载网络图片之外,也可以加载本地图片.甚至还可以从各种各样奇葩的数据源中加载图片. 加载网络图片很多情况下,我们使用图片加载库就是为了加载网络图片.网络操作是一个很复杂的东西.试想一下,如果没有图片加载库,我们就要手动去下载图片,缓存图片,最后再从文件里面读取bitmap并设置到Imageview里面.这还算好的,要是在Listview里面你会更头疼的.原因我就不说了,你懂的~~再加上各种各样的Bitmap操作,保准你再也不想撸代码了.而且Bitmap这东

详解Android App中使用VideoView来实现视频播放的方法_Android

通过VideoView播放视频的步骤: 1.在界面布局文件中定义VideoView组件,或在程序中创建VideoView组件 2.调用VideoView的如下两个方法来加载指定的视频 (1)setVidePath(String path):加载path文件代表的视频 (2)setVideoURI(Uri uri):加载uri所对应的视频 3.调用VideoView的start().stop().psuse()方法来控制视频的播放 VideoView通过与MediaController类结合使用,

Android中用RxJava和ViewPager实现轮播图_Android

前言 很多人要实现轮播图都会想到使用ViewPager + Handler来完成轮播图的效果.但是在RxJava快速发展的情况下,已经可以使用RxJava来代替Handler完成这样任务了. 下面我们就来介绍如何实现RxJava+ViewPager的轮播图. 效果图如下 ViewPager的操作 说到ViwePager应该大家都不陌生,它可以结合普通的View也可以结合Fragment一起使用.在此我也就不对它的使用方法进行过多的介绍了.直接开始介绍轮播的方法. 常见的轮播操作 private