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

       前两天使用到了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屏幕滑动


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


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



  • 9
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值