这是我个人的看法,要学好android触控,了解MotionEvent是必要,对所用的MotionEvent常用的API要比较深入的了解.
(1)首先是MotionEvent 中getAction()与getActionMasked()的区别:
首先看代码:
01 |
/**
|
02 |
* Bit mask of the parts of the action code that are the action itself.
|
03 |
*/
|
04 |
public static final int ACTION_MASK = 0xff ;
|
05 |
06 |
/** |
07 |
* Return the kind of action being performed.
|
08 |
* Consider using {<a href="http://my.oschina.net/link1212" class="referer" target="_blank">@link</a> #getActionMasked} and {<a href="http://my.oschina.net/link1212" class="referer" target="_blank">@link</a> #getActionIndex} to retrieve
|
09 |
* the separate masked action and pointer index.
|
10 |
* @return The action, such as {<a href="http://my.oschina.net/link1212" class="referer" target="_blank">@link</a> #ACTION_DOWN} or
|
11 |
* the combination of {<a href="http://my.oschina.net/link1212" class="referer" target="_blank">@link</a> #ACTION_POINTER_DOWN} with a shifted pointer index.
|
12 |
*/
|
13 |
public final int getAction() {
|
14 |
return mAction;
|
15 |
}
|
16 |
17 |
/**
|
18 |
* Return the masked action being performed, without pointer index information.
|
19 |
* Use {<a href="http://my.oschina.net/link1212" class="referer" target="_blank">@link</a> #getActionIndex} to return the index associated with pointer actions.
|
20 |
* @return The action, such as {<a href="http://my.oschina.net/link1212" class="referer" target="_blank">@link</a> #ACTION_DOWN} or {<a href="http://my.oschina.net/link1212" class="referer" target="_blank">@link</a> #ACTION_POINTER_DOWN}.
|
21 |
*/
|
22 |
public final int getActionMasked() {
|
23 |
return mAction & ACTION_MASK;
|
24 |
}
|
上面的代码是基于android2.2的,注释是android4.X中最新的.
初看一下从技术角度来说通过getActionMasked()和通过getAction()返回的结果应该是一样的,
因为ACTION_MASK 的值 是0xff,
如果您对二进制位运算不太熟悉的话,请用下面的方法测试吧.看是不是这样的.
1 |
private static void maskTest() {
|
2 |
for ( int i = 0 ; i < 5 ; i++) {
|
3 |
System.out.println( "" + i);
|
4 |
System.out.println( "masked " + (i & 0xff ));
|
5 |
}
|
6 |
} |
那他们区别是什么呢?先看关于这两个方法注释:
我简单的翻译如下:
01 |
/** |
02 |
* action码的位掩码部分就是action本身
|
03 |
*/
|
04 |
public static final int ACTION_MASK = 0xff ;
|
05 |
06 |
/** |
07 |
返回action的类型,考虑使用getActionMasked()和getActionIndex()来获得单独的经过掩码的action和触控点的索引.
|
08 |
@return action例如ACTION_DOWN或者ACTION_POINTER_DOWN与转换的触控点索引的合成值
|
09 |
*/
|
10 |
public final int getAction() {
|
11 |
return mAction;
|
12 |
}
|
13 |
14 |
/**
|
15 |
返回经过掩码的action,没有触控点索引信息.
|
16 |
通过getActionIndex()来得到触控操作点的索引.
|
17 |
@return action,例如ACTION_DOWN,ACTION_POINTER_DOWN |
18 |
19 |
|
20 |
*/
|
21 |
public final int getActionMasked() {
|
22 |
return mAction & ACTION_MASK;
|
23 |
}
|
在上面的两个方法中注释出现差异的地方是对于ACTION_POINTER_DOWN的描述:
通过getAction()返回的ACTION_POINTER_DOWN的是与转换触控点索引的合成值.
而getActionMasked()则就是一个ACTION_POINTER_DOWN的值:
这么来看我们知道一个action的代码值还包含了action是那个触控点的索引值:
现在我们对比来看看ACTION_MASK和ACTION_POINTER_INDEX_MASK
1 |
public static final int ACTION_MASK = 0xff ;
|
2 |
public static final int ACTION_POINTER_INDEX_MASK = 0xff00 ;
|
还没有看出来什么吗?
您把ACTION_MASK看成是0x00ff
就知道了吧.
也就是说,一个MotionEvent中的action代码,
前8位是实实在在包含表示哪一个动作常量.
后八位呢就是包含了触控点的索引信息.
因为ACTION_MASK = 0x00ff所以,经过ACTION_MASK掩码过后的action码就没有索引信息了.
如何得索引值呢?
原理:
先将action跟0xff00相与清除前8位用于存储动作常量的信息,
然后将action右移8位就可以得到索引值了.
我们就可以自己想办法得到索引信息了.
即先对action用ACTION_POINTER_INDEX_MASK进行掩码处理,
即 maskedIndex = action&ACTION_POINTER_INDEX_MASK = action&0xff00
这各掩码也就是将action这个数的前8位清零.
然后再将maskedIndex向右移8位就能够得到索引值了.
再看看android真实是怎么做的吧,
用于右移8位的常量.
1 |
/** |
2 |
* Bit shift for the action bits holding the pointer index as
|
3 |
* defined by {<a href="http://my.oschina.net/link1212" class="referer" target="_blank">@link</a> #ACTION_POINTER_INDEX_MASK}.
|
4 |
*/
|
5 |
public static final int ACTION_POINTER_INDEX_SHIFT = 8 ;
|
再年得到索引值方法源代码,如下:
1 |
public final int getActionIndex() {
|
2 |
return (mAction & ACTION_POINTER_INDEX_MASK) >> ACTION_POINTER_INDEX_SHIFT;
|
3 |
} |
为什么要有索引信息?
因为,这样说吧,android中,当有触摸事件发生时(假设已经注册了事件监听器),调用你注册监听器中的方法onTouch(,MotionEvent ev);传递了一个MotionEvent的对象过来.
但是,想想,上面只传递进来一个MotionEvent过来,如果只是单点触控那是没有问题.
问题就是当你多个手指触控的时候也是只传递这一个MotionEvent进来,
这个时候,你当然想知道每个手指的所对应的触控点数据信息啦.
所以MotionEvent中有就要索引信息了.
事件是你可以很容易通过API看到,MotionEvent还包含了移动操作中其它历史移动数据.
方便处理触控的移动操作.
android sdk对于这个类的描述中就有这么一句:
For efficiency, motion events with ACTION_MOVE may batch together multiple movement samples within a single object.
我翻译下:"出于效率的考虑,事件代码为ACTION_MOVE的Motion,会在一个MotionEvent对象中包含多个移动数据采样."
现在我们对于MotionEvent有了初步的了解了.
PS:
我发现android4中MotionEvent中的代码大多变成了原生代码了:
例如如getX(int)在2.2中是这样的:
1 |
public final float getX( int pointerIndex) {
|
2 |
return mDataSamples[(pointerIndex*NUM_SAMPLE_DATA) + SAMPLE_X];
|
3 |
} |
但到了4.x是这样的了:
1 |
public final float getX( int pointerIndex) {
|
2 |
return nativeGetAxisValue(mNativePtr, AXIS_X, pointerIndex, HISTORY_CURRENT);
|
3 |
}
|
转载: http://my.oschina.net/banxi/blog/56421
相关推荐
在Android系统中,`MotionEvent`是处理用户触摸屏幕交互的核心类。这个压缩包文件`android_view_MotionEvent.rar_float`的焦点在于`float`类型的数据,这通常涉及到Android中的坐标和压力等触摸事件的参数。在...
在Android开发中,多点触控(Multi-Touch)是一项重要的功能,它允许用户通过同时操作两个或更多个触控点来与设备交互,比如缩放图片、旋转地图等。这个"Android多点触控实例源码"提供了一个实用的学习资源,帮助...
多点触控的基础是Android系统提供的MotionEvent类,它是处理触摸事件的核心。MotionEvent包含了一系列的方法,用于获取触摸事件的信息,如ACTION_DOWN(手指按下)、ACTION_UP(手指抬起)、ACTION_MOVE(手指移动)...
本教程将详细讲解如何实现一个最简单的Android多点触控图片放大功能,无需复杂的代码,主要利用自定义控件和MotionEvent的相关API。 首先,我们需要创建一个自定义的ImageView类,这个类将继承自Android内置的...
本资源"Android多点触控实例源码.rar"提供了一个具体的实例,帮助开发者了解如何在Android应用中实现多点触控功能。 在Android系统中,处理多点触控主要涉及到`MotionEvent`类和`GestureDetector`类。`MotionEvent`...
在Android中,触控事件主要通过`MotionEvent`类进行传递。当用户在屏幕上进行触摸操作时,系统会生成一系列的`MotionEvent`对象,并将它们分发给相应的View或Activity进行处理。事件类型包括ACTION_DOWN(按下)、...
Android系统通过MotionEvent类来处理触摸事件,包括ACTION_DOWN(手指按下)、ACTION_MOVE(手指移动)、ACTION_UP(手指抬起)等。对于多点触控,ACTION_POINTER_DOWN和ACTION_POINTER_UP事件用于处理额外的手指按...
在Android系统中,这种功能是通过`MotionEvent`类来实现的,它提供了处理触摸事件的方法,包括对单点和多点触控的支持。 在源码中,我们可能会看到以下关键组件和概念: 1. `SurfaceView` 或 `ViewGroup`: 这是...
在Android平台上,多点触控(Multi-Touch)功能允许用户通过两个或更多个手指同时进行交互,极大地丰富了用户体验,特别是在图像操作、游戏和手势识别等场景中。要实现Android多点触控,我们需要理解触摸事件的处理...
在Android平台上,多点触控(Multi-Touch)技术为用户提供了更为丰富的交互方式,使得应用程序可以识别并处理两个或更多个触摸点的同时操作。在本实例中,我们将深入探讨如何实现一个能够根据用户手势自由放大和缩小...
在Android中实现多点触控需要对触摸事件(MotionEvent)有深入的理解,本文将详细讲解如何在Android应用中实现多点触控功能。 首先,了解Android中的触摸事件系统。Android通过MotionEvent类来处理触摸事件,它包含...
在Android系统中,多点触控主要通过MotionEvent类来处理,它可以捕捉到多个手指同时在屏幕上的动作。 二、关键类与接口 1. MotionEvent:Android中的事件类,用于表示屏幕上发生的触摸事件,包括ACTION_DOWN、...
对触屏设备,用户主要通过手指或触控笔等工具在屏幕上操作,当然也可以通过外接的键盘,鼠标和轨迹球等工具来操作。 Android屏幕交互事件 用户在设备屏幕上的所有操作都会转换为各类屏幕交互事件。Android屏幕交互...
- **手势识别逻辑**:了解如何根据MotionEvent的事件类型和Pointer ID来识别多点触控手势。 - **手势放大缩小**:理解ScaleGestureDetector的工作原理,以及如何更新View的缩放比例。 - **手势旋转**:研究...
Android系统通过MotionEvent类支持多点触控,该类包含了关于用户触摸屏幕的所有信息,如触摸事件类型(ACTION_DOWN、ACTION_UP、ACTION_MOVE等)、触摸点的位置等。对于多点触控,MotionEvent会包含多个触点...
在Android开发中,实现对图片的触控操作是常见的需求,比如在相册应用、地图应用或者各种图像编辑应用中。本教程将详细介绍如何在Android中实现图片的放大、缩小、旋转和移动等触控效果,使用户可以更加自然地与图片...
在Android开发中,多点触控手势操作是提升用户体验的关键技术之一。这一技术允许用户通过一个或多个手指在屏幕上执行不同的交互动作,如缩放、旋转、滑动等。本资料包“安卓多点触控手势操作相关-Android中使用单笔...
在Android开发中,多点触控(Multi-Touch)是一项重要的功能,允许用户通过两个或更多的手指进行交互,如缩放、旋转等操作。本文将深入探讨如何在Android应用程序中实现图片的多点触控缩放功能。我们将讨论以下几个...
在Android平台上,手势识别与多点触控是移动应用开发中的关键部分,它们极大地提升了用户交互体验。Android系统提供了一套强大的API,使得开发者能够轻松地实现各种复杂的手势识别和多点触控功能。下面将详细介绍这...
Android通过`MotionEvent`类来处理触控事件,提供了`ACTION_DOWN`、`ACTION_UP`、`ACTION_MOVE`等动作标识,以及`getPointerCount()`、`getPointerId(int index)`、`getX(int index)`和`getY(int index)`等方法来...