【Android】关于手势识别(TouchEvent/Gesture)
我们在很多应用中会用到Android的手势识别,比如单击,长按,滑动等等,这时候就需要我们监听用户的触摸事件。在实现这个功能的时候,有两个接口看上去有点像:OnTouchEvent和OnGestureListener。(我好像一直比较误会)
假设一个类实现了OnGestureListener接口,那么它需要实现的方法如下:
1 import android.app.Activity; 2 import android.view.GestureDetector.OnGestureListener; 3 import android.view.MotionEvent; 4 5 public class Test extends Activity implements OnGestureListener{ 6 7 @Override 8 public boolean onDown(MotionEvent arg0) { 9 // TODO Auto-generated method stub 10 return false; 11 } 12 13 @Override 14 public boolean onFling(MotionEvent arg0, MotionEvent arg1, float arg2, 15 float arg3) { 16 // TODO Auto-generated method stub 17 return false; 18 } 19 20 @Override 21 public void onLongPress(MotionEvent arg0) { 22 // TODO Auto-generated method stub 23 24 } 25 26 @Override 27 public boolean onScroll(MotionEvent arg0, MotionEvent arg1, float arg2, 28 float arg3) { 29 // TODO Auto-generated method stub 30 return false; 31 } 32 33 @Override 34 public void onShowPress(MotionEvent arg0) { 35 // TODO Auto-generated method stub 36 37 } 38 39 @Override 40 public boolean onSingleTapUp(MotionEvent arg0) { 41 // TODO Auto-generated method stub 42 return false; 43 } 44 }
假设一个类实现接口OnTouchEvent,它需要实现的方法如下:
1 import android.app.Activity; 2 import android.view.MotionEvent; 3 import android.view.View; 4 import android.view.View.OnTouchListener; 5 6 public class Test extends Activity implements OnTouchListener{ 7 8 @Override 9 public boolean onTouch(View arg0, MotionEvent arg1) { 10 // TODO Auto-generated method stub 11 return false; 12 } 13 14 }
在这里只要实现一个方法,OnTouch(View v ,Event e) 两个参数 v和 e都是系统自动传进来的,这个v取决于你当前点击的view对象,e代表你当前点事件的各个属性(比如坐标,按下,放开,移动,等等)。这里有两个地方值得看一下:
1)return false和return true有什么区别?
根据Android开发者文档的描述:true if the GestureDetector.OnGestureListener
consumed the event, else false.(我找的是GestureDetector)所以true表明事件已经被消化了,否则的话就是false(事件依旧存在)
2)这里写的是onTouch方法必须要被重载,而这个方法里面有两个参数,在开发者文档上写的是:
v The view the touch event has been dispatched to.(事件被分发到的view,也就是促发事件的组件)
event The MotionEvent object containing full information about the event.(包含了事件发生的足够多的信息)
但是问题是我们在网上看到的很多的例子,都不是使用这里的event获取事件信息的,而是重载了另外一个方法OnTouchEvent。onTouchEvent同样是在View中定义的一个方法。处理传递到view 的手势事件。手势事件类型包括ACTION_DOWN,ACTION_MOVE,ACTION_UP,ACTION_CANCEL四种事件。一般通过前三种事件类型来观察用户的动作情况,那么这两者有什么区别呢?开发者文档对这个方法的描述如下:
Implement this method to handle touch screen motion events.
event the motion event
returns: True if the event was handled, false otherwise.
关键是两个event都是MotionEvent类型的,可以获取和事件相关的一切信息,所以这两个是不是么有区别??
下面又要综合几篇博客做论述了:
1)Android onTouchEvent, onClick及onLongClick的调用机制
2)消息分发知识基础
OnTouchListener:onTouch和onTouchEvent 的区别
- 首先执行OnTouchListener()中的onTouch,然后执行重写的onTouchEvent(MotionEvent event)。(注:在return不为true的情况下)
- onTouch() is used by users of the View to get touch events while onTouchEvent() is used by derived classes of the View to get touch events.
所以onTouch是view用来获取事件类型的,而onTouchEvent则是用来被派生类获取时间类型的。