Android 浅析GestureDetector

一般的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. public interface OnDoubleTapListener { 
  22.  
  23.  
  24. // 完成一次单击,并确定没有二击事件后触发(300ms),e为down时的MotionEvent 
  25. boolean onSingleTapConfirmed(MotionEvent e); 
  26.  
  27. // 第二次单击down时触发,e为第一次down时的MotionEvent 
  28. boolean onDoubleTap(MotionEvent e); 
  29.  
  30. // 第二次单击down,move和up时都触发,e为不同时机下的MotionEvent 
  31. boolean onDoubleTapEvent(MotionEvent e); 


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

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


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

最后,再提一下双击和三击的识别过程:在第一次单击down时,给Hanlder发送了一个延时300ms的消息,如果300ms里,发生了第二次单击的down事件,那么,就认为是双击事件了,并移除之前发送的延时消息。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值