分享到:

西安雁塔兆隆计算机培训中心西安软件开发,西安java培训,全国领先的软件开发培训

联系资料

西安雁塔兆隆计算机培训中心
所在地区:
陕西省 西安市
公司主页:
暂无
电话号码:
029-*******
传真号码:
暂无
联 系 人:
王老师
移动电话:
1592*******
电子邮箱:
暂无

北大青鸟西安兆隆:浅析GestureDetector

发布于 2013年01月08日

[摘要]最近在研究场景切换的动画效果,其中需要用到三连击的动作触发。三连击,即点三下屏幕,但意义上是双击效果。 因此,我需要研究如何识别三连击的动作。 我们知道,一般的View只能响应点击(Click)和长按(LongPress)事件。这是因为View里只暴露了这些list
>

最近在研究场景切换的动画效果,其中需要用到三连击的动作触发。三连击,即点三下屏幕,但意义上是双击效果。 因此,我需要研究如何识别三连击的动作。

我们知道,一般的View只能响应点击(Click)和长按(LongPress)事件。这是因为View里只暴露了这些listener给我们使用。而实质上,View是在onTouchEvent(MotionEvent event)里对用户的动作做了一定的分析,从而通知我们是发生了点击还是长按等事件。

View里提供的回调在我描述的场景里,并不能满足要求。因此,GestureDetector出场了。我需要对其啃透才能写出自己的ActionDetector。

GestureDetector类可以帮助我们分析用户的动作,和View的onTouchEvent的处理方式差不多,但分析的动作类型更加细致,以下是它的回调接口:

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

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

复制到剪贴板  Java代码
  1. private GestureDetector mGestureDetector;   
  2.   
  3.   
  4.   
  5. @Override  
  6.   
  7.   
  8.   
  9. public void onCreate(Bundle savedInstanceState) {   
  10.   
  11.   
  12.   
  13.   super.onCreate(savedInstanceState);   
  14.   
  15.   
  16.   
  17.   mGestureDetector = new GestureDetector(thisnew MyGestureListener());   
  18.   
  19.   
  20.   
  21. }   
  22.   
  23.   
  24.   
  25. @Override  
  26.   
  27.   
  28.   
  29. public boolean onTouchEvent(MotionEvent event) {   
  30.   
  31.   
  32.   
  33. return ***hEvent(event);   
  34.   
  35.   
  36.   
  37. }   
  38.   
  39.   
  40.   
  41. class MyGestureListener extends ***OnGestureListener{   
  42.   
  43.   
  44.   
  45.   @Override  
  46.   
  47.   
  48.   
  49.   public boolean onSingleTapUp(MotionEvent ev) {   
  50.   
  51.   
  52.   
  53.     Log.d("onSingleTapUp",***ng());   
  54.   
  55.   
  56.   
  57.     return true;   
  58.   
  59.   
  60.   
  61.   }   
  62.   
  63.   
  64.   
  65.   @Override  
  66.   
  67.   
  68.   
  69.   public void onShowPress(MotionEvent ev) {   
  70.   
  71.   
  72.   
  73.     Log.d("onShowPress",***ng());   
  74.   
  75.   
  76.   
  77.   }   
  78.   
  79.   
  80.   
  81.   @Override  
  82.   
  83.   
  84.   
  85.   public void onLongPress(MotionEvent ev) {   
  86.   
  87.   
  88.   
  89.     Log.d("onLongPress",***ng());   
  90.   
  91.   
  92.   
  93.   }   
  94.   
  95.   
  96.   
  97. …   
  98.   
  99.   
  100.   
  101. }  

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

最后,再提一下双击和三击的识别过程:在第一次单击down时,给Hanlder发送了一个延时300ms的消息,如果300ms里,发生了第二次单击的down事件,那么,就认为是双击事件了,并移除之前发送的延时消息。如果300ms后仍没有第二次的down消息,那么就判定为SingleTapConfirmed事件(当然,此时用户的手指应已完成第一次点击的up过程)。三击的判定和双击的判定类似,只是多了一次发送延时消息的过程,有意思吧~~~嘿嘿~~~

(责任编辑:)