当前位置:   article > 正文

Android 多点触控及应用(画板控件 DrawView)_android 多点触控,绘制滑动轨迹和十字光标

android 多点触控,绘制滑动轨迹和十字光标

多指触控是指监听多个手指的触控事件,我们可以重写 View 中的 onTouchEvent 方法,或者使用 setOnTouchListener 方法来处理触摸事件。

首先我们来看一下如何判断多指触摸时的事件类型。

MotionEvent 中的事件类型

一般而言,我们通过判断 MotionEvent 的 action 来判断输入事件类型,从而做出相应的处理。
在不考虑多指的情况下,我们一般只关注如下几个事件类型:

  • MotionEvent.ACTION_DOWN
    第一根手指点击屏幕

  • MotionEvent.ACTION_UP
    最后一根手指离开屏幕

  • MotionEvent.ACTION_MOVE
    屏幕上有手指在滑动

  • MotionEvent.ACTION_CANCEL
    事件被拦截

那么对于多指触控来说,除了上述常用的几种事件类型之外,我们还需要关注另外两个事件类型:

  • MotionEvent.ACTION_POINTER_DOWN
    点击前屏幕上已存在手指

  • MotionEvent.ACTION_POINTER_UP
    当屏幕上一根手指被抬起,此时屏幕上仍有别的手指

需要注意的是,上述的两个类型我们不能像以前那样使用 MotionEvent#getAction 方法获取到,需要使用 getActionMasked 才行。

所以再处理多指触控时我们的 onTouch 方法一般可以写成这样:

public boolean onTouchEvent(MotionEvent event) {
   
    switch (event.getActionMasked()) {
   
        case MotionEvent.ACTION_DOWN: break;
        case MotionEvent.ACTION_UP: break;
        case MotionEvent.ACTION_MOVE: break;
        case MotionEvent.ACTION_POINTER_DOWN: break;
        case MotionEvent.ACTION_POINTER_UP: break;
    }
    return true;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

当有多跟手指同时触碰屏幕时,我们需要追踪不同的手指。这里面又涉及到另外几个概念。

手指追踪

MotionEvent 中提供了几个用于追踪不同手指的方法,再介绍它们之前我先来说一下几个概念。

  • ActionIndex
    事件索引

  • PointerId
    手指 ID

  • PointerIndex
    手指索引

与之对应的几个方法:

方法 描述 备注
getActionMasked() 获取事件类型 可获取到多指触控事件类型
getPointerCount() 获取当前屏幕上的手指个数
getActionIndex() 获取事件索引
getPointerId(int) 获取手指 ID 参数为 ActionIndex
findPointerIndex(int) 获取手指索引 参数为 PointerId

ActionIndex(事件索引)

ActionIndex 通过 getActionIndex 方法可以直接获取到,可以大概地将其理解为用来描述当前事件发生在第几根手指上,例如我们监听到手指抬起时,可能想知道是哪一根手指抬起,那么可以通过 ActionIndex 来判断。
另外,对于同一根手指来说,ActionIndex 的值可能会随着手指的按下与抬起变化的,所以我们不能用它来标识某个手指。
看起来,ActionIndex 唯一的作用就是用来获取 PointerId。
特别需要说明一点,该方法只针对 ACTION_POINTER_DOWNACTION_POINTER_UP 事件有效,ACTION_MOVE 事件是没法准确的获取到该值的,我们需要结合其他事件综合判断。

PointerId(手指 ID)

PointerId 通过 getPointerId(int) 方法获取,参数为 ActionIndex。
我们可以通过 PointerId 来标识一根手指。对于同一根手指来说,从按下到抬起整个过程中,PointerId 是固定不变的。
同样需要注意的是,这个值可能会被重用,例如一个手指的 id 是 0,当它抬起后重新按下一根手指,id 可能同样为 0。

PointerIndex(手指索引)

PointerIndex 通过 findPointerIndex(int) 来获取,参数为 PointerId。
这个值是用来获取该事件更多内容的。
如果我们想获取该事件的点击点位置,当我们通过 getX()/getY() 方法获取坐标时获取到的只能是第一根手指的位置,但是这两个方法提供了一个重载:

float getX(int pointerIndex);
float getY(int pointerIndex)
  • 1
本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号