【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则是用来被派生类获取时间类型的。

原文地址:https://www.cnblogs.com/lqminn/p/2701001.html