Android 手势检测 - GestureDetector 全面分析

移动开发 Android
当用户触摸屏幕的时候,会产生许多手势,例如down,up,scroll,filing等等,Android sdk给我们提供了GestureDetector类,通过这个类我们可以识别很多的手势。

[[429732]]

本文转载自微信公众号「Android开发编程」,作者Android开发编程。转载本文请联系Android开发编程公众号。

前言

当用户触摸屏幕的时候,会产生许多手势,例如down,up,scroll,filing等等;Android sdk给我们提供了GestureDetector类,通过这个类我们可以识别很多的手势;今天就来学习下。

一、GestureDetector介绍

GestureDetector这个类对外提供了两个接口和一个外部类

  • 接口:OnGestureListener,OnDoubleTapListener
  • 内部类:SimpleOnGestureListener

GestureDetector类介绍

  1. private class Gesturelistener implements GestureDetector.OnGestureListener{ 
  2. public boolean onDown(MotionEvent e) { 
  3. // TODO Auto-generated method stub 
  4. return false
  5. public void onShowPress(MotionEvent e) { 
  6. // TODO Auto-generated method stub 
  7. public boolean onSingleTapUp(MotionEvent e) { 
  8. // TODO Auto-generated method stub 
  9. return false
  10. public boolean onScroll(MotionEvent e1, MotionEvent e2, 
  11. float distanceX, float distanceY) { 
  12. // TODO Auto-generated method stub 
  13. return false
  14. public void onLongPress(MotionEvent e) { 
  15. // TODO Auto-generated method stub 
  16. public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, 
  17. float velocityY) { 
  18. // TODO Auto-generated method stub 
  19. return false

这里总共重写了六个函数

1、OnDown(MotionEvent e):用户按下屏幕就会触发;

2、onShowPress(MotionEvent e):如果是按下的时间超过瞬间,而且在按下的时候没有松开或者是拖动的,那么onShowPress就会执行

3、onLongPress(MotionEvent e):长按触摸屏,超过一定时长,就会触发这个事件,触发顺序:onDown->onShowPress->onLongPress

4、onSingleTapUp(MotionEvent e):一次单独的轻击抬起操作,也就是轻击一下屏幕,立刻抬起来,才会有这个触发,当然,如果除了Down以外还有其它操作,那就不再算是Single操作了,所以也就不会触发这个事件;触发顺序:Touchup:onDown->onSingleTapUp->onSingleTapConfirmed ;

onFling(MotionEvent e1, MotionEvent e2, float velocityX,float velocityY) :滑屏,用户按下触摸屏、快速移动后松开,由1个MotionEvent ACTION_DOWN, 多个ACTION_MOVE, 1个ACTION_UP触发;

参数解释:

  • e1:第1个ACTION_DOWN MotionEvent
  • e2:最后一个ACTION_MOVE MotionEvent
  • velocityX:X轴上的移动速度,像素/秒
  • velocityY:Y轴上的移动速度,像素/秒

5、onScroll(MotionEvent e1, MotionEvent e2,float distanceX, float distanceY):在屏幕上拖动事件;无论是用手拖动view,或者是以抛的动作滚动,都会多次触发,这个方法在ACTION_MOVE动作发生时就会触发;

滑屏:手指触动屏幕后,稍微滑动后立即松开

onDown-----》onScroll----》onScroll----》onScroll----》………----->onFling

拖动

onDown------》onScroll----》onScroll------》onFiling

无论是滑屏,还是拖动,影响的只是中间OnScroll触发的数量多少而已,最终都会触发onFling事件;

二、实现GestureDetector

1、实现OnGestureListener接口中的方法(可以使用匿名内部类或实现了接口的类实例);

  1. class MyGestureListener implements GestureDetector.OnGestureListener { 
  2.     @Override 
  3.     public boolean onDown(MotionEvent e) { 
  4.         return false
  5.     } 
  6.     @Override 
  7.     public void onShowPress(MotionEvent e) { 
  8.     } 
  9.     @Override 
  10.     public boolean onSingleTapUp(MotionEvent e) { 
  11.         return false
  12.     } 
  13.     @Override 
  14.     public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) { 
  15.         return false
  16.     } 
  17.     @Override 
  18.     public void onLongPress(MotionEvent e) { 
  19.     } 
  20.     @Override 
  21.     public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { 
  22.         return false
  23.     } 

2、创建GestureDetector类的实例,构造函数如下:

  1. public GestureDetector(OnGestureListener listener, Handler handler) { 
  2.     this(null, listener, handler); 
  3. public GestureDetector(OnGestureListener listener) { 
  4.     this(null, listener, null); 
  5. public GestureDetector(Context context, OnGestureListener listener) { 
  6.     this(context, listener, null); 
  7. public GestureDetector(Context context, OnGestureListener listener, Handler handler) { 
  8. public GestureDetector(Context context, OnGestureListener listener, Handler handler, 
  9.         boolean unused) { 
  10.     this(context, listener, handler); 
  11. mGestureDetector = new GestureDetector(mContext,new MyGestureListener()); 

3、 实现View.OnTouchListener接口,重写onTouch()方法

4、在onTouch()方法中拦截事件处理,将控制权交给GestureDector;

  1. @Override 
  2. public boolean onTouch(View v, MotionEvent event) { 
  3.     return mGestureDetector.onTouchEvent(event); 

5、调用控件的View.setOnTouchListener()将接口的具体实现的引用传递进去或者如果是监听双击的话调用GestureDetector .setOnDoubleTapListener()

  1. package com.test.test; 
  2. import android.content.Context; 
  3. import android.util.AttributeSet; 
  4. import android.util.Log; 
  5. import android.view.GestureDetector; 
  6. import android.view.MotionEvent; 
  7. import android.view.View
  8. /* 
  9.  *  
  10.  */ 
  11. public class MyView extends View implements View.OnTouchListener{ 
  12.     private Context mContext; 
  13.     private GestureDetector mGestureDetector; 
  14.     private static final String TAG = "MyView"
  15.     public MyView(Context context) { 
  16.         super(context); 
  17.         initData(context); 
  18.     } 
  19.     public MyView(Context context, AttributeSet attrs) { 
  20.         super(context, attrs); 
  21.         initData(context); 
  22.     } 
  23.     public MyView(Context context, AttributeSet attrs, int defStyleAttr) { 
  24.         super(context, attrs, defStyleAttr); 
  25.         initData(context); 
  26.     } 
  27.     private void initData(Context context) { 
  28.         this.mContext = context; 
  29.         super.setOnTouchListener(this); 
  30.         super.setClickable(true); 
  31.         super.setLongClickable(true); 
  32.         super.setFocusable(true); 
  33.         mGestureDetector = new GestureDetector(mContext,new MyGestureListener()); 
  34.         mGestureDetector.setOnDoubleTapListener(new MyGestureListener()); 
  35.     } 
  36.     /* 
  37.      * 当该view上的事件被分发到view上时触发该方法的回调 
  38.      * 如果这个方法返回false时,该事件就会被传递给Activity中的onTouchEvent方法来处理 
  39.      * 如果该方法返回true时,表示该事件已经被onTouch函数处理玩,不会上传到activity中处理 
  40.      * 该方法属于View.OnTouchListening接口 
  41.      */ 
  42.     @Override 
  43.     public boolean onTouch(View v, MotionEvent event) { 
  44.         return mGestureDetector.onTouchEvent(event); 
  45.     } 
  46.     /* 
  47.      * 手势监听类 
  48.      */ 
  49.     class MyGestureListener extends GestureDetector.SimpleOnGestureListener { 
  50.         public MyGestureListener() { 
  51.             super(); 
  52.         } 
  53.         @Override 
  54.         public boolean onDoubleTap(MotionEvent e) { 
  55.             Log.e(TAG, "onDoubleTap"); 
  56.             return true
  57.         } 
  58.         @Override 
  59.         public boolean onDoubleTapEvent(MotionEvent e) { 
  60.             Log.e(TAG, "onDoubleTapEvent"); 
  61.             return true
  62.         } 
  63.         @Override 
  64.         public boolean onSingleTapConfirmed(MotionEvent e) { 
  65.             Log.e(TAG, "onSingleTapConfirmed"); 
  66.             return true
  67.         } 
  68.         @Override 
  69.         public boolean onContextClick(MotionEvent e) { 
  70.             Log.e(TAG, "onContextClick"); 
  71.             return true
  72.         } 
  73.         @Override 
  74.         public boolean onDown(MotionEvent e) { 
  75.             Log.e(TAG, "onDown"); 
  76.             return true
  77.         } 
  78.         @Override 
  79.         public void onShowPress(MotionEvent e) { 
  80.             Log.e(TAG, "onShowPress"); 
  81.         } 
  82.         @Override 
  83.         public boolean onSingleTapUp(MotionEvent e) { 
  84.             Log.e(TAG, "onSingleTapUp"); 
  85.             return true
  86.         } 
  87.         @Override 
  88.         public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) { 
  89.             Log.e(TAG, "onScroll"); 
  90.             return true
  91.         } 
  92.         @Override 
  93.         public void onLongPress(MotionEvent e) { 
  94.             Log.e(TAG, "onLongPress"); 
  95.         } 
  96.         @Override 
  97.         public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { 
  98.             Log.e(TAG, "onFling"); 
  99.             return true
  100.         } 
  101.     } 

自定义控件继承了View实现了View.OnTouchListener。监听的方法用的是继承SimpleOnGestureListener类,重写了所有方法;

总结 

本文只是给了基本的用法,后面会介绍下源码。

 

责任编辑:武晓燕 来源: Android开发编程
相关推荐

2010-09-10 10:09:26

Android

2010-03-04 17:13:27

Android平台

2013-05-14 11:18:24

AIR AndroidSwipe手势

2013-05-14 11:16:26

AIR Android旋转手势

2012-02-28 14:07:17

Android触摸屏手势识别

2017-09-27 15:17:54

HTML5Hybrid手势

2009-11-05 14:40:08

WCF KnownTy

2010-11-01 09:46:21

ViewAndroid

2022-05-05 15:16:01

ACE鸿蒙

2013-05-14 11:13:02

AIR Android放大缩小手势

2010-01-28 14:57:36

Android滑动手势

2015-01-20 17:09:21

Android源码手势锁

2009-09-22 11:24:07

Hibernate查询

2009-09-16 17:41:56

Linq延时执行

2009-09-16 10:48:32

LINQ查询操作

2009-11-09 12:45:44

路由负载均衡

2010-03-19 12:36:12

无线中继模式

2018-05-22 09:17:30

XDA安卓手机

2009-10-28 10:04:53

VB.NET XmlW

2009-09-27 17:46:22

Hibernate监听
点赞
收藏

51CTO技术栈公众号