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种手势回调方法了
                    
                
                
            
        
浙公网安备 33010602011771号