Android触控MotionEvent一 motionevent属性

这是我个人的看法,要学好android触控,了解MotionEvent是必要,对所用的MotionEvent常用的API要比较深入的了解.

下面是我个人的学习过程记录:

MotionEvent源代码可以在ocs看到,当然你也可以在SDK中下载源代码,或者其他地方,如:

https://github.com/CyanogenMod/android_frameworks_base/blob/ics/core/java/android/view/MotionEvent.java

(1)首先是MotionEvent 中getAction()与getActionMasked()的区别:

首先看代码:


上面的代码是基于android2.2的,注释是android4.X中最新的.

他们有什么区别呢?如果mAction的值是在0x00到0xff之间的话。getAction()返回的值,和getActionMasked()的返回的值是一样的。

(Q1)那什么时候返回的值是一样的呢?即当mAction值大于0xff时,那什么时候会大于0xff呢?

这就是,当有多点触控时,mAction的低8位即0x00到0xff用来表示动作的类型信息。

例如:MotionEvent#ACTION_DOWN的值是 0,即0x00。

MotionEvent#ACTION_UP的值是1,即0x01。

等等。

但是,我们知道Android是支持多点触控的,那么怎么知道这个一个MotionEvent是哪一个触控点触发的呢?那么就还需要MotionEvent带有触控点索引信息。

Android的解决方案是:在mAction的第二个8位中存储。

例如,如果mAction的值是0x0000,则表示是第一个触控点的ACTION_DOWN操作。

如果mAction的值是0x0100呢,则表示是第二个触控点的ACTION_DOWN操作。

第三个的ACTION_DOWN呢?相信你可以推出来是0x0200。

总而言之,mAction时的低8位(也就是0-7位)是动作类型信息。

mAction的8-15位呢,是触控点的索引信息。(即表示是哪一个触控点的事件)。

(Q2),为什么不用两个字段来表示。

如 int mAction,int mPointer,

mAction表示动作类型,mPointer表示第几个触控点。

因为,动作类型只要0-255就可以了,动作类型,mPointer也是。

只要一个字段(32位),否则需要两个字段(32*2=64位),即可以节约内存。又可以方便提高处理速度。

不过通常我们都是以不同的字段来存储不同的信息。但是在计算机内部他们还是变成了0,1。

计算机始终还是以位来存储信息的。如果我们多我熟悉以位为基本单位来理解信息的存储。对于理解android中的很多变量是很有帮助的。因为他其中的很 多东西使用的这样的节约内在的技巧。

如onMeasure中的MeasureSpec。

=================== theabove isupdate at 2013-01-24=====

先看关于这两个方法注释:

我简单的翻译如下:

在上面的两个方法中注释出现差异的地方是对于ACTION_POINTER_DOWN的描述:通过getAction()返回的ACTION_POINTER_DOWN的是与转换触控点索引的合成值.而getActionMasked()则就是一个ACTION_POINTER_DOWN的值:

这么来看我们知道一个action的代码值还包含了action是那个触控点的索引值:现在我们对比来看看ACTION_MASK和ACTION_POINTER_INDEX_MASK


还没有看出来什么吗?

您把ACTION_MASK看成是0x00ff就知道了吧。也就是说,一个MotionEvent中的action代码,前8位(0-7位)是实实在在包含表示哪一个动作常量。后八位(8-15位)呢就是包含了触控点的索引信息。因为ACTION_MASK= 0x00ff所以,经过ACTION_MASK掩码过后的action码就没有索引信息了.

如何得索引值呢?

原理:

先将action跟0xff00相与,清除前8位(0-7位)用于存储动作常量的信息,然后将action右移8位就可以得到索引值了.

我们就可以自己想办法得到索引信息了.

即先对action用ACTION_POINTER_INDEX_MASK进行掩码处理,

即 maskedIndex =action&ACTION_POINTER_INDEX_MASK = action&0xff00

这个掩码也就是将action这个数的前8位清零.

然后再将maskedIndex向右移8位就能够得到索引值了.

再看看android真实是怎么做的吧,

用于右移8位的常量.


Android触控MotionEvent(一) motionevent属性
再年得到索引值方法源代码,如下:
1publicfinal int getActionIndex(){
2return(mAction & ACTION_POINTER_INDEX_MASK)>> ACTION_POINTER_INDEX_SHIFT;
3}

为什么要有索引信息?

因为,这样说吧,android中,当有触摸事件发生时(假设已经注册了事件监听器),调用你注册监听器中的方法onTouch(,MotionEventev);传递了一个MotionEvent的对象过来. 但是,想想,上面只传递进来一个MotionEvent过来,如果只是单点触控那是没有问题.问题就是当你多个手指触控的时候也是只传递这一个MotionEvent进来,这个时候,你当然想知道每个手指的所对应的触控点数据信息啦.所以MotionEvent中有就要索引信息了.

事件是你可以很容易通过API看到,MotionEvent还包含了移动操作中其它历史移动数据. 方便处理触控的移动操作.

androidsdk对于这个类的描述中就有这么一句:
For efficiency, motion events with ACTION_MOVE may batchtogether multiple movement samples within a singleobject

我翻译下:"出于效率的考虑,事件代码为ACTION_MOVE的Motion,会在一个MotionEvent对象中包含多个移动数据采样."

现在我们对于MotionEvent有了初步的了解了.

PS:

我发现android4中MotionEvent中的代码大多变成了原生代码了:


是不是进步了呢?哈哈!

转自:http://my.oschina.net/banxi/blog/56421

  

爱华网本文地址 » http://www.413yy.cn/a/25101016/314990.html

更多阅读

怎样关闭笔记本触控板 笔记本触控板禁用不了

请在这里输入概述内容怎样关闭笔记本触控板——步骤/方法怎样关闭笔记本触控板 1、Fn+F8组合键,笔者笔记本是联想的,可通过此法关闭触控板,如遇到个别笔记本电脑通过此方法不能关闭触摸板。另外个别笔记本也提供了关闭触摸板的快捷键,

笔记本电脑触控板怎么关闭? 苹果笔记本电脑触控板

笔记本电脑触控板怎么关闭?——简介由于触摸屏技术简单易操作,能够更好地实现人机互动的轻松体验感,耐用实用的特点正在被各个领域广泛应用。但是在日常使用笔记本电脑的时候,触控板在打字的时候容易造成误操作。 我们应该怎么关闭笔记

触屏配全键,摩托罗拉MT620经典试用 摩托罗拉mt620

我是从刀锋系列Z8开始用摩托罗拉手机的,虽然谈不上摩托罗拉的资深粉丝,但也算是见证了摩托罗拉从巅峰走向谷底再重回顶峰的传奇历史。三防DEFY已经成为街机,我还是很为MOTO高兴的。其实DEFY大卖的原因很容易的想到,那就是摩托罗拉的创新

声明:《Android触控MotionEvent一 motionevent属性》为网友撩情浪子污分享!如侵犯到您的合法权益请联系我们删除