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错误
这个错误也是让我纠结了一天,当时写的项目在安卓虚拟机上运行都很正常,于是当我部署到安卓手机上时,点击登陆按钮跳转到用户主界面的时候直接结束运行返回登陆界面. 当时,我仔细检查了一下自己的代码,并 ...
随机推荐
- Python笔记总结week4
1. Built-in functions 函数可能遇到的问题:下面例子函数改变了函数需要传入的参数 li = [11,22,33,44] def f1(arg): arg.append(55) ...
- 数据库 'MessageManage' 的事务日志已满。若要查明无法重用日志中的空间的原因,请参阅 sys.databases 中的 log_reuse_wait_desc 列。
提供两种办法:(SQL Server2008) 注意:建议使用第一种方法.第二种方法只是删除已有日志文件,日后还会继续生成. 第一种方法:清空日志. 1.打开企业管理器,直接在查询分析器里执行:(如果 ...
- SQL指定字段指定顺序排序
SELECT * FROM [ProjectInfo]ORDER BY (CASE DepartmentName WHEN 'AAA' THEN 1 WHEN 'BBB' THEN 2 WHEN 'C ...
- GDI+ 绘制经验
现有一种场景,鼠标移动时,假设鼠标坐标为 X , Y , 需实时在 坐标 (X , 0) , (0 , Y) 两处更新内容. 方案一:增加两个label ,或其它控件,鼠标移动时,实时更新 label ...
- Switch图形练习
//package IfAndSwitchs;import java.util.Scanner; public class Mianji { public static void main(Strin ...
- 作业3(PSP表格)
PSP2.1 Personal Software Process Stages Time(min) Planning 计划 11 Estimate 估计 ...
- C#如何获取项目中的其他文件夹的路径
//一般用string p=AppDomain.CurrentDomain.BaseDirectory+"\\其他"; //其它的还有 string str1 =Process.G ...
- visual studio code 安装python扩展
Ctrl+P 调出控制台,在控制台里输入ext install python,点击第一个安装 如果出现: visual studio code connect ETIMEDOUT 191.238.17 ...
- golang实现随机数
package main import ( "fmt" "time" "math/rand" ) func main() { r := ra ...
- 作业七:团队项目——Alpha版本冲刺阶段003
今日进展:我们的目标是做一款扫雷游戏,所以我们先去玩了几款游戏,找到了扫雷游戏的一些特点. 今日安排:先进行了一些必要的游戏过程,进行了基本的扫雷界面规划.