Android 浅析GestureDetector

本文详细介绍了Android平台上的手势识别原理及实现方法,通过GestureDetector类帮助开发者捕捉和解析用户触摸屏的各种手势,如单击、双击、滑动等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一般的View只能响应点击(Click)和长按(LongPress)事件。这是因为View里只暴露了这些listener给我们使用。而实质上,View是在onTouchEvent(MotionEvent event)里对用户的动作做了一定的分析,从而通知我们是发生了点击还是长按等事件。
View里提供的回调在我描述的场景里,并不能满足要求。因此,GestureDetector出场了。我需要对其啃透才能写出自己的ActionDetector。
GestureDetector类可以帮助我们分析用户的动作,和View的onTouchEvent的处理方式差不多,但分析的动作类型更加细致,以下是它的回调接口:

Java代码:
 
Java代码
  1. public interface OnGestureListener {  
  2.   
  3. // Touch down时触发, e为down时的MotionEvent  
  4. boolean onDown(MotionEvent e);  
  5.   
  6. // 在Touch down之后一定时间(115ms)触发,e为down时的MotionEvent  
  7. void onShowPress(MotionEvent e);  
  8.   
  9. // Touch up时触发,e为up时的MotionEvent  
  10. boolean onSingleTapUp(MotionEvent e);  
  11.   
  12. // 滑动时触发,e1为down时的MotionEvent,e2为move时的MotionEvent  
  13. boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY);  
  14.   
  15. // 在Touch down之后一定时间(500ms)触发,e为down时的MotionEvent  
  16. void onLongPress(MotionEvent e);  
  17.   
  18. // 滑动一段距离,up时触发,e1为down时的MotionEvent,e2为up时的MotionEvent  
  19. boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY);  
  20. }  
  21.   
  22. public interface OnDoubleTapListener {  
  23.   
  24.   
  25. // 完成一次单击,并确定没有二击事件后触发(300ms),e为down时的MotionEvent  
  26. boolean onSingleTapConfirmed(MotionEvent e);  
  27.   
  28. // 第二次单击down时触发,e为第一次down时的MotionEvent  
  29. boolean onDoubleTap(MotionEvent e);  
  30.   
  31. // 第二次单击down,move和up时都触发,e为不同时机下的MotionEvent  
  32. boolean onDoubleTapEvent(MotionEvent e);  
  33. }  


有了这么多的回调消息,我们就能更加方便的对用户的动作进行响应,那么,这个类如何使用呢?以下是使用该类的一个范例:

java代码:
Java代码
  1. private GestureDetector mGestureDetector;  
  2.   
  3. @Override  
  4. public void onCreate(Bundle savedInstanceState) {  
  5. super.onCreate(savedInstanceState);  
  6. mGestureDetector = new GestureDetector(thisnew MyGestureListener());  
  7. }  
  8.   
  9. @Override  
  10. public boolean onTouchEvent(MotionEvent event) {  
  11. return mGestureDetector.onTouchEvent(event);  
  12. }  
  13.   
  14. class MyGestureListener extends GestureDetector.SimpleOnGestureListener{  
  15.   
  16. @Override  
  17. public boolean onSingleTapUp(MotionEvent ev) {  
  18. Log.d("onSingleTapUp",ev.toString());  
  19. return true;  
  20. }  
  21.   
  22. @Override  
  23. public void onShowPress(MotionEvent ev) {  
  24. Log.d("onShowPress",ev.toString());  
  25. }  
  26.   
  27. @Override  
  28. public void onLongPress(MotionEvent ev) {  
  29. Log.d("onLongPress",ev.toString());  
  30. }  
  31.   
  32. }  


基本的内容就是创建一个GestureDetector的对象,传入listener对象,在自己接收到的onTouchEvent中将event传给GestureDetector进行分析,listener会回调给我们相应的动作。其中GestureDetector.SimpleOnGestureListener(Framework帮我们简化了)是实现了上面提到的OnGestureListener和OnDoubleTapListener两个接口的类,我们只需要继承它并重写其中我们关心的回调即可。

最后,再提一下双击和三击的识别过程:在第一次单击down时,给Hanlder发送了一个延时300ms的消息,如果300ms里,发生了第二次单击的down事件,那么,就认为是双击事件了,并移除之前发送的延时消息。


转:http://dev.10086.cn/cmdn/wiki/index.php?doc-view-6978.html


另外的一篇关于这些这些方法调用时机的说明(最主要的是后面几个方法的说明可能比上面更直接):

为了加强鼠标响应事件,Android提供了GestureDetector手势识别类。通过GestureDetector.OnGestureListener来获取当前被触发的操作手势(Single Tap Up、Show Press、Long Press、Scroll、Down、Fling),具体包括以下几种:

boolean  onDoubleTap(MotionEvent e)
解释:双击的第二下Touch down时触发
boolean  onDoubleTapEvent(MotionEvent e)
解释:双击的第二下Touch down和up都会触发,可用e.getAction()区分。
boolean  onDown(MotionEvent e)
解释:Touch down时触发
boolean  onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY)
解释:Touch了滑动一点距离后,up时触发。
void  onLongPress(MotionEvent e)
解释:Touch了不移动一直Touch down时触发
boolean  onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY)
解释:Touch了滑动时触发。
void  onShowPress(MotionEvent e)
解释:Touch了还没有滑动时触发
(与onDown,onLongPress比较
onDown只要Touch down一定立刻触发。
而Touchdown后过一会没有滑动先触发onShowPress再是onLongPress。
所以Touchdown后一直不滑动,onDown->onShowPress->onLongPress这个顺序触发。


boolean  onSingleTapConfirmed(MotionEvent e)
boolean  onSingleTapUp(MotionEvent e)
解释:上面这两个函数都是在touch down后又没有滑动(onScroll),又没有长按(onLongPress),然后Touchup时触发。

点击一下非常快的(不滑动)Touchup:
onDown->onSingleTapUp->onSingleTapConfirmed
点击一下稍微慢点的(不滑动)Touchup:
onDown->onShowPress->onSingleTapUp->onSingleTapConfirmed

转:http://blog.youkuaiyun.com/aben_2005/article/details/6417423


1.点击屏幕上的某项的执行流程  有两种情况,一种是时间很短,一种时间稍长

时间很短:onDown--------》onSingleTapUp--------》onSingleTapConfirmed

时间稍长:onDown--------》onShowPress------》onSingleTapUp--------》onSingleTapConfirmed

2. 长按事件

onDown--------》onShowPress------》onLongPress

3.抛:手指触动屏幕后,稍微滑动后立即松开

onDown-----》onScroll----》onScroll----》onScroll----》………----->onFling

4.拖动

onDown------》onScroll----》onScroll------》onFiling

注意:有的时候会触发onFiling,但是有的时候不会触发,个人理解是人的动作不标准所致。


copied from http://www.cnblogs.com/transmuse/archive/2010/12/02/1894833.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值