android view:手势
一直认为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:手势的更多相关文章
- Android 触摸手势基础 官方文档概览
Android 触摸手势基础 官方文档概览 触摸手势检测基础 手势检测一般包含两个阶段: 1.获取touch事件数据 2.解析这些数据,看它们是否满足你的应用所支持的某种手势. 相关API: Moti ...
- android GestureDetector 手势基础
1. 当用户触摸屏幕的时候,会产生许多手势,例如down,up,scroll,filing等等,我们知道View类有个View.OnTouchListener内部接口,通过重写他的onTouch(Vi ...
- Android 触摸手势基础 官方文档概览2
Android 触摸手势基础 官方文档概览 触摸手势检测基础 手势检测一般包含两个阶段: 1.获取touch事件数据 2.解析这些数据,看它们是否满足你的应用所支持的某种手势. 相关API: Moti ...
- Android Gesture 手势创建以及使用示例
在Android1.6的模拟器里面预装了一个叫Gestures Builder的程序,这个程序就是让你创建自己的手势的(Gestures Builder的源代码在sdk问samples里面有,有兴趣可 ...
- Android View 的事件分发原理解析
作为一名 Android 开发者,每天接触最多的就是 View 了.Android View 虽然不是四大组件,但其并不比四大组件的地位低.而 View 的核心知识点事件分发机制则是不少刚入门同学的拦 ...
- Android View相关知识问答
Android View相关核心知识问答 Activity Window View之间的三角关系 你真的了解View的坐标吗? 在渲染前获取 View 的宽高 5种手势工具类 浅析Android的窗口
- 虾扯蛋:Android View动画 Animation不完全解析
本文结合一些周知的概念和源码片段,对View动画的工作原理进行挖掘和分析.以下不是对源码一丝不苟的分析过程,只是以搞清楚Animation的执行过程.如何被周期性调用为目标粗略分析下相关方法的执行细节 ...
- Android View.setId(int id) 用法
Android View.setId(int id) 用法 当要在代码中动态的添加View并且为其设置id时,如果直接用一个int值时,Studio会警告. 经过查询,动态设置id的方法有两种; 1. ...
- android view 中各函数的执行顺数
这个就好像是 activity 的生命周期一样,如果我们要使用自定义的 view,那么就很有必要了解一下 view 的那些能够被重写的函数的执行顺序.废话不多讲,以常用的5个函数为例子,见下文: pa ...
- Android项目部署时,发生AndroidRuntime:android.view.InflateException: Binary XML file line #168: Error inflating class错误
这个错误也是让我纠结了一天,当时写的项目在安卓虚拟机上运行都很正常,于是当我部署到安卓手机上时,点击登陆按钮跳转到用户主界面的时候直接结束运行返回登陆界面. 当时,我仔细检查了一下自己的代码,并 ...
随机推荐
- js语法重点
1:最新的ES6规范引入了新的数据类型Map:var m = new Map([['Michael', 95], ['Bob', 75], ['Tracy', 85]]);m.get('Michael ...
- java selenium (九) 常见web UI 元素操作 及API使用
本篇介绍我们如何利用selenium 来操作各种页面元素 阅读目录 链接(link) <div> <p>链接 link</p> <a href=" ...
- RMAN 前期准备工作和实例
理解恢复目录,RMAN可以在没有恢复目录(NOCATALOG)下运行,这个时候备份信息保存在控制文件.保存在控制文件的备份信息是很危险的,如果控制文件的破坏将导致备份信息的丢失与恢复的失败,而且,没有 ...
- js对特殊字符转义、时间格式化、获取URL参数
/*特殊字符转义*/ function replace_html(str) { var str = str.toString().replace(/&/g, "&" ...
- 基于KEIL4开发ARM9(S3C2440)的裸机程序
本文主要介绍如何使用Keil4开发ARM9(S3C2440)裸机程序. 说明: 一.平台: 操作系统:Windows XP系统 KEIL版本:4.73 开发板:ARM9(S3C2440) 二.建立工程 ...
- sphinx全文检索功能 | windows下测试 (一)
前一阵子尝试使用了一下Sphinx,一个能够被各种语言(PHP/Python/Ruby/etc)方便调用的全文检索系统.网上的资料大多是在linux环境下的安装使用,当然,作为生产环境很有必要部署在* ...
- 书旗小说app点评
书旗小说这个手机软件用了好久了,大一的时候就开始用,业余无聊时间可以看一看网络小说打发一下时间. 书旗免费小说是一款内容以免费小说书旗网为基础的在线阅读器,除了拥有传统阅读器的书籍同步阅读.全自动书签 ...
- nRF24L01芯片控制——迈向无线的第一步
nRF24L01芯片是一款专供单片机的射频收发芯片.工作于2.4GHz~2.5GHz ISM频段.融合了shockburst技术. 我先列出该芯片的硬件参数资料: 至于每个引脚的具体用途,可以参见技术 ...
- 【Python⑥】python的缩进,条件判断和循环
缩进 Python的最大特色是用缩进来标明成块的代码. 这点和其他语言区别很明显,比如大家熟悉的C语言里: ) { num+=; flag-=; } 而在python中: if flag>= 0 ...
- 最强密码 (百度之星复赛 T5)
题目大意: 给出一个字符串A,要求最短的字符串B,B不是A的子序列. 求最短长度 和 最短的字符串个数 |A|<=105. 题解: 1.比赛的时候没有想出来,时隔一个多月又看到了这道题,虽 ...