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;
}
关于上述问题。
我可以通过 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;
}