Android触控基础:MotionEvent
之前的文章层从Framework层介绍了Android Touch事件即(MotionEvent)的传递机制。本文将详细介绍MotionEvent的一些成员和方法。了解了MotionEvent对开发一些特效如拖动控件或多点缩放控件有很大的作用。同时,掌握MotionEvent类也是学好android触控技术的基础。
一、一些常量
常见的动作常量:
public static final int ACTION_DOWN = 0;单点触摸动作
public static final int ACTION_UP = 1;单点触摸离开动作
public static final int ACTION_MOVE = 2;触摸点移动动作
public static final int ACTION_CANCEL = 3;触摸动作取消
public static final int ACTION_OUTSIDE = 4;触摸动作超出边界
public static final int ACTION_POINTER_DOWN = 5;多点触摸动作
public static final int ACTION_POINTER_UP = 6;多点离开动作
以下是一些非touch事件
public static final int ACTION_HOVER_MOVE = 7;
public static final int ACTION_SCROLL = 8;
public static final int ACTION_HOVER_ENTER = 9;
public static final int ACTION_HOVER_EXIT = 10;
掩码常量
ACTION_MASK = 0X000000ff 动作掩码
ACTION_POINTER_INDEX_MASK = 0X0000ff00 触摸点索引掩码
ACTION_POINTER_INDEX_SHIFT = 8 获取触摸点索引需要移动的位数
二、相关方法
getAction()方法返回的是int类型,用到的只有低16位,其中:低八位是动作的类型,高8位是触摸点索引值的表示(单点为0,双点为1)
获得动作类型: int action = event.getAction() & ACTION_MASK 或者使用 getActionMasked()
获得触摸点索引类型: int pointerIndex = (event.getAction() & ACTION_POINTER_INDEX_MASK ) >> ACTION_POINTER_INDEX_SHIFT
或者使用 getActionIndex()
为什么要有索引信息?
有了索引信息,我们可以在onTOuchEvent事件中判断传进来的MotionEvent对象对应的是单点信息还是多点信息。
下面的代码段能使用户在屏幕上拖动一个对象。它记录了初始点的位置,计算点移动的距离,并将对象移动到新的位置。它正确的处理了这种情况:当第一个手指把控件拖到一个位置,然后按下第二个手指,且第二个手指与同一个控件上。当用户抬起第一个手指时,控件不会跑到第二个手指的位置同时第二个手指可以继续拖动控件。
// The ‘active pointer’ is the one currently moving our object.
private int mActivePointerId = INVALID_POINTER_ID;@Override
public boolean onTouchEvent(MotionEvent ev) {// Let the ScaleGestureDetector inspect all events.mScaleDetector.onTouchEvent(ev);final int action = MotionEventCompat.getActionMasked(ev); switch (action) { case MotionEvent.ACTION_DOWN: {final int pointerIndex = MotionEventCompat.getActionIndex(ev); final float x = MotionEventCompat.getX(ev, pointerIndex); final float y = MotionEventCompat.getY(ev, pointerIndex); // Remember where we started (for dragging)mLastTouchX = x;mLastTouchY = y;// Save the ID of this pointer (for dragging)mActivePointerId = MotionEventCompat.getPointerId(ev, 0);break;}case MotionEvent.ACTION_MOVE: {// Find the index of the active pointer and fetch its positionfinal int pointerIndex = MotionEventCompat.findPointerIndex(ev, mActivePointerId); final float x = MotionEventCompat.getX(ev, pointerIndex);final float y = MotionEventCompat.getY(ev, pointerIndex);// Only move if the ScaleGestureDetector isn't processing a gesture.if (!mScaleDetector.isInProgress()) {// Calculate the distance movedfinal float dx = x - mLastTouchX;final float dy = y - mLastTouchY;mPosX += dx;mPosY += dy;invalidate();}// Remember this touch position for the next move eventmLastTouchX = x;mLastTouchY = y;break;}case MotionEvent.ACTION_UP: {mActivePointerId = INVALID_POINTER_ID;break;}case MotionEvent.ACTION_CANCEL: {mActivePointerId = INVALID_POINTER_ID;break;}case MotionEvent.ACTION_POINTER_UP: {final int pointerIndex = MotionEventCompat.getActionIndex(ev); final int pointerId = MotionEventCompat.getPointerId(ev, pointerIndex); if (pointerId == mActivePointerId) {// This was our active pointer going up. Choose a new// active pointer and adjust accordingly.final int newPointerIndex = pointerIndex == 0 ? 1 : 0;mLastTouchX = MotionEventCompat.getX(ev, newPointerIndex); mLastTouchY = MotionEventCompat.getY(ev, newPointerIndex); mActivePointerId = MotionEventCompat.getPointerId(ev, newPointerIndex);}break;}} return true;
}
MotionEvent还包含了移动操作中其它历史移动数据以方便处理触控的移动操作.
android sdk对于这个类的描述中就有这么一句:
For efficiency, motion events with ACTION_MOVE may batch together multiple movement samples within a single object.
Android触控基础:MotionEvent相关推荐
- Android触控基础 MotionEvent
转自:http://www.cnphp6.com/archives/59948?utm_source=tuicool&utm_medium=referral 一.一些常量 常见的动作常量: p ...
- Android多点触控之——MotionEvent(触控事件)
今天晚上刚学习了一个多点触控的小程序,后面想对其做一个定制.在写的时候遇到很多问题,于是乎就查了一下API文档,又到网上查了一下高手的文章,最后自己又实践了一下.终于把多点触控事件监听的大概原理给弄清 ...
- Android触控屏幕Gesture(GestureDetector和SimpleOnGestureListener的使用教程) 分类:Androidandroid实例...
1.当用户触摸屏幕的时候,会产生许多手势,例如down,up,scroll,filing等等,我们知道View类有个View.OnTouchListener内部接口,通过重写他的onTouch(Vie ...
- 定制android触控平板,Adobe发表六款Android平板用触控Apps,一套六款的工具组合
Adobe 在十月时发表了它们的触控 Apps 家族 -- 一套六款的工具组合,把拥有触控界面的平板电脑,用在让生活更轻松.创意更容易发挥之处,成为更好用的设计工具.现在,这些软件也可以在 Andro ...
- 触控事件MotionEvent
MotionEvent中封装的一些常用的事件常量: //单点触摸按下动作 public static final int ACTION_DOWN = 0; //单点触摸抬起动作 public stat ...
- android 触控优化,太滑手了,安卓这款触控优化神器要逆天!
原标题: 太滑手了,安卓这款触控优化神器要逆天! 最近国外一款很火的优化工具"Super Touch" 中文名[超级触控],它可以提升触控反应速度,手感媲美iPhone,令人惊讶的 ...
- Android触控手感没有苹果好,硬核科普:为什么iPhone玩游戏的手感比大部分安卓都强?...
我们知道,现在安卓旗舰愈发强调"触控采样率"的概念,理论上,这一配置的数值越高,手机玩游戏的跟手度与手感也就越好.如今顶配如小米11已将"触控采样率"提升至48 ...
- ipad和android触控笔不通用,电容笔能取代apple pencil在iPad上使用吗?不看后悔!
随着iPad等平板设备的日渐普及,大家都习惯了在iPad上学习.工作.绘画.娱乐等,因为iPad不仅小巧便携,而且功能也日渐强大,相对于笨拙的笔记本电脑更加方便,但是iPad专用的apple penc ...
- 多点触控之MotionEvent.ACTION_MASK的作用
(1) 在onTouchEvent(MotionEvent event)中,使用switch (event.getAction())可以处理ACTION_DOWN和ACTION_UP事件:ACTION ...
最新文章
- VUE的组件DEMO
- 窗口子类化-实例应用
- mysql 插入数据后返回该条数据id
- power linux 安装系统,powershell 安装服务器
- 指数型生成函数[bzoj3456]城市规划
- 外媒推荐:科技创业者必看的十部经典电影
- ogg 登录mysql报字符集_mysqldump之字符集问题解决
- 为什么要避免大事务以及大事务如何解决?
- python全栈工程师要求_Python全栈工程师
- Lingoes灵格斯翻译家添加法语发音
- 中学生怎样学计算机编程6,中学生学电脑编程有什么好处
- android 文件下载地址 http,android文件下载代码
- 如何从0开始编写一个网络爬虫?
- 下载并安装 J2SDK以及运行第一个java程序
- 30 行代码实现,支付宝蚂蚁森林自动收能量!
- 微信公众号开发——实现用户微信网页授权流程
- 每日题解:LeetCode 718. 最长重复子数组
- php 无限子站cms,PHP整理CMS无限层级目录(毗邻目录模式)
- 逆战网络连接断开连接服务器超时_《天天逆战》出现网络连接问题解决方案
- 麦咖啡未来三年将投资25亿,在中国内地布局超过4000家