Как мне обработать сенсорное событие с помощью стратегии "стилус-первый" в Android?
Как получить размер краски (стилуса) для 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;
}
Но это потому, что моя рука ничего не может нарисовать.
Итак, я хочу разработать стратегию, основанную на использовании стилуса, например, когда моя рука и стилус касаются экрана одновременно, система должна показывать только путь стилуса; когда только моя рука касается экрана, система показывает путь моей руки как обычно.
На мой взгляд, стилус не может передавать какие-либо сообщения на устройство, поэтому у меня есть только одно значение для определения: Размер
Размер моей руки составляет от 0,06 до 0,8999... а размер стилуса - 0,02
Как мне обработать приоритет события касания? Я понятия не имею об этой ситуации.
1 ответ
Поскольку я могу определить мой стилус только по его размеру, получить PointerID - единственный способ сделать это.
Согласно https://developer.android.com/reference/android/view/MotionEvent.html
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:
......
}
}
Хотя этот путь не идеален, но все же может работать.
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;
}