Android中 MotionEvent MeasureSpec 位操作及含义
2017年1月10日
在Android中为了节省内存,有很多变量使用位存储,例如MotionEvent.getAction(),下面我们来梳理下它们的含义和使用方法。
MotionEvent.getAction();
MotionEvent.getAction()
得到是一个32位整型,现在可以告诉你有意义的是低16位。
1、低8位表示的是action
动作, 例如0x00 代表 ACTION_DOWN
。
2、高8位代表的是point_index
即 哪一个手指点击,例如0x0100 代表 第二个手指 ACTION_DOWN
事件。
然后是一些常量:
1 | public static final int ACTION_MASK = 0xff; |
看源码可知:
1 | public final int getAction() { |
MeasureSpec 布局宽高存储
通常在自定义控件的时候我们都要重写 onMeasure(int widthMeasureSpec, int heightMeasureSpec)
那这个MeasueSpec是个啥意思呢。
measureSpec
其实是父布局给子布局提供的宽高的容量,让子布局正确的计算出自己的宽高,measureSpec
里面就携带了宽或高的参数,还有测量模式。
measureSpec
是一个32位整型,高2位代表的是 MeasureMode
1 | private static final int MODE_SHIFT = 30; |
低30位代表宽或高的大小,看源码可知。
1 | public static int getMode(int measureSpec) { |
总结:
我们看到系统搞这么复杂的操作,往往我们使用几个变量就解决了,可是为啥系统要大费周章的使用位来存储呢?其实这正是系统的高明之处,我们知道计算机底层存储及通讯都是二机制位,而上层直接使用bit操作,可以减少内存的分配,试想下一个点击事件使用一个字节包含了所有的手势及触摸索引 比 你使用多个int存储节省多少内存呀。