您的位置:首页 > 移动开发 > Android开发

Android 滑动切换(首页展示,图片、新闻自动切换,循环切换,自动和手动)

2014-01-22 10:56 459 查看
最近做的项目,要用到滑动切换的效果,就是类似新闻客户端的图片一张一张的自动切换或者手动滑动切换,于是就搜集了一下资料,使用两种方式实现这样的效果,分别是ViewFlipper和ViewPager。这两种方式都比较容易的实现了手势滑动,但是ViewFlipper更容易实现循环滑动切换。

啥都先不说了,看看效果图











下面我们赶快进去到代码里面去吧!

1. ViewFlipper是继承至FrameLayout的,所以它是一个Layout里面可以放置多个View。实现两种样式,第一种样式.类似新闻客户端中图片自动手动滑动切换 ,第二种样式.整个布局手动滑动切换 接下来就分别实现这两种样式,第一种样式.类似新闻客户端中图片自动手动滑动切换
public class MyViewFlipperFirst extends Activity implements OnTouchListener {
	private ViewFlipper myViewFlipper;
	private TextView tvMessage;
	private String[] titles; // 图片标题
	private int[] imageResId; // 图片ID
	private RadioGroup mTopPage;
	private volatile boolean interrupt = false;//设置线程的中断标志位
	public static final int ADV_WHAT = 1;
	Thread mBannerThread;// 定义线程
	private float mDx = 0f;
	private final int lengh = 5; //切换的总长度
	private final Handler handler = new Handler();
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		setContentView(R.layout.viewflipper_one); // 加载布局
		myViewFlipper = (ViewFlipper) findViewById(R.id.viewflipper_one);
		mTopPage = (RadioGroup) findViewById(R.id.top_page);
		tvMessage = (TextView) findViewById(R.id.tv_message);
		imageResId = new int[] { R.drawable.a, R.drawable.b, R.drawable.c,
				R.drawable.d, R.drawable.e };// 加载数据
		titles = new String[lengh];
		titles[0] = "巩俐不低俗,我就不能低俗";
		titles[1] = "扑树又回来啦!再唱经典老歌引万人大合唱";
		titles[2] = "揭秘北京电影如何升级";
		titles[3] = "乐视网TV版大派送";
		titles[4] = "热血屌丝的反杀";
		myViewFlipper.setOnTouchListener(this);// 注册触摸事件
		showAdvertisementBanner();// 加载切换数据
	}

	@Override
	public boolean onTouch(View v, MotionEvent event) {
		// TODO Auto-generated method stub
		switch (event.getAction()) {
		case MotionEvent.ACTION_DOWN:
			mDx = event.getX();
			return true;
		case MotionEvent.ACTION_MOVE:
			return true;
		case MotionEvent.ACTION_UP:
			float dx = event.getX();
			float x = dx - mDx;
			mDx = 0f;
                // 判断是向左还是向右滑动
			if (x > 0) {
                // 向右滑动
				showPrev();
			} else {
                // 向左滑动
				showNext();
			}
			return true;
		default:
			break;
		}
		return false;
	}

	// 广告
	private void showAdvertisementBanner() {
		myViewFlipper.removeAllViews(); // 清除原始数据
		mTopPage.removeAllViews();// 清除原始数据
		LayoutParams lp = new LayoutParams(LayoutParams.FILL_PARENT,
				LayoutParams.FILL_PARENT);
          // 给myViewFlipper中加入图片组件(动态添加组件)
		for (int i = 0; i < lengh; i++) {
			ImageView child = new ImageView(this);
			child.setLayoutParams(lp);
			child.setScaleType(ScaleType.FIT_XY);
			child.setBackgroundResource(imageResId[i]);
			myViewFlipper.addView(child);
		}
		LayoutParams lpDot = new LayoutParams(25, 25);
           // 给mTopPage中加入圆点
		for (int j = 0; j < lengh; j++) {
			RadioButton dot = new RadioButton(this);
			dot.setButtonDrawable(R.drawable.res_radio_home_page);
			dot.setGravity(Gravity.CENTER);
			dot.setLayoutParams(lpDot);
			dot.setEllipsize(TruncateAt.MARQUEE);
			dot.setPadding(0, 0, 0, 0);
			mTopPage.addView(dot);
		}
         // 初始化数据
		changeshowNextBanner(0);
		showMessage(0);
		mBannerThread = new Thread(
				new AdvBannerRunnable());
		mBannerThread.start();// 启动线程
	}

	// 启动线程
	private class AdvBannerRunnable implements Runnable {
		@Override
		public void run() {
			Looper.prepare();
			Thread.currentThread();
			while (!interrupt) {
				try {
					Thread.sleep(2000);// 休眠2秒,切换下一张
					Message msg = new Message();
					msg.what = ADV_WHAT;
					handler.post(new Runnable() {
						public void run() {
							showNext();
						}
					});
				} catch (InterruptedException e) {
				}
			}
		}
	}

	// 下一张
	private void showNext() {
		if (myViewFlipper.getChildCount() <= 1) {
			return;
		}
                // 进入进出动画
		int in = R.anim.push_left_in;
		int out = R.anim.push_left_out;
		myViewFlipper.setInAnimation(AnimationUtils.loadAnimation(this, in));
		myViewFlipper.setOutAnimation(AnimationUtils.loadAnimation(this, out));
		myViewFlipper.showNext();//myViewFlipper自带的方法,调用下一张
		changeshowNextBanner(myViewFlipper.getDisplayedChild());
		showMessage(myViewFlipper.getDisplayedChild());
	}

	// 前一张
	private void showPrev() {
		if (myViewFlipper.getChildCount() <= 1) {
			return;
		}
                // 进入进出动画
		int in = R.anim.push_right_in;
		int out = R.anim.push_right_out;
		myViewFlipper.setInAnimation(AnimationUtils.loadAnimation(this, in));
		myViewFlipper.setOutAnimation(AnimationUtils.loadAnimation(this, out));
		myViewFlipper.showPrevious();////myViewFlipper自带的方法,调用前一张
		changeshowNextBanner(myViewFlipper.getDisplayedChild());
		showMessage(myViewFlipper.getDisplayedChild());
	}

	// 显示文字
	private void showMessage(int position) {
		tvMessage.setText(titles[position]);
	}

	// 改变圆点的状态
	private void changeshowNextBanner(int position) {
		RadioButton page = (RadioButton) mTopPage.getChildAt(position);
		if (page == null) {
			return;
		}
		page.setChecked(true);
	}
}
第二种样式.整个布局手动滑动切换
public class MyViewFlipperSecond extends Activity implements OnGestureListener,
OnTouchListener {
	private ViewFlipper myViewFlipper;
	private GestureDetector myGestureDetector;
	private TextView tvMessage;
	private ImageView im_pic;
	private String[] titles; // 图片标题
	private int[] imageResId; // 图片ID
	private RadioGroup mTopPage;
	private ImageView imageView;
	private ImageView[] imageViews;//圆点
	private final int lengh = 6;//切换的总长度
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		setContentView(R.layout.viewflipper_two);//加载布局
		myViewFlipper = (ViewFlipper) findViewById(R.id.myViewFlipper);
		mTopPage = (RadioGroup) findViewById(R.id.top_page1);
		LayoutInflater factory = LayoutInflater.from(MyViewFlipperSecond.this);
		imageResId = new int[] { R.drawable.feature_guide_0,
				R.drawable.feature_guide_1, R.drawable.feature_guide_2,
				R.drawable.feature_guide_3, R.drawable.feature_guide_4,
				R.drawable.feature_guide_5 };
		titles = new String[imageResId.length];
		titles[0] = "随着Windows Phone逐步渗入中国智能手机市场,Windows Phone作为移动操作平台的新锐,自然不会失宠。Windows Phone 7在中国没有流行的原因,很大程度上是因为在中国并没有上市。现在,诺基亚和微软宣布达成紧密战略合作之后,沉寂许久的Windows Phone操作系统再次走入了人们关注的视野,成了移动应用开发者继iOS和Android之外的另一选择。";
		titles[1] = "好友曾向我展示了最新的iPhone和iPad版《极品飞车》。游戏的渲染效果令人印象深刻,是款蓄势待发的优秀游戏。但是,游戏的前端是典型的UI设计偏差案例。但界面中有大量的属性数据等内容,它在玩家没有时间做决定时提供了过多的内容。这些内容能够显著改变他们的游戏体验,但却在玩家往往感受不到变化的时候呈现。";
		titles[2] = "3月31日,第四届CocoaChina游戏开发者大会暨Cocos2D-X技术研讨会在北京举行。来自全世界的移动互联网精英在此交流经验、相互学习。同时这次我们有幸也采访到了CocoaChina的CEO陈昊芝先生。他将为我们揭秘苹果新榜单的算法秘密,并未我们带来捕鱼达人成功的推广经验,对微软Windows Phone平台的吐槽和对未来3D技术趋势的前瞻。";
		titles[3] = "北京时间4月1日消息,谷歌虽然一直以来都在地图产品上提供和完善各种各样的系统接口,但是迄今为止却一直忽略了广受欢迎的NES游戏。然而也就是今天搜索巨头谷歌利用愚人节的机会,“调皮”地推出流行的NES八位地图产品。";
		titles[4] = "在NASA和美国国家地理的参与下,这群小鸟摆脱了地球引力,跑到了太空,这就是即将在2012年3月22日公测的《愤怒的小鸟:太空版》。为了让小鸟们成功解救出它们珍贵的“无价之蛋”,美国国家地理为此出版了一本书,来提供完成任务所需的关于行星、卫星、银河系等关于外太空的知识,并将于3月20日开始发售";
		titles[5] = "Google搜索引擎已经赢得全球范围的赞誉,而这一切都要归功于Google开创性的MapReduce。Google搜索引擎算法只是其搜索引擎的一部分,在后台支持Google算法的基础设施才是真正的幕后英雄,其基础设施可快速的索引链接成千上万台普通服务器。MapReduce的成功也直接推动了Hadoop的发展。";
//加载切换的内容
		for (int i = 0; i < lengh; i++) {
			View view = factory.inflate(R.layout.item01, null);
			tvMessage = (TextView) view.findViewById(R.id.tv1_message);
			im_pic = (ImageView) view.findViewById(R.id.im1_pic);
			tvMessage.setText(titles[i]);
			im_pic.setBackgroundResource(imageResId[i]);
			myViewFlipper.addView(view);
		}
		imageViews = new ImageView[lengh];
//加载圆点
		for (int i = 0; i < lengh; i++) {
			imageView = new ImageView(MyViewFlipperSecond.this);
			imageView.setLayoutParams(new LayoutParams(20, 20));
			imageView.setPadding(20, 0, 20, 0);
			imageViews[i] = imageView;
			if (i == 0) {
				// 默认选中第一张图片
				imageViews[i]
						.setBackgroundResource(R.drawable.page_indicator_focused);
			} else {
				imageViews[i].setBackgroundResource(R.drawable.page_indicator);
			}
			mTopPage.addView(imageViews[i]);
		}
		changeshowBannerPage(0);
		myGestureDetector = new GestureDetector(this);
		myViewFlipper.setOnTouchListener(this);
		myViewFlipper.setLongClickable(true);
	}

	@Override
	public boolean onTouch(View v, MotionEvent event) {
		// TODO Auto-generated method stub
		return myGestureDetector.onTouchEvent(event);
	}

	@Override
	public boolean onDown(MotionEvent e) {
		// TODO Auto-generated method stub
		return false;
	}

	@Override
	public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
			float velocityY) {
		// TODO Auto-generated method stub
		// 按下时的横坐标大于放开时的横坐标,从右向左滑动
		if (e1.getX() > e2.getX()) {
			showAdvertisementNext();
		}
		// 按下时的横坐标小于放开时的横坐标,从左向右滑动
		else if (e1.getX() < e2.getX()) {
			showPrev();
		}
		return false;
	}

	@Override
	public void onLongPress(MotionEvent e) {
		// TODO Auto-generated method stub

	}

	@Override
	public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX,
			float distanceY) {
		// TODO Auto-generated method stub
		return false;
	}

	@Override
	public void onShowPress(MotionEvent e) {
		// TODO Auto-generated method stub

	}

	@Override
	public boolean onSingleTapUp(MotionEvent e) {
		// TODO Auto-generated method stub
		return false;
	}

	private void showPrev() {
		if (myViewFlipper.getChildCount() <= 1) {
			return;
		}
		int in = R.anim.push_right_in;
		int out = R.anim.push_right_out;
		myViewFlipper.setInAnimation(AnimationUtils.loadAnimation(this, in));
		myViewFlipper.setOutAnimation(AnimationUtils.loadAnimation(this, out));
		myViewFlipper.showPrevious();
		changeshowBannerPage(myViewFlipper.getDisplayedChild());
	}

	private void showAdvertisementNext() {
		if (myViewFlipper.getChildCount() <= 1) {
			return;
		}
		int in = R.anim.push_left_in;
		int out = R.anim.push_left_out;
		myViewFlipper.setInAnimation(AnimationUtils.loadAnimation(this, in));
		myViewFlipper.setOutAnimation(AnimationUtils.loadAnimation(this, out));
		myViewFlipper.showNext();
		changeshowBannerPage(myViewFlipper.getDisplayedChild());
	}
	// 改变状态
		private void changeshowBannerPage(int position) {
			for (int i = 0; i < imageViews.length; i++) {
				imageViews[position]
						.setBackgroundResource(R.drawable.page_indicator_focused);
				if (position != i) {
					imageViews[i]
							.setBackgroundResource(R.drawable.page_indicator);
				}
			}
		}
}


2. ViewPager用于实现多页面的切换效果,该类存在于Google的兼容包里面,所以在引用时记得在BuilldPath中加入“android-support-v4.jar”,这里还是实现了两种样式的滑动,类似新闻客户端中图片自动手动滑动切换和整个布局手动滑动切换接下来就具体看看是如何实现这两种样式,第一种样式.类似新闻客户端中图片自动手动滑动切换
public class MyViewPagerFirst extends Activity {
	private ViewPager viewPager; // android-support-v4中的滑动组件
	private List<imageview> imageViews; // 滑动的图片集合
	private String[] titles; // 图片标题
	private int[] imageResId; // 图片ID
	private List<view> dots; // 图片标题正文的那些点
	private TextView tv_title;
	private int currentItem = 0; // 当前图片的索引号
	private ScheduledExecutorService scheduledExecutorService;

	// 切换当前显示的图片
	private Handler handler = new Handler() {
		public void handleMessage(android.os.Message msg) {
			viewPager.setCurrentItem(currentItem);// 切换当前显示的图片
		};
	};
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		setContentView(R.layout.viewpager_one);
		imageResId = new int[] { R.drawable.a, R.drawable.b, R.drawable.c, R.drawable.d, R.drawable.e };
		titles = new String[imageResId.length];
		titles[0] = "巩俐不低俗,我就不能低俗";
		titles[1] = "扑树又回来啦!再唱经典老歌引万人大合唱";
		titles[2] = "揭秘北京电影如何升级";
		titles[3] = "乐视网TV版大派送";
		titles[4] = "热血屌丝的反杀";
		imageViews = new ArrayList<imageview>();
		// 初始化图片资源
		for (int i = 0; i < imageResId.length; i++) {
			ImageView imageView = new ImageView(this);
			imageView.setImageResource(imageResId[i]);
			imageView.setScaleType(ScaleType.CENTER_CROP);
			imageViews.add(imageView);
		}
		dots = new ArrayList<view>();
		dots.add(findViewById(R.id.v_dot0));
		dots.add(findViewById(R.id.v_dot1));
		dots.add(findViewById(R.id.v_dot2));
		dots.add(findViewById(R.id.v_dot3));
		dots.add(findViewById(R.id.v_dot4));
		tv_title = (TextView) findViewById(R.id.tv_title);
		tv_title.setText(titles[0]);//
		viewPager = (ViewPager) findViewById(R.id.vp);
		viewPager.setAdapter(new MyAdapter());// 设置填充ViewPager页面的适配器
		// 设置一个监听器,当ViewPager中的页面改变时调用
		viewPager.setOnPageChangeListener(new MyPageChangeListener());
	}
	@Override
	protected void onStart() {
		scheduledExecutorService = Executors.newSingleThreadScheduledExecutor();
		// 当Activity显示出来后,每两秒钟切换一次图片显示
		scheduledExecutorService.scheduleAtFixedRate(new ScrollTask(), 1, 2, TimeUnit.SECONDS);
		super.onStart();
	}

	@Override
	protected void onStop() {
		// 当Activity不可见的时候停止切换
		scheduledExecutorService.shutdown();
		super.onStop();
	}

	/**
	 * 换行切换任务
	 * 
	 * @author Administrator
	 * 
	 */
	private class ScrollTask implements Runnable {

		public void run() {
			synchronized (viewPager) {
				System.out.println("currentItem: " + currentItem);
				currentItem = (currentItem + 1) % imageViews.size();
				handler.obtainMessage().sendToTarget(); // 通过Handler切换图片
			}
		}

	}

	/**
	 * 当ViewPager中页面的状态发生改变时调用
	 * 
	 * @author Administrator
	 * 
	 */
	private class MyPageChangeListener implements OnPageChangeListener {
		private int oldPosition = 0;

		/**
		 * This method will be invoked when a new page becomes selected.
		 * position: Position index of the new selected page.
		 */
		public void onPageSelected(int position) {
			currentItem = position;
			tv_title.setText(titles[position]);
			dots.get(oldPosition).setBackgroundResource(R.drawable.dot_normal);
			dots.get(position).setBackgroundResource(R.drawable.dot_focused);
			oldPosition = position;
		}

		public void onPageScrollStateChanged(int arg0) {

		}

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

		}
	}

	/**
	 * 填充ViewPager页面的适配器
	 * 
	 * @author Administrator
	 * 
	 */
	private class MyAdapter extends PagerAdapter {

		@Override
		public int getCount() {
			return imageResId.length;
		}

		@Override
		public Object instantiateItem(View arg0, int arg1) {
			((ViewPager) arg0).addView(imageViews.get(arg1));
			return imageViews.get(arg1);
		}

		@Override
		public void destroyItem(View arg0, int arg1, Object arg2) {
			((ViewPager) arg0).removeView((View) arg2);
		}

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

		@Override
		public void restoreState(Parcelable arg0, ClassLoader arg1) {

		}

		@Override
		public Parcelable saveState() {
			return null;
		}

		@Override
		public void startUpdate(View arg0) {

		}

		@Override
		public void finishUpdate(View arg0) {

		}
	}
}
第二种样式.整个布局手动滑动切换
public class MyViewPagerSecond extends Activity {
	private ViewPager viewPager;
	private ArrayList<view> pageViews;
	private ImageView imageView;
	private ImageView im_pic;
	private TextView tvMessage;
	private ImageView[] imageViews;
	// 包裹滑动图片LinearLayout
	private ViewGroup main;
	// 包裹小圆点的LinearLayout
	private ViewGroup group;
	private String[] titles; // 图片标题
	private int[] imageResId; // 图片ID

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);

		// setContentView(R.layout.viewpager_two);
		// 设置无标题窗口
		requestWindowFeature(Window.FEATURE_NO_TITLE);
		imageResId = new int[] { R.drawable.feature_guide_0,
				R.drawable.feature_guide_1, R.drawable.feature_guide_2,
				R.drawable.feature_guide_3, R.drawable.feature_guide_4,
				R.drawable.feature_guide_5 };
		titles = new String[imageResId.length];
		titles[0] = "随着Windows Phone逐步渗入中国智能手机市场,Windows Phone作为移动操作平台的新锐,自然不会失宠。Windows Phone 7在中国没有流行的原因,很大程度上是因为在中国并没有上市。现在,诺基亚和微软宣布达成紧密战略合作之后,沉寂许久的Windows Phone操作系统再次走入了人们关注的视野,成了移动应用开发者继iOS和Android之外的另一选择。";
		titles[1] = "好友曾向我展示了最新的iPhone和iPad版《极品飞车》。游戏的渲染效果令人印象深刻,是款蓄势待发的优秀游戏。但是,游戏的前端是典型的UI设计偏差案例。但界面中有大量的属性数据等内容,它在玩家没有时间做决定时提供了过多的内容。这些内容能够显著改变他们的游戏体验,但却在玩家往往感受不到变化的时候呈现。";
		titles[2] = "3月31日,第四届CocoaChina游戏开发者大会暨Cocos2D-X技术研讨会在北京举行。来自全世界的移动互联网精英在此交流经验、相互学习。同时这次我们有幸也采访到了CocoaChina的CEO陈昊芝先生。他将为我们揭秘苹果新榜单的算法秘密,并未我们带来捕鱼达人成功的推广经验,对微软Windows Phone平台的吐槽和对未来3D技术趋势的前瞻。";
		titles[3] = "北京时间4月1日消息,谷歌虽然一直以来都在地图产品上提供和完善各种各样的系统接口,但是迄今为止却一直忽略了广受欢迎的NES游戏。然而也就是今天搜索巨头谷歌利用愚人节的机会,“调皮”地推出流行的NES八位地图产品。";
		titles[4] = "在NASA和美国国家地理的参与下,这群小鸟摆脱了地球引力,跑到了太空,这就是即将在2012年3月22日公测的《愤怒的小鸟:太空版》。为了让小鸟们成功解救出它们珍贵的“无价之蛋”,美国国家地理为此出版了一本书,来提供完成任务所需的关于行星、卫星、银河系等关于外太空的知识,并将于3月20日开始发售";
		titles[5] = "Google搜索引擎已经赢得全球范围的赞誉,而这一切都要归功于Google开创性的MapReduce。Google搜索引擎算法只是其搜索引擎的一部分,在后台支持Google算法的基础设施才是真正的幕后英雄,其基础设施可快速的索引链接成千上万台普通服务器。MapReduce的成功也直接推动了Hadoop的发展。";
		LayoutInflater inflater = getLayoutInflater();
		pageViews = new ArrayList<view>();
		for (int i = 0; i < 6; i++) {
			View view = inflater.inflate(R.layout.item01, null);
			tvMessage = (TextView) view.findViewById(R.id.tv1_message);
			im_pic = (ImageView) view.findViewById(R.id.im1_pic);
			tvMessage.setText(titles[i]);
			im_pic.setBackgroundResource(imageResId[i]);
			pageViews.add(view);
		}
		main = (ViewGroup) inflater.inflate(R.layout.viewpager_two, null);
		group = (ViewGroup) main.findViewById(R.id.viewGroup);
		viewPager = (ViewPager) main.findViewById(R.id.guidePages);
		imageViews = new ImageView[pageViews.size()];
		for (int i = 0; i < pageViews.size(); i++) {
			imageView = new ImageView(MyViewPagerSecond.this);
			imageView.setLayoutParams(new LayoutParams(20, 20));
			imageView.setPadding(20, 0, 20, 0);
			imageViews[i] = imageView;
			if (i == 0) {
				// 默认选中第一张图片
				imageViews[i]
						.setBackgroundResource(R.drawable.page_indicator_focused);
			} else {
				imageViews[i].setBackgroundResource(R.drawable.page_indicator);
			}
			group.addView(imageViews[i]);
		}
		setContentView(main);
		viewPager.setAdapter(new GuidePageAdapter());
		viewPager.setOnPageChangeListener(new GuidePageChangeListener());
	}

	// 指引页面数据适配器
	class GuidePageAdapter extends PagerAdapter {

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

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

		@Override
		public int getItemPosition(Object object) {
			// TODO Auto-generated method stub
			return super.getItemPosition(object);
		}

		@Override
		public void destroyItem(View arg0, int arg1, Object arg2) {
			// TODO Auto-generated method stub
			((ViewPager) arg0).removeView(pageViews.get(arg1));
		}

		@Override
		public Object instantiateItem(View arg0, int arg1) {
			// TODO Auto-generated method stub
			((ViewPager) arg0).addView(pageViews.get(arg1));
			return pageViews.get(arg1);
		}

		@Override
		public void restoreState(Parcelable arg0, ClassLoader arg1) {
			// TODO Auto-generated method stub

		}

		@Override
		public Parcelable saveState() {
			// TODO Auto-generated method stub
			return null;
		}

		@Override
		public void startUpdate(View arg0) {
			// TODO Auto-generated method stub

		}

		@Override
		public void finishUpdate(View arg0) {
			// TODO Auto-generated method stub

		}
	}

	// 指引页面更改事件监听器
	class GuidePageChangeListener implements OnPageChangeListener {

		@Override
		public void onPageScrollStateChanged(int arg0) {
			// TODO Auto-generated method stub

		}

		@Override
		public void onPageScrolled(int arg0, float arg1, int arg2) {
			// TODO Auto-generated method stub

		}

		@Override
		public void onPageSelected(int arg0) {
			for (int i = 0; i < imageViews.length; i++) {
				imageViews[arg0]
						.setBackgroundResource(R.drawable.page_indicator_focused);

				if (arg0 != i) {
					imageViews[i]
							.setBackgroundResource(R.drawable.page_indicator);
				}
			}
		}
	}
}
以上就是具体实现滑动切换的主类,Demo里面用到的布局、图片资源都放在下载里面去了,用到的朋友欢迎下载!第一次写博客,有许多问题,望大家见谅。有什么问题请留言!

PS 在实际的项目中可能会遇到滑动的界面里面有ScrollView,那按照上面的方法,左右滑动和上下滑动就冲突了,解决办法如下:首先自定义一个ScrollView
public class MyScrollView extends ScrollView {
	GestureDetector gestureDetector;

	public MyScrollView(Context context) {
		super(context);
		// TODO Auto-generated constructor stub
	}

	public MyScrollView(Context context, AttributeSet attrs) {
		super(context, attrs);
		// TODO Auto-generated constructor stub
	}

	public MyScrollView(Context context, AttributeSet attrs, int defStyle) {
		super(context, attrs, defStyle);
		// TODO Auto-generated constructor stub
	}

	public void setGestureDetector(GestureDetector gestureDetector) {
		this.gestureDetector = gestureDetector;
	}

	@Override
	public boolean onTouchEvent(MotionEvent event) {
		super.onTouchEvent(event);
		return gestureDetector.onTouchEvent(event);//将当前的手势返回到当前的手势监听器中,以触发相应手势处理事件
	}

	@Override
	public boolean dispatchTouchEvent(MotionEvent ev) {
		gestureDetector.onTouchEvent(ev);
		super.dispatchTouchEvent(ev);
		return true;
	}
}
接着定义一个界面类MyViewFlipperThird
public class MyViewFlipperThird extends Activity {
	private ViewFlipper myViewFlipper;
	private GestureDetector myGestureDetector;
	private TextView tvMessage;
	private ImageView im_pic;
	private String[] titles; // 图片标题
	private int[] imageResId; // 图片ID
	private RadioGroup mTopPage;
	private ImageView imageView;
	private ImageView[] imageViews;
	private final int lengh = 4;
	LayoutInflater inflater;
	private MyScrollView myScrollView = null;
	private int selectedPosition = 0;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		setContentView(R.layout.viewflipper_two);
		myViewFlipper = (ViewFlipper) findViewById(R.id.myViewFlipper);
		mTopPage = (RadioGroup) findViewById(R.id.top_page1);
		imageResId = new int[] { R.drawable.meinv1, R.drawable.meinv2,
				R.drawable.meinv3, R.drawable.meinv4 };
		titles = new String[imageResId.length];
		titles[0] = "PayPal基于Hadoop的文本挖掘系统是公司内各种数据科学活动的关键组成部分,这些数据科学活动包括预测建模、情绪分析、影响力评级、简历排名还有主题建模和聚类分析。Ambati说:如果没有仪表盘程序,这些文本本身不存在任何额外的价值,不过这些文本可以与我们的其他数据结合起来使用,而且有一些公司或许会需要这些数据进行更多的预测建模,"
				+ "该公司使用NLP(自然语言处理)算法从交易过程的谈话数据中提取有价值的信息,提高商户交易的成功率。"
				+ "然而PayPal没有采用Netflix那种直接的推荐方式。Netflix通过四或五星级评级标识用户的偏好,然后采用商品推荐系统向用户推荐商品。但Ambati指出,事实上,用户购买某种商品并不能说明用户喜欢这个商品,Netflix的方式存在问题。"
				+ "当消费者浏览商户的商品时,我们事实上并不知道消费者是否对商户有好感,因为有可能消费者只是对品牌或者商品感兴趣,所以我们进行文本挖掘,分析产品信息以了解消费者是否对某种品牌感兴趣,然后再进行商品推荐。";
		titles[1] = "Android逆向助手是一功能强大的逆向辅助软件。该软件可以帮助用户来进行apk反编译打包签名;dex/jar互转替换提取修复;so反编译;xml、txt加密;字符串编码等等,操作简单,只需要直接将文件拖放到源和目标文件。"
				+ "android逆向工程 问题说明:1.没有完整的动态调试程序。目前由于android系统的bionic并不完全支持POSIX,导致现有编译的gdb不支持多线程无符号调试。(我实验了一下,的确多线程问题比较多,当然,gdb本身也有问题)。所以对于NDK逆向工程比较麻烦,以静态分析为主。2.手机本身种类较多,而且android版本繁多,更新较快,增加了逆向的难度。但是android系统自身也有好处:1.手机系统的简化工作让分析也随着简化 2.公开源代码 大不了我修改系统API编译系统来进行API hook。谁也拦不住。(android不支持LD_Library API hook)";
		titles[2] = "cocos2d-x是一个支持多平台的 2D 手机游戏引擎,使用 C++ 开发,基于OpenGL ES,支持 WOPhone, iOS 4.1, Android 2.1 及更高版本,WindowsXP & Windows7,WindowsPhone 8"
				+ "Cocos2d-x是一个开源的移动2D游戏框架,MIT许可证下发布的。这是一个C++的版本。Cocos2d-x项目可以很容易地建立和运行iOS,我们可以编写的源代码很容易在桌面操作系统中编辑和调试。"
				+ "cocos2d-x的主要特效包括跨平台性、免费开源性、活跃社区支持等,这些特性使得开发人员可以容易,高效和低成本开发出用户喜欢的移动平台游戏。跨平台性主要包括,其可以开发基于IOS ANDROID WINDOWS BADA 等平台的游戏,免费开源指的是,cocos2d-x的开源与众多的工具和文档让开发者学习起来更加的轻松容易,活跃的社区支持是指,现在cocos2d-x通过这么多年的发展,使得这个开源项目更加的强壮与稳定,所有的BUG跟缺陷都可以很快的发现,并进行修复,很多大型的公司的工程师都投入到了cocos2d-x的开发";
		titles[3] = "北京时间4月1日消息,谷歌虽然一直以来都在地图产品上提供和完善各种各样的系统接口,但是迄今为止却一直忽略了广受欢迎的NES游戏。然而也就是今天搜索巨头谷歌利用愚人节的机会,“调皮”地推出流行的NES八位地图产品。"
				+ "在NASA和美国国家地理的参与下,这群小鸟摆脱了地球引力,跑到了太空,这就是即将在2012年3月22日公测的《愤怒的小鸟:太空版》。为了让小鸟们成功解救出它们珍贵的“无价之蛋”,美国国家地理为此出版了一本书,来提供完成任务所需的关于行星、卫星、银河系等关于外太空的知识,并将于3月20日开始发售"
				+ "Google搜索引擎已经赢得全球范围的赞誉,而这一切都要归功于Google开创性的MapReduce。Google搜索引擎算法只是其搜索引擎的一部分,在后台支持Google算法的基础设施才是真正的幕后英雄,其基础设施可快速的索引链接成千上万台普通服务器。MapReduce的成功也直接推动了Hadoop的发展。";
		imageViews = new ImageView[lengh];
		for (int i = 0; i < lengh; i++) {
			imageView = new ImageView(MyViewFlipperThird.this);
			imageView.setLayoutParams(new LayoutParams(20, 20));
			imageView.setPadding(20, 0, 20, 0);
			imageViews[i] = imageView;
			if (i == 0) {
				// 默认选中第一张图片
				imageViews[i]
						.setBackgroundResource(R.drawable.page_indicator_focused);
			} else {
				imageViews[i].setBackgroundResource(R.drawable.page_indicator);
			}
			mTopPage.addView(imageViews[i]);
		}
		myGestureDetector = new GestureDetector(new CommonGestureListener());
		myViewFlipper.addView(getContentView(selectedPosition));// 设置初始页面
		changeshowBannerPage(selectedPosition);// 设置底部圆点
	}

	// 加载布局
	private View getContentView(int i) {
		inflater = getLayoutInflater();
		View view = inflater.inflate(R.layout.item02, null);
		tvMessage = (TextView) view.findViewById(R.id.tv1_message);
		im_pic = (ImageView) view.findViewById(R.id.im1_pic);
		myScrollView = (MyScrollView) view.findViewById(R.id.myscrollview);
		tvMessage.setText(titles[i]);
		im_pic.setBackgroundResource(imageResId[i]);
		myScrollView.setOnTouchListener(onTouchListener);
		myScrollView.setGestureDetector(myGestureDetector);
		return view;
	}

	// 上一张
	private void showPrev() {
		if (myViewFlipper.getChildCount() <= 1) {
			return;
		}
		int in = R.anim.push_right_in;
		int out = R.anim.push_right_out;
		myViewFlipper.setInAnimation(AnimationUtils.loadAnimation(this, in));
		myViewFlipper.setOutAnimation(AnimationUtils.loadAnimation(this, out));
		myViewFlipper.showPrevious();
		changeshowBannerPage(selectedPosition);
	}

	// 下一张
	private void showAdvertisementNext() {
		if (myViewFlipper.getChildCount() <= 1) {
			return;
		}
		int in = R.anim.push_left_in;
		int out = R.anim.push_left_out;
		myViewFlipper.setInAnimation(AnimationUtils.loadAnimation(this, in));
		myViewFlipper.setOutAnimation(AnimationUtils.loadAnimation(this, out));
		myViewFlipper.showNext();
		changeshowBannerPage(selectedPosition);
	}

	// 改变状态
	private void changeshowBannerPage(int position) {
		for (int i = 0; i < imageViews.length; i++) {
			imageViews[position]
					.setBackgroundResource(R.drawable.page_indicator_focused);
			if (position != i) {
				imageViews[i].setBackgroundResource(R.drawable.page_indicator);
			}
		}
	}

	// 触摸事件
	private View.OnTouchListener onTouchListener = new View.OnTouchListener() {
		public boolean onTouch(View v, MotionEvent event) {
			// TODO Auto-generated method stub
			return myGestureDetector.onTouchEvent(event);
		}
	};

	// 手势监听器
	public class CommonGestureListener extends SimpleOnGestureListener {
		@Override
		public boolean onDown(MotionEvent e) {
			// TODO Auto-generated method stub
			return false;
		}

		@Override
		public void onShowPress(MotionEvent e) {
			// TODO Auto-generated method stub
			super.onShowPress(e);
		}

		@Override
		public void onLongPress(MotionEvent e) {
			// TODO Auto-generated method stub
		}

		@Override
		public boolean onSingleTapConfirmed(MotionEvent e) {
			// TODO Auto-generated method stub
			return false;
		}

		@Override
		public boolean onSingleTapUp(MotionEvent e) {
			// TODO Auto-generated method stub
			return false;
		}

		@Override
		public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
				float velocityY) {
			// e1是手指离开时的MotionEvent,e2是手指接触时的MotionEvent
			// TODO Auto-generated method stub
			if (e1.getX() - e2.getX() > 100 & Math.abs(velocityX) > 50) {
				// 向左
				selectedPosition = selectedPosition + 1 < lengh ? (selectedPosition + 1)
						: 0;
				myViewFlipper.addView(getContentView(selectedPosition));
				showAdvertisementNext();
				myViewFlipper.removeViewAt(0);
			} else if (e2.getX() - e1.getX() > 100 & Math.abs(velocityX) > 50) {
				// 向右
				selectedPosition = selectedPosition > 0 ? (selectedPosition - 1)
						: (lengh - 1);
				myViewFlipper.addView(getContentView(selectedPosition));
				showPrev();
				myViewFlipper.removeViewAt(0);
			}
			return true;
		}

		@Override
		public boolean onScroll(MotionEvent e1, MotionEvent e2,
				float distanceX, float distanceY) {
			// TODO Auto-generated method stub
			return super.onScroll(e1, e2, distanceX, distanceY);
		}
	}
}
下载地址
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐