Несколько событий касания MotionEvent перепутаны и влияют друг на друга (см. Демонстрационное видео) - PullRequest
3 голосов
/ 24 сентября 2010

Назначение приложения:

Простое приложение, которое рисует круг для каждого касания, распознанного на экране, и отслеживает события касания.При «показаниях высокого давления» getPressure (int pointerIndex) цвет круга изменится, а радиус увеличится.Кроме того, идентификатор касания с getPointerId (int pointerIndex), координатами x и y и давлением отображаются рядом с касанием пальца.

После фрагмента кода важной части (пожалуйста, простите, это не самый хороший код;) Я знаю)

protected void onDraw(Canvas canvas){

    //draw circle only when finger(s) is on screen and moves 
    if(iTouchAction == (MotionEvent.ACTION_MOVE)){
        int x,y;
        float pressure;

        //Draw circle for every touch
        for (int i = 0; i < touchEvent.getPointerCount(); i++){
            x = (int)touchEvent.getX(i);
            y = (int)touchEvent.getY(i);
            pressure = touchEvent.getPressure(i);

            //High pressure
            if (pressure > 0.25){
                canvas.drawCircle(x, y, z+30, pressureColor);
                canvas.drawText(""+touchEvent.getPointerId(i)+"  | "+x+"/"+y, x+90, y-80, touchColor);
                canvas.drawText(""+pressure, x+90, y-55, pressureColor);
            }else{ //normal touch event 
                canvas.drawCircle(x, y, z, touchColor);
                canvas.drawText(""+touchEvent.getPointerId(i)+" | "+x+"/"+y, x+60, y-50, touchColor);
                canvas.drawText(""+pressure, x+60, y-25, pressureColor);
            }
        }           
    }
}

Проблема:

HTC Desire под управлением Android 2.1 является тестовой платформой.Приложение работает отлично и отслеживает два пальца без проблем.Но кажется, что две точки касания сталкиваются друг с другом, когда они находятся близко друг к другу - похоже, что они окружают «привязку» к общей оси x и y.Иногда они даже меняют координаты ввода другого сенсорного события.Другая проблема заключается в том, что, хотя getPressure (int pointerIndex) относится к PointerID, оба события касания имеют одинаковое значение давления.

Поскольку все это немного абстрактно, найдите видео здесь: http://www.youtube.com/watch?v=bFxjFexrclU

Мой вопрос:

  1. Мой код простопросто неправильно?
  2. Разве Android 2.1 не достаточно хорошо обрабатывает сенсорные события?
  3. Это аппаратная проблема и не имеет ничего общего с 1) и 2)?

Спасибо за ответы и / или ссылки на другую ветку (извините, я мог найти ту, которая решает эту проблему).

Крис

Ответы [ 2 ]

3 голосов
/ 24 сентября 2010

Я не хочу вам этого говорить, но это ваше аппаратное обеспечение.

Сенсорная панель, используемая в Nexus One (я думаю, это то же самое оборудование, которое используется в HTC Desire), известна именно этим артефактом.Мы проделали некоторую работу по устранению проблемы «прыжков на ось другого пальца» вокруг событий ACTION_POINTER_UP / DOWN для Android 2.2, отбросив некоторые обнаруживаемые плохие события, но проблема все еще сохраняется, когда указатели сближаются вдоль одной оси.Эта панель также известна случайным обращением координат X и Y;две точки (x0, y0) и (x1, y1) становятся (x0, y1) и (x1, y0).К сожалению, вы можете сделать очень много, когда «настоящие» данные исчезнут к тому времени, когда сам Android овладеет ими.

Это не единственная панель в дикой природе, которая имеет хитрые возможности мультитач.Чтобы сообщить во время выполнения, если у вас есть экран, способный к точному мультитач-отчету, без таких проблем, используйте PackageManager для проверки на FEATURE_TOUCHSCREEN_MULTITOUCH_DISTINCT.Если у вас нет этой функции, вы все равно можете надежно выполнять простые операции, такие как масштабирование жестов.

1 голос
/ 27 июня 2012

Кто-нибудь пробовал это исправление для мультитач жестов на старых андроидах раньше?Я планирую оценить его для моего собственного проекта , так как он также работает с ошибочным мультитачом android 1.x / 2.x.

Кажется, Люк также решил описанную здесь проблемукак и другие распространенные проблемы сенсорного ввода на устройствах до 3.x.

Надеюсь, это поможет, ура.

...