Android之Gesture

Gesture手势
 
View类有个View.OnTouchListener内部接口,通过重写他的onTouch(View v, MotionEvent event)方法,我们可以处理一些touch事件,但是这个方法太过简单,如果需要处理一些复杂的手势,用这个接口就会很麻烦(因为我们要自己根据用户触摸的轨迹去判断是什么手势)
Android sdk给我们提供了GestureDetector(Gesture:手势Detector:识别)类,通过这个类我们可以识别很多的手势,主要是通过他的onTouchEvent(event)方法完成了不同手势的识别。虽然他能识别手势,但是不同的手势要怎么处理,应该是提供给程序员实现的,因此这个类对外提供了两个接口:OnGestureListener,OnDoubleTapListener,还有一个内部类SimpleOnGestureListener,SimpleOnGestureListener类实现了上述两个接口,一个更方便的响应不同手势的类,这个类中所有的方法体都是空的,该类是static class,也就是说它实际上是一个外部类。程序员可以在外部继承这个类,重写里面的手势处理方法。
通过GestureDetector的构造方法可以将SimpleOnGestureListener对象传递进去,这样GestureDetector能处理不同的手势了。当我们接收到用户触摸消息时,将这个消息交给GestureDetector去加工,我们通过设置侦听器获得GestureDetector处理后的手势.
具体用法:
1.写一个类继承SimpleOnGestureListener重写需要的方法,
2.在需要手势的view或Activity中实例化一个GestureDetector类的对象(构造方法中有个参数就是你写的SimpleOnGestureListener子类的对象)
3.在ontouch()方法中返回myGestureDetector.onTouchEvent(event);
 
OnGestureListener的接口有这几个:

abstract boolean onDown(MotionEvent e); // 单击,触摸屏按下时立刻触发

abstract boolean onSingleTapUp(MotionEvent e); // 抬起,手指离开触摸屏时触发(长按、滚动、滑动时,不会触发这个手势)

abstract void onShowPress(MotionEvent e); // 短按,触摸屏按下后片刻后抬起,会触发这个手势,如果迅速抬起则不会

abstract void onLongPress(MotionEvent e); // 长按,触摸屏按下后既不抬起也不移动,过一段时间后触发

abstract boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY); // 滚动,触摸屏按下后移动

abstract boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY); // 滑动,触摸屏按下后快速移动并抬起,会先触发滚动手势,跟着触发一个滑动手势
 
OnDoubleTapListener的接口有这几个:

abstract boolean onDoubleTap(MotionEvent e); // 双击,手指在触摸屏上迅速点击第二下时触发

abstract boolean onDoubleTapEvent(MotionEvent e); // 双击的按下跟抬起各触发一次

abstract boolean onSingleTapConfirmed(MotionEvent e); // 单击确认,即很快的按下并抬起,但并不连续点击第二下
 
View必须设置longClickable为true,否则手势识别无法正确工作,只会返回Down, Show, Long三种手势
必须在View的onTouchListener中调用手势识别,而不能像Activity一样重载onTouchEvent,否则同样手势识别无法正确工作 ,即:应该为:
view.setOnTouchListener(new OnTouchListener() {
public boolean onTouch(View v, MotionEvent event) {
return mGestureDetector.onTouchEvent(event);
}
});
 
单击:down 0, single up 1, single conf 0
短按:down 0, show 0, single up 1
长按:down 0, show 0, long 0
双击:down 0, single up 1, double 0, double event 0, down 0, double event 1
滚动:down 0, (show 0), scrool 2...
滑动:down 0, (show 0), scrool 2..., fling 1
 
 
例子:
1.通过手势来指引小球的位置  小球手指跟随  可以不用手势  控制小球移动 要用手势
   onDraw(Canvas canvas) : Paint paint = new Paint();  
             paint.setColor(Color.BLUE);  
             canvas.drawCircle(x1, y1, 10, paint);  
 
2.通过手势与ViewFilpper结合使用来达到点击或滑动切换界面效果
ViewFilpper:
java.lang.Object
android.view.View
android.view.ViewGroup
android.widget.FrameLayout
android.widget.ViewAnimator
android.widget.ViewFlipper
 
被添加到ViewFlipper中的两个或两个以上的视图之间将执行一个简单的ViewAnimator动画。一次仅能显示一个子视图。如果需要,可以设置间隔时间使子视图像幻灯片一样自动显示。
android:autoStart
当设为true时,自动启动动画
此时必须是一个布尔值,属性值为true或false
(对应于全局资源属性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 ()
停止切换
 mFlipper.setInAnimation(inFromRightAnimation());  
mFlipper.setOutAnimation(outToLeftAnimation());  
 mFlipper.showPrevious();
   mFlipper.showNext();  

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值