Обработка MotionEvent от стилуса на Android
Я использую планшет Android 5.1 со стилусом (также поддерживающим нажатие). Приведенный ниже код показывает, как я обрабатываю событие движения от стилуса. Я читал об этом в документации по Android, но мне все еще не ясно, что именно происходит.
Особенно historySize
а также pointerCount
неясны для меня. Почему есть pointerCount
, т.е. несколько значений положения и давления? Что история имеет определенный размер (т.е. historySize
) мне понятно, но почему у нас эта история?
Допустим, у меня есть одно событие из моего стилуса. В моем понимании это событие должно генерировать только одну позицию и значение давления, но с помощью приведенного ниже кода оно может (и будет) генерировать несколько значений. Зачем?
Также временные метки мне не так понятны. Все значения в pointerCount-Loop имеют одинаковую метку времени (timestampEvent
) но каждое значение в истории имеет timestampOffset
, Как я могу получить разницу в миллисекундах между timestampOffset
а также timestampEvent
?
Или события стилуса должны обрабатываться не так, как я?
public static void processMotionEvent(MotionEvent ev) {
long timestampEvent = ev.getEventTime();
String action = MotionEvent.actionToString(ev.getAction());
float offsetX = ev.getRawX()-ev.getX();
float offsetY = ev.getRawY()-ev.getY();
final int historySize = ev.getHistorySize();
final int pointerCount = ev.getPointerCount();
for (int h = 0; h < historySize; h++) {
long timestampOffset = ev.getHistoricalEventTime(h);
for (int p = 0; p < pointerCount; p++) {
float positionX = ev.getHistoricalX(p, h) + offsetX;
float positionY = ev.getHistoricalY(p, h) + offsetY;
float pressure = ev.getHistoricalPressure(p, h);
}
}
for (int p = 0; p < pointerCount; p++) {
float positionX = ev.getX(p) + offsetX;
float positionY = ev.getY(p) + offsetY;
float pressure = ev.getPressure();
}
}