android 如何使用手写笔优先策略处理触摸事件?

How do I handle touch event with stylus-first strategy in android?

关于上述问题。

我可以通过 MotionEvent.getSize()

创建仅手写笔策略
public boolean onTouchEvent(MotionEvent event) {
        if (event.getAction()==MotionEvent.ACTION_MOVE) {
            float paintsize = event.getSize();
            Log.i(TAG,String.valueOf(paintsize));
            if (paintsize == 0.02) {
                canvas.drawLine(mov_x, mov_y, event.getX(), event.getY(), paint);
                invalidate();
            }
        }
        ......
        return true;
}

但是这导致我的手无法绘制任何东西。

所以,我想设计一个手写笔优先的策略,比如当我的手和手写笔同时触摸屏幕时,系统应该只显示手写笔的路径;当只有我的手触摸屏幕时,系统照常显示我手的路径。

在我看来,手写笔无法向设备广播任何消息,所以我只有一个值可以检测:Size

我的手的大小在 0.06 到 0.8999 之间...触控笔的大小是 0.02

如何处理触摸事件的优先级? 我不知道这种情况。

因为我只能通过大小来检测我的手写笔,检索它的 PointerID 是唯一的方法。

根据https://developer.android.com/reference/android/view/MotionEvent.html#getPointerId%28int%29

getPointerID:Return 与此事件中特定指针数据索引关联的指针标识符。标识符告诉您与数据关联的实际指针编号,说明自当前手势开始以来上下移动的各个指针。

这是一个例子。

@Override
public boolean onTouchEvent(MotionEvent event){
  float inputsize = event.getSize();
  int index = event.getActionIndex();
  int inputid = event.getPointerID(index);
  boolean isStylus = false;
  int stylusid = -1;

  switch(event.getAction())
  {
    case MotionEvent.ACTION_DOWN:
      if(inputsize==0.02 && isStylus==false){
        isStylus = true;
        stylusid = inputid;
      }
      if((isStylus==true) && (inputid==stylusid)){
        mov_x = event.getX();
        mov_y = event.getY();
        //If the new input event is stylus, then move to new coordinate.
        mPath.moveTo(mov_x,mov_y);
      }
      ......
      break;
    case MotionEvent.ACTION_MOVE:
      ......
  }
}

这种方式虽然不完美,但还是可以的。

event.getToolType() 添加到 API 级别 14

public int getToolType (int pointerIndex)

获取给定指针索引的指针的工具类型。工具类型表示用于进行接触的工具类型,例如手指或手写笔(如果已知)。

int toolType = event.getToolType(0);
if(toolType == event.TOOL_TYPE_FINGER){
  ToastUtil.show(CanvasActivity.this,"It is finger"); 
  return true;
}else if(toolType == event.TOOL_TYPE_MOUSE){
  ToastUtil.show(CanvasActivity.this,"It is mouse");
  return true;
}else if(toolType == event.TOOL_TYPE_UNKNOWN){
  ToastUtil.show(CanvasActivity.this,"Unknown");
  return true;
}else if(toolType == event.TOOL_TYPE_STYLUS){
  ToastUtil.show(CanvasActivity.this,"It is stylus"); 
  return true;
}