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错误
这个错误也是让我纠结了一天,当时写的项目在安卓虚拟机上运行都很正常,于是当我部署到安卓手机上时,点击登陆按钮跳转到用户主界面的时候直接结束运行返回登陆界面. 当时,我仔细检查了一下自己的代码,并 ...
随机推荐
- Joomla软件功能介绍与开源程序大比拼Joomla,wordpress,Drupal哪个好?
Joomla 软件功能介绍: Joomla!是一套在国外相当知名的内容管理系统 (Content Management System, CMS),它属于Portal(企业入口网站)类型,顾名思义 ...
- 十天学会<div+css>横向导航菜单和纵向导航菜单
纵向导航菜单及二级弹出菜单 纵向导航菜单:一级菜单 <head><style type="text/css">body { font-family: Ver ...
- 安装VS 2013遇到的问题,及解决方案
一.在启动调试时报错 Visual Studio 2013 虽然集成安装了 IIS Express 8.0,但是并未安装 WebMatrix ,第一个问题就是这个原因造成的. 解决方案: 1.下载最新 ...
- Leetcode 详解(Valid Number)
Validate if a given string is numeric. Some examples:"0" => true" 0.1 " => ...
- C#之事件
事件,是C#编程模型中重要的一个概念,通过对事件的理解,可以更好的了解C#程序运行机制.C#中的事件,可以简单的理解为类或者对象发生了一件事,并且把这件事通知给了其他的类或者对象,其他的类或者对象可以 ...
- 使用 WinHttp 实现文件下载
#include <Windows.h> #include <Winhttp.h> #pragma comment(lib,"Winhttp.lib") t ...
- 394. Decode String
[题目] Total Accepted: 10087 Total Submissions: 25510 Difficulty: Medium Contributors: Admin Given an ...
- gitt
一,git config core.autocrlf false 二,vi .git/config[remote "origin"] url = https://github.co ...
- 不经过 App store 的安装方式(转)
所有安装到真机(非越狱)的应用(可以是 .app ,也可以是 .ipa ,只要编译时选的是编译成 Arm 的就好..app 转 .ipa 只需要一条命令) 都必须经过证书签名.证书主要有三大种: 企业 ...
- UITableViewCell
#import "ContactListTableViewController.h" #import "Contact.h" #import "Con ...