Android 手势监测GestureDetector

【GestureDetector】——简介


1、使用GestureDetector手势检测的步骤非常的简单:

(1)在Activity中创建一个GestureDetector对象,在创建的时候,为这个GestureDetector对象提供一个GestureDetector.OnGestureListener监听器(这是唯一的一种为GestureDetector对象注册监听器的方式)

(2)重写GestureDetector.OnGestureListener类中的用于监听各种手势的方法

(3)在Activity的onTouchEvent()方法中调用GestureDetector对象的onTouchEvent()方法 , 这样一来在Activity中的屏幕事件就会由GestureDetector对象接管

通过上面的三步就能够通过GestureDetector对象来静听屏幕的手势事件了

2、为了更加清楚的理清这个思路,我们首先看一段用于测试的代码,之后我们在详细讲解各个方法的触发时机

 1 public class MainActivity extends Activity implements OnGestureListener{
 2     
 3     // 定义手势检测器实例
 4         GestureDetector detector;
 5 
 6     @Override
 7     protected void onCreate(Bundle savedInstanceState) {
 8         super.onCreate(savedInstanceState);
 9         setContentView(R.layout.activity_main);
10         
11         //创建手势检测器,构造方法为GestureDetector(Context context, OnGestureListener listener)
12         detector = new GestureDetector(MainActivity.this, MainActivity.this);
13     }
14 
15     //将该Activity上的触碰事件交给GestureDetector处理
16         @Override
17         public boolean onTouchEvent(MotionEvent me)
18         {
19             return detector.onTouchEvent(me);
20         }
21         
22         /**当触碰事件按下时触发*/
23         @Override
24         public boolean onDown(MotionEvent arg0)
25         {
26             Toast.makeText(this,"onDown"
27                 , Toast.LENGTH_LONG).show();
28             return false;
29         }
30         
31         
32         /**当用户在触摸屏上快速滑动时触发,velocityX velocityY代表在横纵方向上的速度 */
33         @Override
34         public boolean onFling(MotionEvent e1, MotionEvent e2
35             , float velocityX, float velocityY)
36         {
37             Toast.makeText(this , "onFling" 
38                 , Toast.LENGTH_LONG).show();
39             return false;
40         }
41         
42         /**当用户在屏幕上长按时触发该方法*/
43         @Override
44         public void onLongPress(MotionEvent e)
45         {
46             Toast.makeText(this ,"onLongPress"
47                 , Toast.LENGTH_LONG).show();
48         }
49         
50         /**当用户在屏幕上“滚动”时触发*/
51         @Override
52         public boolean onScroll(MotionEvent e1, MotionEvent e2
53             , float distanceX, float distanceY)
54         {
55             Toast.makeText(this ,"onScroll" ,
56                 Toast.LENGTH_LONG).show();
57             return false;
58         }
59         
60         /**当用户在屏幕上按下、而且还未移动和松开时触发*/
61         @Override
62         public void onShowPress(MotionEvent e)
63         {
64             Toast.makeText(this ,"onShowPress"
65                 , Toast.LENGTH_LONG).show();
66         }
67         
68         /**用户在屏幕上的抬起事件将会触发*/
69         @Override
70         public boolean onSingleTapUp(MotionEvent e)
71         {
72             Toast.makeText(this ,"onSingleTapUp" 
73                 , Toast.LENGTH_LONG).show();
74             return false;
75         }
76 }


3、GestureDetector.OnGestureListener中各个方法的触发时机

按下(onDown): 刚刚手指接触到触摸屏的那一刹那,就是触的那一下。 
抛掷(onFling): 手指在触摸屏上迅速移动,并松开的动作。 
长按(onLongPress): 手指按在持续一段时间,并且没有松开。 
滚动(onScroll): 手指在触摸屏上滑动。 
按住(onShowPress): 手指按在触摸屏上,它的时间范围在按下起效,在长按之前。 
抬起(onSingleTapUp):手指离开触摸屏的那一刹那。 

任何手势动作都会先执行一次按下(onDown)动作。 
长按(onLongPress)动作前一定会执行一次按住(onShowPress)动作。 
按住(onShowPress)动作和按下(onDown)动作之后都会执行一次抬起(onSingleTapUp)动作。 
长按(onLongPress)、滚动(onScroll)和抛掷(onFling)动作之后都不会执行抬起(onSingleTapUp)动作。

实际上,上面的代码是一个非常好的实践代码,可以在手上运行上面的代码,看看这些方法的触发时机,以及各个方法的之间的关联

 

【GestureDetector】——详解


一、我们来看看这个GestureDetector类的组成:

1、接口:
OnGestureListener:用来监听手势事件(6种)。
OnDoubleTapListener:用来监听双击事件。
2、内部类:
SimpleOnGestureListener:用来监听所有的手势。实际上它实现了上述两个接口,不过方法体是空的,需要我们自己写。我们可以继承这个类,重写里面的方法进行手势处理。
3、构造
GestureDetector gestureDetector=new GestureDetector(GestureDetector.OnGestureListener listener);
GestureDetector gestureDetector=new GestureDetector(Context context,GestureDetector.OnGestureListener listener);
GestureDetector gestureDetector=new GestureDetector(Context context,GestureDetector.SimpleOnGestureListener listener);
 4、方法
(1)onTouchEvent(MotionEvent ev) 分析捕捉到的触摸事件触发相应的回调函数
(2)setIsLongpressEnabled(boolean isLongpressEnabled) 设置“长按”是否可用
(3)setOnDoubleTapListener(GestureDetector.OnDoubleTapListener onDoubleTapListener) 设置双击监听器

 

二、上面的简介中我们已经介绍了GestureDetector.OnGestureListener几口提供了6种手势检测,下面来看看OnDoubleTapListener和SimpleOnGestureListener

 

【OnDoubleTapListener】
1.OnDoubleTapListener是用来检测鼠标双击事件的。需要实现的抽象方法有:
(1) onDoubleTap(MotionEvent e):双击事件。
(2) onDoubleTapEvent(MotionEvent e):双击间隔中还发生其他的动作。通知DoubleTap手势中的事件,包含down、up和move事件
(这里指的是在双击之间发生的事件,例如在同一个地方双击会产生DoubleTap手势,而在DoubleTap手势里面还会发生down和up事件,这两个事件由该函数通知);
(3) onSingleTapConfirmed(MotionEvent e):单击事件。用来判定该次点击是SingleTap而不是DoubleTap,如果连续点击两次就是DoubleTap手势,
如果只点击一次,系统等待一段时间后没有收到第二次点击则判定该次点击为SingleTap而不是DoubleTap,然后触发SingleTapConfirmed事件。
关于onSingleTapConfirmed和onSingleTapUp的一点区别: OnGestureListener有这样的一个方法onSingleTapUp,和onSingleTapConfirmed容易混淆。
二者的区别是:onSingleTapUp,只要手抬起就会执行,而对于onSingleTapConfirmed来说,如果双击的话,则onSingleTapConfirmed不会执行。

 

【SimpleOnGestureListener】

这是一个内部类实现了OnGestureListener 和OnDoubleTapListener两个接口,所以它可以完成以上提到的所有手势识别(9种),所以当我们为GestureDetector注册这个监听器的时候,我们就可以重写总共的9种手势回调方法了

 

posted @ 2014-12-07 10:53  RoperLee  阅读(436)  评论(0)    收藏  举报