HardBirch

viewFlipper简介及简单应用–滑动翻页功能

时间:12-04-01 栏目:安卓源码解析与小应用 作者:张飞不张,文采横飞 评论:5 点击: 3,418 次

       前两天使用到了ViewFlipper,把资料整理一下,以备后用,先看一下ViewFlipper类的继承关系:

java.lang.Object
android.view.View
         android.view.ViewGroup
                   android.widget.FrameLayout
                            android.widget.ViewAnimator
                                     android.widget.ViewFlipper


继承了FrameLayout和ViewAnimator,看下他的概述:

       Simple ViewAnimator that will animate between two or more views that have been added to it. Only one child is shown at a time. If requested, can automatically flip between each child at a regular interval.(被添加到ViewFlipper中的两个或两个以上的视图之间将执行一个简单的ViewAnimator动画。一次仅能显示一个子视图。如果需要,可以设置间隔时间使子视图像幻灯片一样自动显示。)。

       他主要的xml属性和公共方法:

       

属性名称

描述

android:autoStart

当设为true时,自动启动动画

此时必须是一个布尔值,属性值为truefalse

(对应于全局资源属性R.attr.autoStart

android:flipInterval

显示下一个视图的时间间隔

 

        

public bool isAutoStart ()
 如果视图显示到窗口上时会自动调用startFlipping()方法,则返回true

  public bool isFlipping()
  如果子视图正在切换,则返回true

  public bool setAutoStart (bool autoStart)
  设置视图显示到窗口上时是否会自动调用startFlipping()方法

  public bool setFlipInterval (int milliseconds)
  视图间切换的时间间隔
  参数 milliseconds    毫秒数

  public bool startFlipping ()
  开始在子视图间定时循环切换

  public bool stopFlipping ()
    停止切换                                                                                                                                                                                                                                                         

     

 setInAnimation()                                                                                                                                                                                                                         设置View进入屏幕时候使用的动画。该方法有两个重载方法,
    一个接受单个参数,类型为android.view.animation.Animation;
    一个接受两个参数,类型为Context和int,分别为Context对象和定义Animation的resourceID。
    即可以直接传入Animation对象,也可以传入定义的Animation文件的resourceID。
    setOutAnimation()                                                                                                                                                                                                                   设置View退出屏幕时候使用的动画。使用方法和setInAnimation方法一样。
    showNext()                                                                                                                                                                                                                         显示FrameLayout里面的下一个View。
    showPrevious()                               显示FrameLayout里面的上一个View。

 以上内容参考农民伯伯的博客:http://www.cnblogs.com/over140/archive/2010/12/06/1897439.html

      关于ViewFlipper的基本知识就先说那么多,下面看简单的一个小例子:

public class TestFlip extends Activity implements OnGestureListener {

	private ViewFlipper flipper;
	private GestureDetector detector;

	/** Called when the activity is first created. */
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		detector = new GestureDetector(this);
		flipper = (ViewFlipper) this.findViewById(R.id.ViewFlipper01);
		flipper.addView(addTextView("step 1"));
		flipper.addView(addTextView("step 2"));
		flipper.addView(addTextView("step 3"));
		flipper.addView(addTextView("step 4"));
		flipper.addView(addTextView("step 5"));
	}

	private View addTextView(String text) {
		TextView tv = new TextView(this);
		tv.setText(text);
		tv.setGravity(1);
		return tv;
	}

	@Override
	public boolean onTouchEvent(MotionEvent event) {
		return this.detector.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) {
		if (e1.getX() - e2.getX() > 120) {
			this.flipper.setInAnimation(AnimationUtils.loadAnimation(this, R.anim.push_left_in));
			this.flipper.setOutAnimation(AnimationUtils.loadAnimation(this, R.anim.push_left_out));
			this.flipper.showNext();
			return true;
		} else if (e1.getX() - e2.getX() < -120) {
			this.flipper.setInAnimation(AnimationUtils.loadAnimation(this, R.anim.push_right_in));
			this.flipper.setOutAnimation(AnimationUtils.loadAnimation(this, R.anim.push_right_out));
			this.flipper.showPrevious();
			return true;
		}
		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;
	}
}


      这个例子中,使用了很简单的动画效果,但是如果你想跳页呢?就是说下面有几个页面标记,点击进入相应的页面,如何实现呢?

public void switchLayoutStateTo(int switchTo) {
        while (mCurrentLayoutState != switchTo) {
            if (mCurrentLayoutState > switchTo) {
                mCurrentLayoutState--;
                this.flipper.setInAnimation(AnimationUtils.loadAnimation(this, R.anim.push_right_in));
		this.flipper.setOutAnimation(AnimationUtils.loadAnimation(this, R.anim.push_right_out));
		this.flipper.showPrevious();

} else { mCurrentLayoutState++; this.flipper.setInAnimation(AnimationUtils.loadAnimation(this, R.anim.push_left_in));

		this.flipper.setOutAnimation(AnimationUtils.loadAnimation(this, R.anim.push_left_out));
		this.flipper.showNext();

} } ; }
mCrrentLayoutStates是当前页数。

       然后,重要的应该是GestureDetector这个手势类,该类可以检测各种手势事件,有两个回调接口分别用来通知具体的事件:

       GestureDetector.OnDoubleTapListener:用来通知DoubleTap事件,类似于鼠标的双击事件,该接口有如下三个回调函数:

     

1.   onDoubleTap(MotionEvent e):通知DoubleTap手势,
2.   onDoubleTapEvent(MotionEvent e):通知DoubleTap手势中的事件,包含down、up和move事件(这里指的是在双击之间发生的事件,例如在同一个地方双击会产生DoubleTap手势,而在DoubleTap手势里面还会发生down和up事件,这两个事件由该函数通知);
3.   onSingleTapConfirmed(MotionEvent e):用来判定该次点击是SingleTap而不是DoubleTap,如果连续点击两次就是DoubleTap手势,如果只点击一次,OPhone系统等待一段时间后没有收到第二次点击则判定该次点击为SingleTap而不是DoubleTap,然后触发SingleTapConfirmed事件。

      

       GestureDetector.OnGestureListener:用来通知普通的手势事件,该接口有如下六个回调函数:

1.   onDown(MotionEvent e):down事件;
2.   onSingleTapUp(MotionEvent e):一次点击up事件;
3.   onShowPress(MotionEvent e):down事件发生而move或则up还没发生前触发该事件;
4.   onLongPress(MotionEvent e):长按事件;
5.   onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY):滑动手势事件;
6.   onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY):在屏幕上拖动事件。


       我们看一下代码:主要实现是在onFling()方法:

@Override
	public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
			float velocityY) {
		if (e1.getX() - e2.getX() > 120) {
			this.flipper.setInAnimation(AnimationUtils.loadAnimation(this, R.anim.push_left_in));
			this.flipper.setOutAnimation(AnimationUtils.loadAnimation(this, R.anim.push_left_out));
			this.flipper.showNext();
			return true;
		} else if (e1.getX() - e2.getX() < -120) {
			this.flipper.setInAnimation(AnimationUtils.loadAnimation(this, R.anim.push_right_in));
			this.flipper.setOutAnimation(AnimationUtils.loadAnimation(this, R.anim.push_right_out));
			this.flipper.showPrevious();
			return true;
		}
		return false;
	}

如果滑动距离大于120px,就会进入下个界面。在onFling()方法有四个参数,e1是第一个ACTION_DOWN MotionEvent,e2最后一个ACTION_MOVE MotionEvent比较好理解。就是可以获得滑动距离,参数velocityX和velocityY呢?velocityX和velocityY实际上是X轴和Y轴上的移动速度,单位是像素/秒。结合这两个参数,就可以判断滑动的速度,从而做更多的处理。

       滑动翻页其他学习资料:

                   

使用ViewPage实现类launcher屏幕滑动

页面滑动切换(类Launcher滑动屏幕实现)

launcher修改--左右滑动屏幕切换源码追踪


    好,就写到这吧,最后代码:


http://download.csdn.net/detail/aomandeshangxiao/4192243

声明: 本文由( 张飞不张,文采横飞 )原创编译,转载请保留链接: viewFlipper简介及简单应用–滑动翻页功能

viewFlipper简介及简单应用–滑动翻页功能:目前有5 条留言

  1. 没有效果图的代码示例都是耍流氓。。

    2012-04-05 16:26 [回复]
  2. [reply]whatafuckinglongname[/reply]
    文章的后面不是有代码下载吗,劳烦您老自己动手下载下来,自己演示一下行吗?不好意思,不会弄动态图。

    2012-04-05 16:39 [回复]
  3. 地板
    hy6831023:

    除了 支持还能说什么

    2012-04-24 16:00 [回复]
  4. 板凳
    hy6831023:

    给力啊 支持啊!!!!!!!!!!!

    2012-04-24 16:01 [回复]
  5. [reply]hy6831023[/reply]
    那您就在文章下面给顶下吧。。。

    2012-04-24 19:07 [回复]

发表评论


QQ群互动

Linux系统与内核学习群:194051772

WP建站技术学习交流群:194062106

魔豆之路QR

魔豆的Linux内核之路

魔豆的Linux内核之路

优秀工程师当看优秀书籍

优秀程序员,要看优秀书!

赞助商广告

友荐云推荐