Обработка 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();
    }
}

0 ответов

Другие вопросы по тегам