(1)背景

当用户触摸屏幕的时候,会产生许多手势,例如down,up,scroll,filing等等,我们知道View类有个View.OnTouchListener内部接口,通过重写他的onTouch(View v, MotionEvent event)方法,我们可以处理一些touch事件,但是这个方法太过简单,如果需要处理一些复杂的手势,Android SDK给我们提供了GestureDetector(Gesture:手势Detector:识别)类,通过这个类我们可以识别很多的手势,主要是通过他的onTouchEvent(event)方法完成了不同手势的识别。虽然他能识别手势,但是不同的手势要怎么处理,应该是提供给程序员实现的,因此这个类对外提供了两个接口:OnGestureListener,OnDoubleTapListener,还有一个内部类SimpleOnGestureListener,SimpleOnGestureListener类是GestureDetector提供给我们的一个更方便的响应不同手势的类,这个类实现了上述两个接口。

(2)SimpleOnGestureListener

通过GestureDetector的构造方法可以将SimpleOnGestureListener对象传递进去,这样GestureDetector能处理不同的手势了。

下面是个简单的例子,首先重写GestureDetector类:

import android.view.GestureDetector.SimpleOnGestureListener;
import android.view.MotionEvent;  /** 点击一下非常快的(不滑动)Touchup:  onDown->onSingleTapUp->onSingleTapConfirmed  点击一下稍微慢点的(不滑动)Touchup:  onDown->onShowPress->onSingleTapUp->onSingleTapConfirmed */
public class MyGestureDetector extends SimpleOnGestureListener {  //双击的第二下Touch down时触发 @Override  public boolean onDoubleTap(MotionEvent e) {  System.out.println("*********onDoubleTap*******");  return super.onDoubleTap(e);  }  //双击的第二下Touch down和up都会触发,可用e.getAction()区分。  @Override  public boolean onDoubleTapEvent(MotionEvent e) {  System.out.println("*********onDoubleTapEvent*******");  return super.onDoubleTapEvent(e);  }  //Touch down时触发  @Override  public boolean onDown(MotionEvent e) {  System.out.println("*********onDown*******");  return super.onDown(e);  }  //Touch了滑动一点距离后,up时触发。  @Override  public boolean onFling(MotionEvent e1, MotionEvent e2, float x,  float y) {  System.out.println("*********onFling*******" + x + "******" + y);  return super.onFling(e1, e2, x, y);  }  //Touch了不移动一直Touch down时触发  @Override  public void onLongPress(MotionEvent e) {  System.out.println("*********onLongPress*******");  super.onLongPress(e);  }  /**Touch了滑动时触发。  输出x,y值 向上划动y为正,向左划时x为正 e1为划动时的Event,e2,为划动后的Event */  @Override  public boolean onScroll(MotionEvent e1, MotionEvent e2, float x,  float y) {  System.out.println("*********onScroll*******" + x + "*******" + y);  return super.onScroll(e1, e2, x, y);  }  /** Touch了还没有滑动时触发  onDown只要Touch down一定立刻触发。  而Touchdown后过一会没有滑动先触发onShowPress再是onLongPress。  所以Touchdown后一直不滑动,onDown->onShowPress->onLongPress这个顺序触发。 */  @Override  public void onShowPress(MotionEvent e) {  System.out.println("*********onShowPress*******");  super.onShowPress(e);  }  //和onSingleTapup不一样,当监听器确定没有第二次按下事件时,才调用此方法,也就是onSingleTapUp不能确定是单击还是双击,而此方法响应可以确定一定是单击 @Override  public boolean onSingleTapConfirmed(MotionEvent e) {  System.out.println("*********onSingleTapConfirmed*******");  return super.onSingleTapConfirmed(e);  }  //只要按下就会调用此方法,当双击时,第一次按下时会调用此方法,而第二次不会调用 @Override  public boolean onSingleTapUp(MotionEvent e) {  System.out.println("*********onSingleTapUp*******");  return super.onSingleTapUp(e);  }
}
public class AaActivity extends Activity {  MyGestureDetector myGestureDetector = null;  GestureDetector gestureDetector = null;  @Override  public void onCreate(Bundle savedInstanceState) {  super.onCreate(savedInstanceState);  setContentView(R.layout.main);  gestureDetector = new GestureDetector(this, new MyGestureDetector());  }  @Override  public boolean onTouchEvent(MotionEvent event) {  return gestureDetector.onTouchEvent(event);  }
}
//这两个函数都是在touch down后又没有滑动(onScroll),又没有长按(onLongPress),然后Touchup时触发
boolean  onSingleTapConfirmed(MotionEvent e)
boolean  onSingleTapUp(MotionEvent e)//Touch了不移动一直Touch down时触发
void  onLongPress(MotionEvent e)//Touch了滑动时触发
boolean  onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY)//Touch了滑动一点距离后,up时触发
boolean  onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY)/*Touch了还没有滑动时触发
(与onDown,onLongPress比较,onDown只要Touch down一定立刻触发。而Touchdown后过一会没有滑动先触发onShowPress再是onLongPress。所以Touchdown后一直不滑动,onDown->onShowPress->onLongPress这个顺序触发。)
*/
void  onShowPress(MotionEvent e)//Touch down时触发
boolean  onDown(MotionEvent e)//双击的第二下Touch down时触发
boolean  onDoubleTap(MotionEvent e)//双击的第二下Touch down和up都会触发,可用e.getAction()区分
boolean  onDoubleTapEvent(MotionEvent e)
  • 点击屏幕上的某项的执行流程 有两种情况,一种是时间很短,一种时间稍长
    时间很短:onDown–>onSingleTapUp–>onSingleTapConfirmed
    时间稍长:onDown–>onShowPress–>onSingleTapUp–>onSingleTapConfirmed
  • 长按事件:onDown–>onShowPress–>onLongPress
  • 拖动:手指触动屏幕后,稍微滑动后立即松开
    onDown–>onScroll–>onScroll–>………–>onFling

(3)ScaleGestureDetector

ScaleGestureDetector这个类是专门用来检测两个手指在屏幕上做缩放的手势用的,最简单的应用就是用来缩放图片或者缩放网页。
这个类通常与GestureDetector一起存在,用来处理复杂的手势操作。
通常是单手指和双手指操作,所以通常存在一个判断手指个数然后分发事件的处理方法。

//SimpleOnGestureListener implements OnGestureListener, OnDoubleTapListenerclass ZoomGesture extends GestureDetector.SimpleOnGestureListener {//单手指操作@Override //双击public boolean onDoubleTap(MotionEvent e) {System.out.println("--onDoubleTap---");return true;}@Overridepublic boolean onDoubleTapEvent(MotionEvent e) {System.out.println("--onDoubleTapEvent---");return super.onDoubleTapEvent(e);}}//SimpleOnScaleGestureListener implements OnScaleGestureListenerclass ScaleGesture extends ScaleGestureDetector.SimpleOnScaleGestureListener {//双手指操作@Overridepublic boolean onScale(ScaleGestureDetector detector) {detector.getCurrentSpan();//两点间的距离跨度detector.getCurrentSpanX();//两点间的x距离detector.getCurrentSpanY();//两点间的y距离detector.getFocusX();      //detector.getFocusY();     //detector.getPreviousSpan();   //上次detector.getPreviousSpanX();//上次detector.getPreviousSpanY();//上次detector.getEventTime();    //当前事件的事件detector.getTimeDelta();    //两次事件间的时间差detector.getScaleFactor();  //与上次事件相比,得到的比例因子return true;}   }
private GestureDetector gestureDetector; //手势探测器
private ScaleGestureDetector scaleGestureDetector;//比率手势探测器
gestureDetector = new GestureDetector(context, new ZoomGesture());
scaleGestureDetector = new ScaleGestureDetector(context, new ScaleGesture());public boolean onTouchEvent(MotionEvent event) {//单点gestureDetector.onTouchEvent(event);//双点 scaleGestureDetector.onTouchEvent(event);return true;

Android手势GestureDetector分析(一)——应用相关推荐

  1. android第三方手势,Android手势---GestureDetector

    GestureDetector 可以使用 MotionEvents 检测各种手势和事件. 这个类只能用于检测触摸事件的 MotionEvent GestureDetector有三个内部接口,两个内部类 ...

  2. Android 手势—— GestureDetector 和 SimpleOnScaleGestureListener (手势缩放)

    GestureDetector 的作用: 检测各种手势和事件,使用的使用一般和onTouchEvent 方法结合在一起使用 下面主要说的内容是GestureDetector 和 ScaleGestur ...

  3. Android使用GestureDetector实现手势滑动效果

    直接看实例: package com.example.gesturedetector;import android.os.Bundle; import android.app.Activity; im ...

  4. Android手势使用之 GestureDetector

    Android中对触摸事件的处理使用的是onTouchEvent,如果你对这块只是还不是很熟练,请查看我的另一篇文章: android触摸事件处理逻辑 如果要在处理监听里面自己去写手势处理不是不可以, ...

  5. 关于Android手势检测GestureDetector的应用笔记

    关于Android手势检测 代码参照Android 手势检测 OnDown(MotionEvent e) 用户按下屏幕就会触发: onFling(MotionEvent e1, MotionEvent ...

  6. android手势密码csdn,Android手势密码LockPatternView、LockPasswordUtils、LockPatternUtils等分析...

    Android手势密码LockPatternView.LockPasswordUtils.LockPatternUtils 在使用别人写的这个手势密码的时候,我们通常是有自己的需求,可能这里的代码很多 ...

  7. android 手势放缩_手把手教你打造支持手势放大缩小的ImageView

    写在前面 最近有了新的任务,学习的时间比以前少了不少,Java回炉的文估计是得缓缓了,不过每周一篇尽量保质保量.最近感觉我文写的有点不好,因为我写东西除非必要,不然概念性的东西我基本上都是一笔带过-- ...

  8. Android LayoutInflater原理分析,带你一步步深入了解View

    Android视图绘制流程完全解析,带你一步步深入了解View(一) 转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/12921889 ...

  9. Android 手势返回上一界面 亲测可用

    在现如今,Android使用越来越便捷,也对Android开发提出更高要求,便捷体现在开发的每一处. 这里介绍Android使用手势返回上一界面.亲测可用! 一.思考: 1. 监听可手势返回上一界面的 ...

最新文章

  1. eclipse插件之easyshell
  2. php怎么爬取亚马逊的数据,使用PHP从Amazon MWS API获取订单数据
  3. pycharm中import呈现灰色原因
  4. GDCM:gdcm::ServiceClassUser的测试程序
  5. CSS布局之脱离文档流详解——浮动、绝对定位脱离文档流的区别
  6. HTML 5 各浏览器支持情况
  7. mimemultipart java_最佳实践 – 发送javamail mime multipart电子邮件和gmail
  8. abp vnext_SQL Server vNext – Microsoft是否喜欢Linux?
  9. 业务逻辑?到底是什么
  10. linux web部署命令简单记录
  11. Excel快速实现中英文分列
  12. VSCode项目启动与调试配置
  13. 《R语言与数据挖掘》⑥-④分类与预测建模【KNN算法】
  14. 硬盘分区工具找不到硬盘该怎么办
  15. ios 字体 机打动效_24种打动朋友的方法
  16. 2021-10-27 基于电影数据库的简单查询(数据库第二次实验)
  17. yocto 更新补丁方法
  18. 代码传奇 | 身价10亿的程序员 雷军当年也为他打工——WPS之父 求伯君
  19. 【Robomaster】电控入门手册
  20. 【C语言】do-while()循环

热门文章

  1. 怎样用python绘制简单的图形_用python 画几个简单图案
  2. 高德Api绘制线路轨迹
  3. Java与SQL server连接错误及解决
  4. SQLScout——AndroidStudio插件(Sqlite神器)
  5. ETL常用的三种工具介绍及对比 Datastage,Informatica 和 Kettle
  6. ​分享35条大佬赚钱心得!建议收藏
  7. Microsoft办公软件在Mac上打开特别慢怎么办
  8. Laravel 5.1 使用短信验证码插件laravel-sms
  9. 突然看到了java程序员35岁的样子
  10. Windows热键失效怎么办?