2010-09-24 2 views
3

Цель приложения:MotionEvent нескольких сенсорных событий перепутать и влияют друг на друга (см демонстрационное видео)

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

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

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)?

Благодарим за ответы и/или переходим к другим темам (извините, может найти тот, который решает эту проблему).

Крис

+0

Я определенно видел это раньше. Я думаю, что это, наверное, всего лишь 2.1, не очень хорошо играющий с мультитач. Попробуйте код на телефоне 2.2, если сможете. – Falmarri

+0

Спасибо за это Falmarri !!! Похоже, что аппаратное обеспечение также является проблемой. Это видео сравнивает Google Nexus One и Samsung Galaxy S, и у последнего нет никаких проблем с похожим приложением к моему! http://www.youtube.com/watch?v=hVlsRCMltDg&feature=player_embedded – chriz

ответ

3

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

Сенсорная панель, используемая в 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. Если у вас нет этой функции, вы можете надежно выполнять простые вещи, такие как жесты весов.

+0

Wow Adamp, спасибо за то, что это было мое подозрение, когда я увидел другое видео с подобными проблемами! Будет проверять «FEATURE_TOUCHSCREEN_MULTITOUCH_DISTINCT» для моих доступных устройств. Мне было интересно, как узнать о аппаратной платформе и ее мультитач-функциях, не покупая на самом деле устройство? Для исследовательского проекта, над которым я работаю, мы не решили на реальной платформе. В системе Android есть «getPressure (int pointerIndex)», но есть проблемы с мультитач - у продуктов iOS есть хорошие возможности мультитач, но нет открытого API для чтения псевдо давления на экране? Мысли? – chriz

+0

см. Эту ссылку для чтения псевдодавлений для iPHone: http://stackoverflow.com/questions/3316358/ipad-measure-detect-covered-area-by-a-finger-touch-on-screen-not-only- сенсорный ворковать – chriz

1

Все опробованные this fix for multitouch gestures на старых андроидах раньше? Я планирую оценить его для my own project, так как он также имеет дело с android 1.x/2.x buggy multitouch.

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

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