2013-12-18 3 views
0

Я пытаюсь исправить проблему, которая появляется в моем коде, когда я добавил функции мультитач в моем приложении. Проблема, кажется, исходит из ACTION_POINTER_DOWN:Multitouch - PointerIndex вне диапазона

private float oldDist = 0; 
backCard.setOnTouchListener(new OnTouchListener() { 
@Override 
     public boolean onTouch(View v, MotionEvent me) { 

      switch(me.getAction()){ 
      case MotionEvent.ACTION_DOWN: 
        firstX = (int) me.getX(); 
      case MotionEvent.ACTION_POINTER_DOWN: 
       if(me.getPointerCount() >= 2){ 
        oldDist = getSpacing(me); 
        System.out.println(oldDist); 
       }      
       break; 
      case MotionEvent.ACTION_MOVE: 
        float newDist = getSpacing(me); 
        if(newDist - oldDist > 200 && oldDist != 0){ 
         System.out.println("Enabled"); 
        } 
       break; 
      case MotionEvent.ACTION_UP:   
      case MotionEvent.ACTION_POINTER_UP: 
       break; 
      } 
      return true; 

     } 
private float getSpacing(MotionEvent me){ 
      float difx = me.getX(0) - me.getX(1); 
      float dify = me.getY(0) - me.getY(1); 
      float spacing = (float) Math.sqrt(difx*difx + dify*dify); 
      return spacing; 
     } 
}); 

Когда я использую его без условия getPointerCount() в ACTION_POINTER_DOWN, у меня есть об отсутствии ошибок диапазона. Но если я использую это условие, журнал не отображает ничего, что я напечатаю в коде. (Конечно, я использую 2 пальца! :)), поэтому условие никогда не будет истинным, даже если несколько пальцев коснутся экрана одновременно.

Как это исправить? Спасибо.

Мое устройство GS3.

+1

Я не думаю, что ACTION_DOWN поставляется один раз для всех пальцев. Маловероятно, что вы получите оба пальца точно в тот же момент, в миллисекундах друг от друга. Я предлагаю вам сосредоточиться на ACTION_MOVE. – 323go

ответ

1

Использование me.getActionMasked() вместо me.getAction()

+0

Благодарим вас за быстрый ответ, который отлично работает! ;) Но я попытался понять в других ответах на сайте, в чем разница между getAction и getActionMasked, но все же скептически. Вы можете мне объяснить? Еще раз спасибо. – mickaelb91

+0

Нет проблем :) getAction() вернет действие, которое произошло вместе с любой информацией о вовлеченном указателе. getActionMasked() маскирует информацию указателя и только возвращает действие, которое произошло; это похоже на выполнение 'getAction() & MotionEvent.ACTION_MASK'. Кроме того, getAction() предоставит вам только ACTION_DOWN и т. Д., Но никогда не будет аналогичным указателем ACTION_POINTER_DOWN, поэтому он работал впервые без if-statement из-за случайного пропада, но не во второй раз с ним :) – Badgerati

Смежные вопросы