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

在很多电商网页及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>

时间: 2024-10-26 09:07:24

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

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

在很多电商网页及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之ActionBar、Tabs、Fragment、ViewPager实现标签页切换并缓存页面

感觉 Android 到处都是坑,每个地方都要把人折腾半天. 今天来简单说说 Android之ActionBar.Tabs.Fragment.ViewPager 实现标签页切换并缓存页面 关于他们的介绍就不多说了,网上到处都是,只说关键的部分: 我在开发的时候遇到几个疑难问题,花费大量时间处理,总结如下: 1. 关于 Fragment 内部逻辑处理该写在哪个事件回调部分? 2. ViewPager 页面切换动画卡顿,让我头疼了很久. 3. ViewPager 中如何保存 Fragment 当前视

Android app引导页(背景图片切换加各个页面动画效果)

先看效果图: 转自:http://blog.csdn.net/lowprofile_coding/article/details/48037095 1.显示三个页面的Activity  用view pager去加载三个fragment实现,控制点点点的切换,监听view pager的切换,控制fragment动画的开始跟结束,重写了view pager,实现了背景图片的移动效果. /** * 主Activity * @author ansen * @create time 2015-08-07

Android App在ViewPager中使用Fragment的实例讲解_Android

据说Android最推荐的是在ViewPager中使用FragMent,即ViewPager中的页面不像前面那样用LayoutInflater直接从布局文件加载,而是一个个Fragment.注意这里的Fragment 是android.support.v4.view包里的Fragment,而不是android.app包里的Fragment. 使用v4包里的Fragment的Activity必须继承自FragmentActivity. 其实使用Fragment与前面不使用Fragment非常类似:

Android中使用Handler及Countdowntimer实现包含倒计时的闪屏页面

上一篇博文<Android中Handler使用浅析>通过实现倒计时闪屏页面的制作引出了Handler的使用方法以及实现原理,博文末尾也提到了实现过程中的Bug,有兴趣的朋友可以点击链接回去看看.今天通过使用Handler以及CountDownTimer来实现完整版的倒计时闪屏(不会出现在退出闪屏页后,依然会跳转页面的现象). 1. 实现效果如下: 1.1  正常进入跳转的效果以及log显示 1.2  倒计时未结束时退出以及log显示 对比上篇博文的实现,退出后计时停止且不会再跳到新的界面 2.

Android App在ViewPager中使用Fragment的实例讲解

据说Android最推荐的是在ViewPager中使用FragMent,即ViewPager中的页面不像前面那样用LayoutInflater直接从布局文件加载,而是一个个Fragment.注意这里的Fragment 是android.support.v4.view包里的Fragment,而不是android.app包里的Fragment. 使用v4包里的Fragment的Activity必须继承自FragmentActivity. 其实使用Fragment与前面不使用Fragment非常类似:

Android App开发中ViewPager组件的入门使用教程

首先让大家有个全局的认识,直接上个项目,看看仅仅通过这几行代码,竟然就能完成如此强悍的功能.下篇再仔细讲讲为什么要这么写. 效果图: 实现了三个view间的相互滑动 第一个VIEW向第二个VIEW滑动: 第二个VIEW向第三个VIEW滑动: 一.新建项目,引入ViewPager控件 ViewPager.它是google SDk中自带的一个附加包的一个类,可以用来实现屏幕间的切换. 1.在主布局文件里加入 <RelativeLayout xmlns:android="http://schem

android app嵌入一个html页面,点击按钮选择图片时报错了

问题描述 android app嵌入一个html页面,点击按钮选择图片时报错了 app使用webview加载一个html页面,html就是用来选择本地图片的,在其他机器上都OK,在htc one貌似不行,报了下面的问题,有没有懂的大神指导下,4.4.2的,直接使用浏览器打开这个html是没问题,webview加载就不行了 大概可能是什么问题呢? W/chromium(6828): [WARNING:resource_bundle.cc(429)] locale resources are not