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

  1. public class 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. public boolean 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. return true;
  12. case (MotionEvent.ACTION_MOVE) :
  13. Log.d(DEBUG_TAG,"Action was MOVE");
  14. return true;
  15. case (MotionEvent.ACTION_UP) :
  16. Log.d(DEBUG_TAG,"Action was UP");
  17. return true;
  18. case (MotionEvent.ACTION_CANCEL) :
  19. Log.d(DEBUG_TAG,"Action was CANCEL");
  20. return true;
  21. case (MotionEvent.ACTION_OUTSIDE) :
  22. Log.d(DEBUG_TAG,"Movement occurred outside bounds " +
  23. "of current screen element");
  24. return true;
  25. default :
  26. return super.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呢,官方的是这样解释的:

GestureDetectorCompat实例化有下面两种方法:

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

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

  1. public class MainActivity extends Activity implements
  2. GestureDetector.OnGestureListener,
  3. GestureDetector.OnDoubleTapListener{
  4. private static final String DEBUG_TAG = "Gestures";
  5. private GestureDetectorCompat mDetector;
  6. // Called when the activity is first created.
  7. @Override
  8. public void 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. public boolean onTouchEvent(MotionEvent event){
  21. this.mDetector.onTouchEvent(event);
  22. // Be sure to call the superclass implementation
  23. return super.onTouchEvent(event);
  24. }
  25. @Override
  26. public boolean onDown(MotionEvent event) {
  27. Log.d(DEBUG_TAG,"onDown: " + event.toString());
  28. return true;
  29. }
  30. @Override
  31. public boolean onFling(MotionEvent event1, MotionEvent event2,
  32. float velocityX, float velocityY) {
  33. Log.d(DEBUG_TAG, "onFling: " + event1.toString()+event2.toString());
  34. return true;
  35. }
  36. @Override
  37. public void onLongPress(MotionEvent event) {
  38. Log.d(DEBUG_TAG, "onLongPress: " + event.toString());
  39. }
  40. @Override
  41. public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX,
  42. float distanceY) {
  43. Log.d(DEBUG_TAG, "onScroll: " + e1.toString()+e2.toString());
  44. return true;
  45. }
  46. @Override
  47. public void onShowPress(MotionEvent event) {
  48. Log.d(DEBUG_TAG, "onShowPress: " + event.toString());
  49. }
  50. @Override
  51. public boolean onSingleTapUp(MotionEvent event) {
  52. Log.d(DEBUG_TAG, "onSingleTapUp: " + event.toString());
  53. return true;
  54. }
  55. @Override
  56. public boolean onDoubleTap(MotionEvent event) {
  57. Log.d(DEBUG_TAG, "onDoubleTap: " + event.toString());
  58. return true;
  59. }
  60. @Override
  61. public boolean onDoubleTapEvent(MotionEvent event) {
  62. Log.d(DEBUG_TAG, "onDoubleTapEvent: " + event.toString());
  63. return true;
  64. }
  65. @Override
  66. public boolean onSingleTapConfirmed(MotionEvent event) {
  67. Log.d(DEBUG_TAG, "onSingleTapConfirmed: " + event.toString());
  68. return true;
  69. }
  70. }

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

  1. public class MainActivity extends Activity {
  2. private GestureDetectorCompat mDetector;
  3. @Override
  4. public void onCreate(Bundle savedInstanceState) {
  5. super.onCreate(savedInstanceState);
  6. setContentView(R.layout.activity_main);
  7. mDetector = new GestureDetectorCompat(this, new MyGestureListener());
  8. }
  9. @Override
  10. public boolean onTouchEvent(MotionEvent event){
  11. this.mDetector.onTouchEvent(event);
  12. return super.onTouchEvent(event);
  13. }
  14. class MyGestureListener extends GestureDetector.SimpleOnGestureListener {
  15. private static final String DEBUG_TAG = "Gestures";
  16. @Override
  17. public boolean onDown(MotionEvent event) {
  18. Log.d(DEBUG_TAG,"onDown: " + event.toString());
  19. return true;
  20. }
  21. @Override
  22. public boolean onFling(MotionEvent event1, MotionEvent event2,
  23. float velocityX, float velocityY) {
  24. Log.d(DEBUG_TAG, "onFling: " + event1.toString()+event2.toString());
  25. return true;
  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. public boolean onTouch(View v, MotionEvent event) {
  4. // ... Respond to touch events
  5. this.mDetector.onTouchEvent(event);
  6. return super.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

Android 触摸及手势操作GestureDetector的更多相关文章

  1. Android开发手记(30) 触摸及手势操作

    触摸操作在现在智能手机系统中起到举足轻重的作用,本文将对安卓中的触摸以及一些简单手势的操作进行简单的介绍. 1.触摸 首先是关于触摸的判断,有两种方法可以判断的触摸操作. (1)setOnTouchL ...

  2. android事件系列-onTouch事件与手势操作

    提示记忆:应用流程:在Activity中对控件执行 view.setOnTouchListener( OnTouchListener i);实现里面的OnTouchListener 接口中的方法,重点 ...

  3. Android上滑手势触发和不增加布局层级扩大点击区域

    最近项目中需要实现手势上滑或者点击滑出界面的效果,实现上是利用GestureDetector,然后在onFling中判断,但遇到一个问题:手势上滑是针对整个布局的,但如果有对单独的View设置点击监听 ...

  4. Android学习指南之三十八:Android手势操作编程[转]

    手势操作在我们使用智能设备的过程中奉献了不一样的体验.Android开发中必然会进行手势操作方面的编程.那么它的原理是怎样的呢?我们如何进行手势操作编程呢? 手势操作原理 首先,在Android系统中 ...

  5. Android 触摸手势基础 官方文档概览

    Android 触摸手势基础 官方文档概览 触摸手势检测基础 手势检测一般包含两个阶段: 1.获取touch事件数据 2.解析这些数据,看它们是否满足你的应用所支持的某种手势. 相关API: Moti ...

  6. Android 触摸手势基础 官方文档概览2

    Android 触摸手势基础 官方文档概览 触摸手势检测基础 手势检测一般包含两个阶段: 1.获取touch事件数据 2.解析这些数据,看它们是否满足你的应用所支持的某种手势. 相关API: Moti ...

  7. Android开发之手势滑动(滑动手势监听)详解

    Android开发之手势滑动(滑动手势监听)详解 在Android应用中,经常需要手势滑动操作,比如上下滑动,或左右方向滑动,处理手势滑动通常有两种方法:一种是单独实现setOnTouchListen ...

  8. JavaScript触摸与手势事件

    JavaScript触摸与手势事件 发表于 2012-12-10 由 admin iOS版Safari为了向开发人员传达一些特殊信息,新增了一些专有事件.因为iOS设备既没有鼠标也没有键盘,所以在为移 ...

  9. Javascript高级编程学习笔记(69)—— 事件(13)触摸与手势事件

    触摸与手势事件 由于移动设备既没有鼠标也没有键盘,所以在为移动浏览器开发交互性网页时,常规的鼠标键盘事件根本不够用 所以早期的苹果为Safari 添加了一些与触摸相关的事件 随着后面Android的W ...

随机推荐

  1. 如何更改Docker默认的images存储位置

    Docker的镜像以及一些数据都是在/var/lib/docker目录下,它占用的是Linux的系统分区,也就是下面的/dev/vda1,当有多个镜像时,/dev/vda1的空间可能不足,我们可以把d ...

  2. Github 入门基本操作

    翻译自:https://guides.github.com/activities/hello-world/ 文章概述: 什么是GitHub? 创建一个存储库 创建一个分支 做出承诺 打开拉请求 合并拉 ...

  3. oracle 查询 函数练习2

    /*以下代码是对emp表/dept表/salgrade表进行显示宽度设置 */col empno for 9999;col ename for a10;col job for a10;col mgr ...

  4. R语言的if-else

    语法问题,类似于for函数使用时必须把"{"放在当前行,而不可以独占一行.R的特色. 具体你的这个问题可以尝试 x <- 5 if (x>0){ print(" ...

  5. CSDN开源夏令营 百度数据可视化实践 ECharts(8)

    (1)前言 首先谢谢林峰老师,继续接着第七篇提到的内容.CSS布局确实非常累,感觉不好看了就的调整,总的看起来的高大上嘛.好了废话不再多说.今天主要就先解说一个页面的内容,对于CSS布局后面讲会具体的 ...

  6. C#面试题汇总2

    http://www.cnblogs.com/wangjisi/archive/2010/06/14/1758347.html 用.net做B/S结构的系统,您是用几层结构来开发,每一层之间的关系以及 ...

  7. NoSQL摘录

    NoSQL泛指非关系型数据库,诸如Cassandra.MongoDB.Neo4J和Riak等.它们主张使用无模式(schemaless)的数据,可以运行在集群环境中. 开源的NoSQL数据库:Redi ...

  8. 分布式协调服务ZooKeeper工作原理

    分布式协调服务ZooKeeper工作原理 原创 2016-02-19 杜亦舒 性能与架构 性能与架构 性能与架构 微信号 yogoup 功能介绍 网站性能提升与架构设计 大数据处理框架Hadoop.R ...

  9. 批量Linux、Windows管理工具BatchShell 1.2(最新版)

    简介: BatchShell是什么: BatchShell是一款基于SSH2的批量文件传输及命令执行工具,它可以同时传输文件到多台远程服务器以及同时对多台远程服务器执行命令.具备以下主要功能:     ...

  10. Atitit.angular.js 使用最佳实践 原理与常见问题解决与列表显示案例 attilax总结

    Atitit.angular.js 使用最佳实践 原理与常见问题解决与列表显示案例 attilax总结 1. 本文范围 1 2. Angular的优点 1 2.1. 双向数据绑定 1 2.2. dsl ...