Android借助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>

Android借助Handler,实现ViewPager中页面的自动切换(转)

时间: 2024-10-26 13:57:55

Android借助Handler,实现ViewPager中页面的自动切换(转)的相关文章

android ViewPager中页面延迟加载的实现

对于viewpager的使用,如果说是请求的数据对内存的消耗不到的话,这是很理想的,但是如果说请求的数据对内存消耗的比较大的话这样就容易出现oom(比如说图片),在使用viewPager的时候使用setOffscreenPageLimit(int size)默认的是1,所以说我们怎么设置这个值,在加载数据的话会将当前页面和下个页面的数据同时的进行请求,这在某种情况下时非常的影响性能的,还有就是在当前页面和下个页面在viewPager中算作了同一个页面,因为你是无法通过生命周期来进行控制数据的延迟

Android利用广播实现ViewPager中item之间的数据通信

当你在实现Fragment之间的通信时(例如Fragment_A和Fragment_B),可能会想到的方法是在Fragment_B中对外提供一个接口,然后在Fragment_A中去调用这个接口,并把这需要的参数传递过去. 下面我将对利用广播来实现从Fragment_A向Fragment_B传递数据. 主界面: public class MainActivity extends FragmentActivity { private int getLayoutResID() { return R.l

【Android】监听viewpager子页面里面的Button按钮

最近做项目遇到Viewpager+Fragment滑动页面,要监听子页面中的按钮,在网上查了些解决办法: 办法一: 这种方法是在适配器初始化中进行监听,有人亲测通过,但是我继承FragmentPagerAdapter,未果. @Override public Object instantiateItem(final View view, int position) { switch (position) { case 0: btnKnowledge = (Button)mListViews.ge

ViewPager的基本使用--可左右循环切换也可自动切换

ViewPager也算是Android自带的常用控件之一,但是有可能会无法直接调用,所以只需要将工程目录里/libs/android-support-v4.jar该jarAdd to Build Path就可以了. 先来看看效果图吧:                                                            一.首先完成布局文件: 从效果图可以分析出,整体的布局为一个RelativeLayout布局,上面是一个ViewPager,下面是一个Linear

Android系统在新进程中启动自定义服务过程(startService)的原理分析

在编写Android应用程序时,我们一般将一些计算型的逻辑放在一个独立的进程来处理,这样主进程仍然可以流畅地响应界面事件,提高用户体验.Android系统为我们提供了一个Service类,我们可以实现一个以Service为基类的服务子类,在里面实现自己的计算型逻辑,然后在主进程通过startService函数来启动这个服务.在本文中,将详细分析主进程是如何通过startService函数来在新进程中启动自定义服务的. 在主进程调用startService函数时,会通过Binder进程间通信机制来

高仿优酷Android客户端图片左右滑动(自动切换)

本例是用ViewPager去做的实现,支持自动滑动和手动滑动,不仅优酷网,实际上有很多商城和门户网站都有类似的实现: 具体思路: 1. 工程中需要添加android-support-v4.jar,才能使用ViewPager控件. 2. 图片的自动切换: 可使用Timer或者ScheduledExecutorService,这个有多重方式可以实现. 同时要切换底部的dots(园点) 3.Handler+Message机制更新UI,这个相信大家都很熟练,不再描述 4. 实现的一些细节:注意本例中的优

android UI之ViewPager多页面滑动效果

  viewPager实现引导页 ViewPager多页面滑动效果 1.Android的左右滑动在实际编程经常能用到,比如查看多张图片,左右 切换tab页. 2.自android 3.0之后的SDK中提供了android-support-V4包用以实现 版本兼容,让老版本系统下的应用通过加入jar包实现扩展,其中有一 个可以实现左右滑动的类ViewPager 今天我们就用ViewPager类来实现引导页的实战案例 实现功能: 1.实现ViewPager多页面滑动效果. 2.下方的显示当前

友盟页面统计 - 关于Viewpager中的Fragment的生命周期

Activity和Fragment各自理论上的生命周期 Activity的生命周期是较为经典也最清晰的.在此不表: Fragment从出现到广泛运用也有一段时间了.其标准生命周期也仅比Activity多出一些流程,如onCreateView(); Activity和Fragment在实际编码中必然是结合出现的,表现为Activity作为容器,装载有一个或若干个Fragment: 装载多个Fragment时,常常使用TabHost和Viewpager作为载体: 在实际编码中发现,Activity和

Android开发之使用ViewPager做引导页面

引导页面相信大家都不会陌生,安装了一个新的App后第一次打开,都会有类似下图,相当于说明文档 实现效果 程序目录结构 在主layout里main.xml定义一个帧布局,在viewPager上有多少页就显示多少个点 <?xml version="1.0" encoding="utf-8"?> <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"