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

时间:2016-12-22 12:03:05

标签: android touch

How do I get android paint(stylus) size?

关于上述问题。

我可以通过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;
}

但这导致我的手无法画任何东西。

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

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

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

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

2 个答案:

答案 0 :(得分:1)

?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;
}

答案 1 :(得分:0)

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

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

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

这是一个例子。

@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:
      ......
  }
}

虽然这种方式并不完美,但仍然有效。