开始先贴一篇文章。。android触控,先了解MotionEvent(一)

最近在android上处理一些触摸屏幕的消息的总结。。。

MotionEvent 中,用一个int 表示 action 的类型。前16位中,低8位表示 触发的事件类型(如:MotionEvent.ACTION_MOVE、MotionEvent.ACTION_DOWN等),高8位表示触发事件的 触摸点索引

// MotionEvent
// public static final int ACTION_MASK = 0xff;
// public static final int ACTION_POINTER_INDEX_MASK = 0xff00;

public boolean onTouch(View v, MotionEvent event) {    // int action = event.getAction();    // action & MotionEvent.ACTION_MASK;    int eventAction =  event.getActionMasked();    // (action & MotionEvent.ACTION_POINTER_INDEX_MASK) >> MotionEvent.ACTION_POINTER_INDEX_SHIFT;    int actionIndex = event.getActionIndex();    switch (eventAction) {        case MotionEvent.ACTION_MOVE:        case MotionEvent.ACTION_DOWN:        case MotionEvent.ACTION_POINTER_DOWN:        case MotionEvent.ACTION_OUTSIDE:        case MotionEvent.ACTION_UP:        case MotionEvent.ACTION_POINTER_UP:        case MotionEvent.ACTION_CANCEL:        //.....            break;        default:            return false;    }}

android sdk对于这个类的描述中就有这么一句:

For efficiency, motion events with ACTION_MOVE may batch together multiple movement samples within a single object.

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

所以在这里我遇到了第一个坑。。。
public static final int ACTION_MOVE = 2;

原来ACTION_MOVE 这个事件,是不带有触控点索引信息的。。而上面那句话说的意思是只提供了移动数据的采样。。。。事先不知道,一直用下面的代码得到索引,再通过索引来得到触控点的位置。。。从而导致了错误。。。

int actionIndex = event.getActionIndex();
第二个坑是

刚开始我以为,当手指触摸屏幕时,索引就确定下来不会变了。。后来发现不是这样的

当有多个触控点时,前面的某根手指松开了,比该 触控点的索引 大的 触控点 的 索引 都会减 1(这没错)。。。但是当松开的手指再按下时,我以为会以当前最大索引值加1 当作这根手指的索引
但是这又错了。。。这时候,刚才索引值降1的触控点,现在要再加 1 上去。然后按下的手指的索引值填补 空出来的索引值

触控点索引

更多相关文章

  1. 新时代的搜索引擎,绝对比百度还牛逼,不信你试试。
  2. 程序员的双十一剁手指南,看完不剁手算我输。
  3. android Input系统事件分发流程
  4. Android上实现仿IOS弹性ScrollView
  5. 一个方便集成的 Android(安卓)右滑返回上级 控件
  6. 5分钟实现Android最新2018友盟统计
  7. 自定义软键盘中Enter键,及其相应事件
  8. Android的事件机制
  9. Android(安卓)为点击事件添加震动效果

随机推荐

  1. 学习Android(一)
  2. Android(安卓)之 Shape (圆角输入框)
  3. android的两种布局---------------------
  4. Android中使用继承GDActivity出现的问题
  5. Android(安卓)将每三个数字加上逗号处理(
  6. PHP 判断当前扫码的客户端浏览器类型
  7. Android Foreground Service
  8. Android之Fragment动态加载、Fragment与A
  9. Android NDK + adb调试
  10. Android multiDex 分包步骤