• MotionEvent、多点操作相关


    gesture
    一次gesture 包括从第一个手指头按下到最后一个手指头离开屏幕中的所有Event

    MotionEvent
    多点触摸时,每个点叫一个pointer, MotionEvent含有该时刻,所有pointer的信息。
    每一个pointer有一个唯一的id,这个id是在该pointer刚碰触屏幕的时候赋值的(ACTION_DOWN、ACTION_POINTER_DOWN时),
    有效期直到该点离开屏幕或者取消。但是pointer的序号 pointerIndex 在有效期的每个 MotionEvent 中都是不一定的,
    需要用pointerId 来跟踪某一个手指的所有动作。getPointerId(int pointerIndex) 返回Id,再用 findPointerIndex(int pointerId) 等到index.

    API Level 1:
    ACTION_DOWN    // 第一个手指头按下的时候触发(pointIndex 是0),其他手指头再按的时候是触发 ACTION_POINTER_DOWN
    ACTION_MOVE   
    ACTION_UP      // 最后一个手指头抬起的时候触发(pointIndex 是0),不一定是第一个按下的手指头
    ACTION_CANCEL  // 这一次触屏动作被取消

    API Level 3:
    ACTION_OUTSIDE

    API Level 5:
    ACTION_POINTER_DOWN  // 要得到这几个ACTION 需要: (event.getAction() & MotionEvent.ACTION_MASK)  否则直接用 event.getAction() 会很诡异。
    ACTION_POINTER_UP    // 不是最后一个手指抬起的时候触发

    // 下面这几个在 API Level 8 中已经 deprecated,统一放在 ACTION_POINTER_DOWN、ACTION_POINTER_UP 中,用  ACTION_POINTER_INDEX_MASK 来获取序号
    ACTION_POINTER_1_DOWN
    ACTION_POINTER_1_UP
    ACTION_POINTER_2_DOWN
    ACTION_POINTER_2_UP
    ACTION_POINTER_3_DOWN
    ACTION_POINTER_3_UP

    API Level 5:
    ACTION_MASK   (0x000000ff)
    ACTION_POINTER_ID_MASK         (0x0000ff00)     //在 API Level 8 中deprecated   
    ACTION_POINTER_ID_SHIFT        (0x00000008)     //在 API Level 8 中deprecated   

    API Level 8:
    int getActionMasked()
    int getActionIndex()

    ACTION_POINTER_INDEX_MASK      (0x0000ff00)
    ACTION_POINTER_INDEX_SHIFT     (0x00000008)

    API Level 1:
    getRawX()
    getRawY();
    getX()
    getY()

    API Level 5:
    getX(int pointerIndex)
    getY(int pointerIndex)

    API Level 5:
    getPointerId (int pointerIndex)
    findPointerIndex (int pointerId)
    getPointerCount()


    多点触摸的时候要获得正确的ACTION:
    API Level 5 的时候可以用   event.getAction() & MotionEvent.ACTION_MASK
    API Level 8 的时候可以用: event.getActionMasked()

    其实 getActionMasked() 的实现就是 event.getAction() & MotionEvent.ACTION_MASK
    getActionIndex() 的实现是 (event.getAction() & ACTION_POINTER_INDEX_MASK) >> ACTION_POINTER_INDEX_SHIFT;


    API Level 5 以后
    getAction() 得到的是一个int值,他其实包含了事件类型(actionType)和事件序号(pointerIndex)两个内容

    actionType: 低8位 (0-7位)
    pointerIndex: 8-15位

    而 ACTION_MASK 的值:0x000000ff      
    所以 event.getAction() & MotionEvent.ACTION_MASK 及是取低8位的 actionType 值
    而ACTION_POINTER_ID_MASK的值:0x0000ff00  (API Level 8 以后改名为 ACTION_POINTER_INDEX_MASK,但值是一样的)
    所以 event.getAction() & ACTION_POINTER_INDEX_MASK 就是取第 8-15 位,然后再右移 8 位就得到了 序号的值


     

  • 相关阅读:
    java 传入多个参数时报"Parameter 'XXX' not found. Available parameters are [arg1, arg0, param1,..." 解决方案
    java 判断int类型为空
    scp 传输下载
    自己开发的网页在跳转至微信公众号文章后,点击微信的返回,无法返回原网页
    nginx下Thinkphp 隐藏index.php
    ubuntu常见错误–Could not get lock /var/lib/dpkg/lock解决
    apt-get update 和 upgrade 的区别
    php 取某一日期的前一天
    PHP 统计数组中所有的值出现的次数 array_count_values 函数
    pandas之表格样式
  • 原文地址:https://www.cnblogs.com/zijianlu/p/3047609.html
Copyright © 2020-2023  润新知