`

android触控,先了解MotionEvent

 
阅读更多

这是我个人的看法,要学好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多点触控

    android 多点触控 缩放工具,MotionEvent,我们可以详细处理来实现对多点触控的了解

    最简单android 多点触控 图片放大

    最简单android 多点触控 图片放大,没有任何过多的代码,使用了自定义控件,MotionEvent.ACTION_POINTER_DOWN来标识第二点按下,setFrame来改变片的大小

    多点触控显示

    import android.view.MotionEvent; import android.view.SurfaceHolder; import android.view.SurfaceView; import android.view.Window; import android.widget.ImageView; public class MyMultitouchDemo extends...

    Android触屏事件和MotionEvent详解

    对触屏设备,用户主要通过手指或触控笔等工具在屏幕上操作,当然也可以通过外接的键盘,鼠标和轨迹球等工具来操作。 Android屏幕交互事件 用户在设备屏幕上的所有操作都会转换为各类屏幕交互事件。Android屏幕交互...

    Android开发实例之多点触控程序

     首先来了解一下Android中多点触控的原理。  Android多点触控在本质上需要LCD驱动和程序本身设计上支持,目前市面上HTC、Motorola和Samsung等知名厂商只要使用电容屏触控原理的手机均可以支持多点触控Multitouch...

    Android 让按钮随着触控笔的移动一起移动.rar

    Android 让按钮随着触控笔的移动一起移动,用手在屏幕上按住按钮,可随意移动按钮到任意位置:  final static int WRAP_CONTENT=-2;//表示WRAP_CONTENT的常量  final static int X_MODIFY=4;//在非全屏模式下X坐标...

    Android编程实现两点触控功能示例

    本文实例讲述了Android编程实现两点...import android.view.MotionEvent; public class AndroidTestActivity extends Activity { private float x0, y0; private float x1, y1; public void onCreate(Bundle saved

    札记:android手势识别功能实现(利用MotionEvent)

    现在手势识别的应用已经很广泛了。本篇文章主要介绍了android手势识别功能实现,具有一定的参考价值,有兴趣的可以了解一下。

    android群雄传

    5.1.3 触控事件——MotionEvent 89 5.2 实现滑动的七种方法 91 5.2.1 layout方法 92 5.2.2 offset Left And Right()与offset Top And Bottom() 93 5.2.3 Layout Params 93 5.2.4 scroll To与scrollBy 94 ...

    多点触控技术

    在Android平台上事件均使用了MotionEvent对象方式处理,比如开始触控时会触发ACTION_DOWN,而移动操作时为 ACTION_MOVE,最终放开手指时触发ACTION_UP事件。当然还有用户无规则的操作可能触发ACTION_CANCEL这个动作...

    android绘制触点轨迹的代码

    本文实例为大家分享了android绘制触点轨迹的具体代码,供大家参考,具体内容如下 重点函数是onTouchEvent(),所有的触摸事件都会在View的这个函数里面处理 单点触控 单点触控的event是通过event.getAction()获得的,...

    Java版水果管理系统源码-CustomView:自定义View大合集

    Java版水果管理系统源码 CustomView 自定义View大合集 示例 圆形ImageView: 自定义时钟: 水平滚动View: View的滑动: ...怎么样:触控事件MotionEvent中获取坐标-getRawX()和getRawY()。 View坐标系: 是

Global site tag (gtag.js) - Google Analytics