一直认为android手势识别很是神奇,我们不分析复杂的手势,仅仅是针对上一次的基本事件的手势处理,分析GestureDetector的源码,来看一下到底手势事件是如何定义的。

GestureDetector使用的时候要new一个对象然后使用手势处理器的ontouchevent进行处理event事件。实际上就是android给你处理好了各种事件,然后让你做一个接口回调,给你回调所需要的手势事件。

首先来说可以实现的事件:单击,双击,长按,移动,滑动。然后还有一些down事件,up事件。其实主要就是前面的事件。

tip:有必要描述一下这些事件究竟是什么?单击是在规定的单击时间内的down+up。长按和单击一样只不过时间要长。双击就是两个单击事件,但是间隔要在规定的时间内,移动也就是onscroll主要就是actionmove的监听,当move的时候就会回调onscroll。滑动就是up事件结束后,由于移动,你的x,y的变换速度超过一定值,就可以认为是onfling。

在ontouchevent中处理这些事件的始末。

在手势识别里有一个Handler,也就是说其实android和时间有关的东西大都是使用handler处理的比如延时消息,而且,在处理函数中在嵌套一个延时消息就是一个定时器了!这里只处理3种消息tap,showpress,longpress。其他的都是通过回调实现的。

1双击事件的处理,actiondown中首先判断是消息队列中是否有tap,假如有就说明之前已经有一个action事件了,也就是说可以进行双击判断,需要判断的有两个,一个就是两个action事件的时间间隔,另一个就是点击的距离不能太远。假如这些都是满足的就说明这个是双击事件。在执行双击回调的时候会回调onDoubleTap和onDoubleTapEvent分别传递的是第一个actiondown和第二个actiondown事件。

tip:其中有一些细节要注意:为什么这里消息队列中有action事件,就可以判断双击,万一是上一个单击事件呢?那样单击事件岂不是屏蔽了?其实这也就是为什么检测的是tap,单击事件是showpress。tap只是检测一个down事件。还有一点要分清的就是在down的时候会向消息对列中放3个消息,一个tap检测双击,showpress检测单击,longpress检测长按。互不影响。

action_down一定会执行的方法就是回调ondown。

2.单击和长按,这两个事件的原理是一样的,就是向消息队列中发一个 延时消息,等到延时消息到了时候就会执行对应的回调,注意有时间参数,showpress的是300ms而longpress的是500ms.还有一点:down事件执行的时候会发生这两个延时消息,但是假如后续方法move或者是up了就会从消息队列中移除这些消息。其实move的时候小范围的移动还是允许的。移除消息,就是遵循规定,在这一类的消息中不可以有move事件出现,另外up就是说假如时间还没到就up,那么事件回调就不会执行了,比如长按事件短,长按的事件回调就不执行。

3.移动,就是当调用actionmove的时候就会调用的方法,用来回调移动了的距离scrollX和scrollY。

4.滑动,这个是使用了一个速率的计数velocityTracker计算了1s内的移动速率,当移动速率超过了预定的时候,就说明这是使用fling了,就进行回调onfling方法,传递变化速率velocityX, velocityY。这个是在up了之后才会调用的方法。

明白了手势的原理之后,才可以根据不同的手势事件来进行自定义处理。

android view:手势的更多相关文章

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

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

  2. android GestureDetector 手势基础

    1. 当用户触摸屏幕的时候,会产生许多手势,例如down,up,scroll,filing等等,我们知道View类有个View.OnTouchListener内部接口,通过重写他的onTouch(Vi ...

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

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

  4. Android Gesture 手势创建以及使用示例

    在Android1.6的模拟器里面预装了一个叫Gestures Builder的程序,这个程序就是让你创建自己的手势的(Gestures Builder的源代码在sdk问samples里面有,有兴趣可 ...

  5. Android View 的事件分发原理解析

    作为一名 Android 开发者,每天接触最多的就是 View 了.Android View 虽然不是四大组件,但其并不比四大组件的地位低.而 View 的核心知识点事件分发机制则是不少刚入门同学的拦 ...

  6. Android View相关知识问答

    Android View相关核心知识问答 Activity Window View之间的三角关系 你真的了解View的坐标吗? 在渲染前获取 View 的宽高 5种手势工具类 浅析Android的窗口

  7. 虾扯蛋:Android View动画 Animation不完全解析

    本文结合一些周知的概念和源码片段,对View动画的工作原理进行挖掘和分析.以下不是对源码一丝不苟的分析过程,只是以搞清楚Animation的执行过程.如何被周期性调用为目标粗略分析下相关方法的执行细节 ...

  8. Android View.setId(int id) 用法

    Android View.setId(int id) 用法 当要在代码中动态的添加View并且为其设置id时,如果直接用一个int值时,Studio会警告. 经过查询,动态设置id的方法有两种; 1. ...

  9. android view 中各函数的执行顺数

    这个就好像是 activity 的生命周期一样,如果我们要使用自定义的 view,那么就很有必要了解一下 view 的那些能够被重写的函数的执行顺序.废话不多讲,以常用的5个函数为例子,见下文: pa ...

  10. Android项目部署时,发生AndroidRuntime:android.view.InflateException: Binary XML file line #168: Error inflating class错误

    这个错误也是让我纠结了一天,当时写的项目在安卓虚拟机上运行都很正常,于是当我部署到安卓手机上时,点击登陆按钮跳转到用户主界面的时候直接结束运行返回登陆界面.    当时,我仔细检查了一下自己的代码,并 ...

随机推荐

  1. EasyUI相关

    失去焦点事件 validType:'length[4,15]',events:{blur: function(){}} 添加自定义属性 $.extend($.fn.validatebox.defaul ...

  2. 关于app的具体实施

    鉴于我们小组做的app是关于在线做题和游戏相融合的,所以,我会先学习UI设计,毕竟好的UI设计不仅会给用户耳目一新的体验,同时还会让用户愿意去包容一些小BUG,但如果你的软件做的非常好,功能提供的很全 ...

  3. SQL Server数据库备份:通过Windows批处理命令执行

    通过Windows批处理命令执行SQL Server数据库备份 建立mybackup.bat ,输入以下内容直接运行该脚本,即可开始自动备份数据库也可把该脚本加入windows任务计划里执行. --- ...

  4. WEB安全性测试

    SQL注入   所谓SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令.具体来说,它是利用现有应用程序,将(恶意)的SQL命令 ...

  5. jquery中链式调用原理

    (1).链式调用 $("#mybtn").css("width","100px") .css("height",&quo ...

  6. jQuery使用ajaxSubmit()提交表单示例

    ajaxSubmit(obj)方法是jQuery的一个插件jquery.form.js里面的方法,所以使用此方法需要先引入这个插件.如下所示:   代码如下: <script src=" ...

  7. Xcode7免证书真机调试

    最近一直忙于项目,对于Xcode7的一些新功能还没去尝试,今天尝试了下挺好用的!避免了以前真机调试繁琐的配置,很是爽啊.又可以节约很多小伙伴的时间了.废话不多说咱们一起来配置一下. 第一步 打开需要真 ...

  8. mysql sql语句大全

    1.说明:创建数据库 CREATE DATABASE database-name 2.说明:删除数据库 drop database dbname 3.说明:备份sql server --- 创建 备份 ...

  9. pod

    在运行 “sudo gem install cocoapods” 的时候出现问题:ERROR: While executing gem ... (Errno::EPERM)Operation not ...

  10. codeforces 727F. Polycarp's problems

    题目链接:http://codeforces.com/contest/727/problem/F 题目大意:有n个问题,每个问题有一个价值ai,一开始的心情值为q,每当读到一个问题时,心情值将会加上该 ...