最近在研究场景切换的动画效果,其中需要用到三连击的动作触发。三连击,即点三下屏幕,但意义上是双击效果。 因此,我需要研究如何识别三连击的动作。

我们知道,一般的View只能响应点击(Click)和长按(LongPress)事件。这是因为View里只暴露了这些listener给我们使用。而实质上,View是在onTouchEvent(MotionEvent event)里对用户的动作做了一定的分析,从而通知我们是发生了点击还是长按等事件。

View里提供的回调在我描述的场景里,并不能满足要求。因此,GestureDetector出场了。我需要对其啃透才能写出自己的ActionDetector。

GestureDetector类可以帮助我们分析用户的动作,和View的onTouchEvent的处理方式差不多,但分析的动作类型更加细致,以下是它的回调接口:

public interface OnGestureListener {

// Touch down时触发, e为down时的MotionEvent

boolean onDown(MotionEvent e);

// 在Touch down之后一定时间(115ms)触发,e为down时的MotionEvent

void onShowPress(MotionEvent e);

// Touch up时触发,e为up时的MotionEvent

boolean onSingleTapUp(MotionEvent e);

// 滑动时触发,e1为down时的MotionEvent,e2为move时的MotionEvent

boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY);

// 在Touch down之后一定时间(500ms)触发,e为down时的MotionEvent

void onLongPress(MotionEvent e);

// 滑动一段距离,up时触发,e1为down时的MotionEvent,e2为up时的MotionEvent

boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY);

}

public interface OnDoubleTapListener {

// 完成一次单击,并确定没有二击事件后触发(300ms),e为down时的MotionEvent

boolean onSingleTapConfirmed(MotionEvent e);

// 第二次单击down时触发,e为第一次down时的MotionEvent

boolean onDoubleTap(MotionEvent e);

// 第二次单击down,move和up时都触发,e为不同时机下的MotionEvent

boolean onDoubleTapEvent(MotionEvent e);

}

有了这么多的回调消息,我们就能更加方便的对用户的动作进行响应,那么,这个类如何使用呢?以下是使用该类的一个范例:

private GestureDetector mGestureDetector;

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

mGestureDetector = new GestureDetector(this, new MyGestureListener());

}

@Override

public boolean onTouchEvent(MotionEvent event) {

return mGestureDetector.onTouchEvent(event);

}

class MyGestureListener extends GestureDetector.SimpleOnGestureListener{

@Override

public boolean onSingleTapUp(MotionEvent ev) {

Log.d("onSingleTapUp",ev.toString());

return true;

}

@Override

public void onShowPress(MotionEvent ev) {

Log.d("onShowPress",ev.toString());

}

@Override

public void onLongPress(MotionEvent ev) {

Log.d("onLongPress",ev.toString());

}

}

基本的内容就是创建一个GestureDetector的对象,传入listener对象,在自己接收到的onTouchEvent中将event传给GestureDetector进行分析,listener会回调给我们相应的动作。其中GestureDetector.SimpleOnGestureListener(Framework帮我们简化了)是实现了上面提到的OnGestureListener和OnDoubleTapListener两个接口的类,我们只需要继承它并重写其中我们关心的回调即可。

最后,再提一下双击和三击的识别过程:在第一次单击down时,给Hanlder发送了一个延时300ms的消息,如果300ms里,发生了第二次单击的down事件,那么,就认为是双击事件了,并移除之前发送的延时消息。如果300ms后仍没有第二次的down消息,那么就判定为SingleTapConfirmed事件(当然,此时用户的手指应已完成第一次点击的up过程)。三击的判定和双击的判定类似,只是多了一次发送延时消息的过程,有意思吧~~~嘿嘿~~~

浅析GestureDetector相关推荐

  1. Flutter InkWell 动画浅析

    背景 最近在开发 Flutter 项目过程中遇到了一个很有意思的 bug,如果页面在 InkWell 动画期间弹出一个 Dialog,那么 InkWell 的动画效果不会消失,如下图右上角所示.以此为 ...

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

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

  3. 浅析 JavaScript 中的 函数 uncurrying 反柯里化

    柯里化 柯里化又称部分求值,其含义是给函数分步传递参数,每次传递参数后部分应用参数,并返回一个更具体的函数接受剩下的参数,这中间可嵌套多层这样的接受部分参数函数,直至返回最后结果. 因此柯里化的过程是 ...

  4. 浅析Python中bytes和str区别

    本博转载自:Chown-Jane-Y的浅析Python3中的bytes和str类型 Python 3最重要的新特性之一是对字符串和二进制数据流做了明确的区分.文本总是Unicode,由str类型表示, ...

  5. 学习《Linux设备模型浅析之设备篇》笔记(深挖一)

    这篇文章既然说了是浅析,那就是跳过了一些东西,我们把这些跳过的东西给它尽可能的补回来 今天登陆 lxr.free-electrons.com 发现内核版本已经升级到3.15了,那以后都使用3.15的源 ...

  6. 学习《Linux设备模型浅析之设备篇》笔记(一)

    最近在学习Linux设备模型,前面几篇文章也是读这篇的时候遇到问题,然后为了搞清楚先转去摸索才写出来的. 当然了,刚开始是先读到<Linux那些事儿之我是Sysfs>,搞不清楚才去读的&l ...

  7. 架构周报| 浅析MySQL JDBC连接配置上的两个误区

    经典案例 \\ 浅析MySQL JDBC连接配置上的两个误区:相信使用MySQL的同学都配置过它的JDBC驱动,多数人会直接从哪里贴一段URL过来,然后稍作修改就上去了,对应的连接池配置也是一样的,很 ...

  8. 超级账本(Hyperledger Fabric)之权限管理浅析

    链客,专为开发者而生,有问必答! 此文章来自区块链技术社区,未经允许拒绝转载. 超级账本(Hyperledger Fabric)之权限管理浅析 超级账本是联盟链的代表,而其相对于共链(例如比特币,以太 ...

  9. linux内核SMP负载均衡浅析

    需求       在<linux进程调度浅析>一文中提到,在SMP(对称多处理器)环境下,每个CPU对应一个run_queue(可执行队列).如果一个进程处于TASK_RUNNING状态( ...

  10. CAS、原子操作类的应用与浅析及Java8对其的优化

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 作者:CoderBear juejin.im/post/5c7a8 ...

最新文章

  1. 【从零开始的ROS四轴机械臂控制】(七)- ROS与arduino连接
  2. 近一个月的学习总结(4.8—5.12)
  3. 关于如何在你的Web项目中实现对空间数据访问权限的控制(一)
  4. UBOOT 2011-3版本分析(初步感受)
  5. 第三十六讲:用好共享内存工具:Slab管理器
  6. Java实训项目2:GUI学生信息管理系统 - 系统概述
  7. mysql卸载rpm包_mysql彻底卸载(rpm安装包)
  8. 虚拟机里linux7关不了,虚拟机上CentOS 7关闭防火墙操作
  9. python课程价格-python课程价格
  10. 这些进程的后台可靠运行命令你都知道了吗
  11. [BZOJ] 1040: [ZJOI2008]骑士
  12. java中excel转jpg_Java中excel转换为jpg/png图片 采用aspose-cells-18.6.jar
  13. 前端杂烩——在工作,在思考,在沉淀
  14. 实验8 OpenGL太阳系动画
  15. CVPR2017-如何在无标签数据集上训练模型
  16. Chrome浏览器设置打开书签时在新标签页打开(保姆级图文)
  17. 趁着时光正好,好好去爱她
  18. 【数据压缩】WAV文件和AVI文件格式分析
  19. 智能电话机器人(AI语音机器人)是什么
  20. 【每日笔记】:layui表单checkbox设为必选

热门文章

  1. 栈应用—括号匹配问题
  2. Solr分析器IK-analyzer配置及错误java.lang.AbstractMethodError解决
  3. mdac版本过低怎么解决_工业铝型材硬度过低怎么解决
  4. python覆盖数据库重复数据_如何在数据库中插入唯一数据/处理重复数据
  5. 为什么 Flink 无法实时写入 MySQL?
  6. android自定义GifView显示gif动画
  7. 多维多重背包问题_动态规划--背包问题
  8. php 异步执行脚本,PHP语言实现脚本异步执行_PHP教程
  9. 42表盘直径是从哪测量_爱彼15703和15710区别在哪?背透和密底哪个更好?
  10. getvalue参数计数不匹配_数据人:不懂业务,分析就仅仅只是提数