Android 触摸及手势操作GestureDetector

简介:

现在的智能手机不敢说百分百的都是触摸屏,也应该是百分之九九以上为触摸屏了,触摸屏为我们操作无键盘、无鼠标的手机系统带来了很多的便利。当用户触摸屏幕时会产生很多的触摸事件,down、up、move等等。View类有个View.OnTouchListener内部接口,通过重写他的onTouch(View v, MotionEvent event)方法,我们可以处理一些touch事件,如下:


  1. publicclass MainActivity extends Activity {  

  2. ...  

  3. // This example shows an Activity, but you would use the same approach if

  4. // you were subclassing a View.

  5. @Override

  6. publicboolean onTouchEvent(MotionEvent event){  

  7. int action = MotionEventCompat.getActionMasked(event);  

  8. switch(action) {  

  9. case (MotionEvent.ACTION_DOWN) :  

  10.            Log.d(DEBUG_TAG,"Action was DOWN");  

  11. returntrue;  

  12. case (MotionEvent.ACTION_MOVE) :  

  13.            Log.d(DEBUG_TAG,"Action was MOVE");  

  14. returntrue;  

  15. case (MotionEvent.ACTION_UP) :  

  16.            Log.d(DEBUG_TAG,"Action was UP");  

  17. returntrue;  

  18. case (MotionEvent.ACTION_CANCEL) :  

  19.            Log.d(DEBUG_TAG,"Action was CANCEL");  

  20. returntrue;  

  21. case (MotionEvent.ACTION_OUTSIDE) :  

  22.            Log.d(DEBUG_TAG,"Movement occurred outside bounds " +  

  23. "of current screen element");  

  24. returntrue;        

  25. default :  

  26. returnsuper.onTouchEvent(event);  

  27.    }        

  28. }  




   OnTouch提供的事件还是相对较简单,如果需要处理一些复杂的手势,用这个接口就会很麻烦,因为我们要根据用户触摸的轨迹去判断是什么手势。Android sdk给我们提供了GestureDetector(Gesture:手势Detector:识别)类,通过这个类我们可以识别很多的手势。

public class GestureDetector extends Object

java.lang.Object

android.view.GestureDetector

   GestureDetector属于android.view包,android还提供了android.gesture包支持更多的手势操作,以后我们会介绍到。官方的介绍中使用了GestureDetectorCompat处理手势识别,为什么使用GestureDetectorCompat替换了GestureDetector呢,官方的是这样解释的:

20131121153739828


 GestureDetectorCompat实例化有下面两种方法

20131121154752046

   GestureDetector类对外提供了两个接口:OnGestureListener,OnDoubleTapListener,还有一个内部类SimpleOnGestureListener;SimpleOnGestureListener类是GestureDetector提供给我们的一个更方便的响应不同手势的类,它实现了上述两个接口,该类是static class,也就是说它实际上是一个外部类,我们可以在外部继承这个类,重写里面的手势处理方法。因此实现手势识别有两种方法,一种实现OnGestureListener接口,另一种是使用SimpleOnGestureListener类。

OnGestureListener有下面的几个动作:

按下(onDown): 刚刚手指接触到触摸屏的那一刹那,就是触的那一下。


抛掷(onFling): 手指在触摸屏上迅速移动,并松开的动作。


长按(onLongPress): 手指按在持续一段时间,并且没有松开。


滚动(onScroll): 手指在触摸屏上滑动。


按住(onShowPress): 手指按在触摸屏上,它的时间范围在按下起效,在长按之前。


抬起(onSingleTapUp):手指离开触摸屏的那一刹那。


   使用OnGestureListener接口,这样需要重载OnGestureListener接口所有的方法,适合监听所有的手势,正如官方文档提到的“Detecing All Supported Gestures”。

  1. publicclass MainActivity extends Activity implements

  2.        GestureDetector.OnGestureListener,  

  3.        GestureDetector.OnDoubleTapListener{  

  4. privatestaticfinal String DEBUG_TAG = "Gestures";  

  5. private GestureDetectorCompat mDetector;  

  6. // Called when the activity is first created.

  7. @Override

  8. publicvoid onCreate(Bundle savedInstanceState) {  

  9. super.onCreate(savedInstanceState);  

  10.        setContentView(R.layout.activity_main);  

  11. // Instantiate the gesture detector with the

  12. // application context and an implementation of

  13. // GestureDetector.OnGestureListener

  14.        mDetector = new GestureDetectorCompat(this,this);  

  15. // Set the gesture detector as the double tap

  16. // listener.

  17.        mDetector.setOnDoubleTapListener(this);  

  18.    }  

  19. @Override

  20. publicboolean onTouchEvent(MotionEvent event){  

  21. this.mDetector.onTouchEvent(event);  

  22. // Be sure to call the superclass implementation

  23. returnsuper.onTouchEvent(event);  

  24.    }  

  25. @Override

  26. publicboolean onDown(MotionEvent event) {  

  27.        Log.d(DEBUG_TAG,"onDown: " + event.toString());  

  28. returntrue;  

  29.    }  

  30. @Override

  31. publicboolean onFling(MotionEvent event1, MotionEvent event2,  

  32. float velocityX, float velocityY) {  

  33.        Log.d(DEBUG_TAG, "onFling: " + event1.toString()+event2.toString());  

  34. returntrue;  

  35.    }  

  36. @Override

  37. publicvoid onLongPress(MotionEvent event) {  

  38.        Log.d(DEBUG_TAG, "onLongPress: " + event.toString());  

  39.    }  

  40. @Override

  41. publicboolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX,  

  42. float distanceY) {  

  43.        Log.d(DEBUG_TAG, "onScroll: " + e1.toString()+e2.toString());  

  44. returntrue;  

  45.    }  

  46. @Override

  47. publicvoid onShowPress(MotionEvent event) {  

  48.        Log.d(DEBUG_TAG, "onShowPress: " + event.toString());  

  49.    }  

  50. @Override

  51. publicboolean onSingleTapUp(MotionEvent event) {  

  52.        Log.d(DEBUG_TAG, "onSingleTapUp: " + event.toString());  

  53. returntrue;  

  54.    }  

  55. @Override

  56. publicboolean onDoubleTap(MotionEvent event) {  

  57.        Log.d(DEBUG_TAG, "onDoubleTap: " + event.toString());  

  58. returntrue;  

  59.    }  

  60. @Override

  61. publicboolean onDoubleTapEvent(MotionEvent event) {  

  62.        Log.d(DEBUG_TAG, "onDoubleTapEvent: " + event.toString());  

  63. returntrue;  

  64.    }  

  65. @Override

  66. publicboolean onSingleTapConfirmed(MotionEvent event) {  

  67.        Log.d(DEBUG_TAG, "onSingleTapConfirmed: " + event.toString());  

  68. returntrue;  

  69.    }  

  70. }  


   这样会造成有些手势动作我们用不到,但是还要重载。SimpleOnGestureListener类的出现为我们解决了这个问题,如果你想“Detecting a Subset of Supported Gestures”,SimpleOnGestureListener是最好的选择。


  1. publicclass MainActivity extends Activity {  

  2. private GestureDetectorCompat mDetector;  

  3. @Override

  4. publicvoid onCreate(Bundle savedInstanceState) {  

  5. super.onCreate(savedInstanceState);  

  6.        setContentView(R.layout.activity_main);  

  7.        mDetector = new GestureDetectorCompat(thisnew MyGestureListener());  

  8.    }  

  9. @Override

  10. publicboolean onTouchEvent(MotionEvent event){  

  11. this.mDetector.onTouchEvent(event);  

  12. returnsuper.onTouchEvent(event);  

  13.    }  

  14. class MyGestureListener extends GestureDetector.SimpleOnGestureListener {  

  15. privatestaticfinal String DEBUG_TAG = "Gestures";  

  16. @Override

  17. publicboolean onDown(MotionEvent event) {  

  18.            Log.d(DEBUG_TAG,"onDown: " + event.toString());  

  19. returntrue;  

  20.        }  

  21. @Override

  22. publicboolean onFling(MotionEvent event1, MotionEvent event2,  

  23. float velocityX, float velocityY) {  

  24.            Log.d(DEBUG_TAG, "onFling: " + event1.toString()+event2.toString());  

  25. returntrue;  

  26.        }  

  27.    }  

  28. }  




   最后了我们也解释两个问题:

   1、onTouchEvent中为什么使用了MotionEventCompat,而不直接使用MotionEvent。因为MotionEventCompat使更多的Action适配到API 4。

   2、Android的view怎么使用手势,方法如下:

  1. View myView = findViewById(R.id.my_view);  

  2.    myView.setOnTouchListener(new OnTouchListener() {  

  3. publicboolean onTouch(View v, MotionEvent event) {  

  4. // ... Respond to touch events      

  5. this.mDetector.onTouchEvent(event);  

  6. returnsuper.onTouchEvent(event);  

  7.        }  

  8.    });  




/**
* @author 张兴业
*  iOS入门群:83702688
*  android开发进阶群:241395671
*  我的新浪微博:@张兴业TBOW
*/


参考:

http://developer.android.com/reference/android/view/GestureDetector.html

http://developer.android.com/training/gestures/detector.html




     本文转自xyz_lmn51CTO博客,原文链接:http://blog.51cto.com/xyzlmn/1344475,如需转载请自行联系原作者

相关文章
|
Android开发 索引 容器
【Android 应用开发】Android 组件 位置坐标 属性 ( 组件位置属性 | 父容器坐标系坐标 | 窗口坐标系坐标 | 屏幕坐标系坐标 | 触摸坐标 )
【Android 应用开发】Android 组件 位置坐标 属性 ( 组件位置属性 | 父容器坐标系坐标 | 窗口坐标系坐标 | 屏幕坐标系坐标 | 触摸坐标 )
253 0
|
4月前
|
XML Java Android开发
Android App接管手势处理TouchEvnet中单点触摸和多点触控的讲解及实战(附源码 超简单实用)
Android App接管手势处理TouchEvnet中单点触摸和多点触控的讲解及实战(附源码 超简单实用)
36 0
|
Android开发
Android触摸事件传递机制(一)
在开发过程中会经常遇到View与ViewGroup嵌套的问题,如ViewPager嵌套Fragment,而Fragment中又需要实现一个广告滑动,此时广告滑动就会与ViewPager的滑动事件产生冲突,而深入理解Android触摸事件的传递机制则是解决问题的关键。
1369 0
|
XML Android开发 数据格式
【Android TV 开发】焦点处理 ( 父容器与子组件焦点获取关系处理 | 不同电视设备上的兼容问题 | 触摸获取焦点 | 按键获取焦点 )
【Android TV 开发】焦点处理 ( 父容器与子组件焦点获取关系处理 | 不同电视设备上的兼容问题 | 触摸获取焦点 | 按键获取焦点 )
455 0
|
API Android开发
【Android 内存优化】自定义组件长图组件 ( 长图滚动区域解码 | 手势识别 GestureDetector | 滑动计算类 Scroller | 代码示例 )
【Android 内存优化】自定义组件长图组件 ( 长图滚动区域解码 | 手势识别 GestureDetector | 滑动计算类 Scroller | 代码示例 )
128 0
【Android 内存优化】自定义组件长图组件 ( 长图滚动区域解码 | 手势识别 GestureDetector | 滑动计算类 Scroller | 代码示例 )
|
存储 Android开发 索引
【Android 应用开发】多点触控 ( 多点触控事件 | PointerId | PointerIndex | 坐标获取 | 触摸点个数 )
【Android 应用开发】多点触控 ( 多点触控事件 | PointerId | PointerIndex | 坐标获取 | 触摸点个数 )
315 0
|
Android开发
Android手势操作耍起来!
目录 前言 初步了解手势操作 六个重写方法 小栗子体验一下 别忘了双击事件 最后 前言 手势操作是Android交互当中至关重要的. 可以说, 如果一个软件没有好的手势操作, 就不能将其定义为移动端的软件.
1031 0