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错误
这个错误也是让我纠结了一天,当时写的项目在安卓虚拟机上运行都很正常,于是当我部署到安卓手机上时,点击登陆按钮跳转到用户主界面的时候直接结束运行返回登陆界面. 当时,我仔细检查了一下自己的代码,并 ...
随机推荐
- Java Bean
Java 帝国之Java bean (上) Java 帝国之Java bean(下) Difference between DTO, VO, POJO, JavaBeans? Java bean 是个 ...
- 微信开发订阅号(ASP.NET MVC4+jquery mobile+AppHarbor发布)
首先应该去微信公众平台注册一个账号,因为我是用的个人,所以只能注册订阅号,然后需要提供身份证照片,这些大家慢慢折腾.然后在微信管理面板中选择高级功能,进入开发者模式. 在服务器配置中需要提供最重要的u ...
- css实现强制不换行/自动换行/强制换行
在我们日常的编码中经常会遇到这段文字不可以换行,或者自动换行的需求.虽然这个功能在我们平时很常见但是我相信大家一定不会可以的去记住它吧(至少小月是很懒惰的从来是用什么查什么 ♦ 嘻嘻...).今天我们 ...
- Visual Studio安装及单元测试
一.安装环境 操作系统版本:Win10中文版64位 CPU:i5-4200M 2.50GHz 硬盘内存:500G 二.软件版本 Visual Studio 2013 三.安装过程 1.首先开始安装, ...
- MFC之鼠标消息处理
今天学了点MFC的鼠标处理.用鼠标处理编写了一个小程序.在文本窗口内,绘制鼠标移动轨迹,当按下CTRL键时鼠标将变成十字,并且填充为蓝色的矩形. 第一步:建立单文的MFC程序,添加类CMouseDem ...
- Bootstrap<基础十五> 输入框组
Bootstrap 支持的另一个特性,输入框组.输入框组扩展自 表单控件.使用输入框组,可以很容易地向基于文本的输入框添加作为前缀和后缀的文本或按钮. 通过向输入域添加前缀和后缀的内容,您可以向用户输 ...
- 《Pro Express.js》学习笔记——概述
要学Node.js,先学Express.js. Express.js是Node.js官方推荐的基础框架. Express.js框架经过一系列的发展,已经到了4.x版本.新的版本解决了3.x之前版本的依 ...
- php ob_start()、ob_end_flush和ob_end_clean()多级缓冲
ob_start() 和 ob_end_flush() 是一对很好的搭档,可以实现对输出的控制.当成一对出现理解起来就没什么问题,但是当他们两个各自出现次数增加时,就比较难理解了. <?php ...
- 尝试利用CentOS环境安装LiteSpeed WEB服务环境的过程
对于普通的网站搭建的环境虚拟主机就足够使用,不过近期公司的网站需要上线VPS主机,于是采用到LNMP(http://lnmp.org/)一键包安装的,运行还是比较好的,这不最近我也开始尝试接触VPS方 ...
- vue.js2.0的独立构建和运行时构建
转自:https://jingsam.github.io/2016/10/23/standalone-vs-runtime-only-build-in-vuejs2.html?utm_source=t ...