2015-06-28 4 views
0

Вот мой код:Android мультитач: нет ACTION_POINTER_DOWN и события UP

public boolean onTouch(View v, MotionEvent event) { 

    switch(event.getActionMasked()) { 

    case MotionEvent.ACTION_DOWN: 
     Log.d("getButtonCode", "catch ACTION_DOWN"); 
     break; 
    case MotionEvent.ACTION_POINTER_DOWN: 
     Log.d("getButtonCode", "catch ACTION_POINTER_DOWN"); 
     break; 
    case MotionEvent.ACTION_POINTER_UP: 
     Log.d("getButtonCode", "catch ACTION_POINTER_UP"); 
     break; 
    case MotionEvent.ACTION_UP: 
     Log.d("getButtonCode", "catch ACTION_UP"); 
    case MotionEvent.ACTION_CANCEL: 
     Log.d("getButtonCode", "catch ACTION_CANCEL"); 
    case MotionEvent.ACTION_MOVE: 
     break; 
    default: 
     break; 
    } 
    return true; 
} 

, и я никогда не поймать ACTION_POINTER_DOWN и ACTION_POINTER_UP. Если я удалю break из ACTION_DOWN, я поймаю ACTION_POINTER_DOWN всегда после ACTION_DOWN, даже если это первый указатель. Я думаю, что это должно быть так: первый указатель поймал только ACTION_DOWN, каждый следующий указатель только ACTION_POINTER_DOWN, если не основной указатель поднялся, я должен поймать ACTION_POINTER_UP.

Но это не работает. Что не так в моем коде?

PS: Я видел другие подобные вопросы, но ответ не помог мне.

ответ

0

Вместо использования оператора switch я прошел через ряд операторов if. Это позволяет мне протестировать событие event.getAction() или event.getActionMasked() и разрешить сразу несколько возможных действий.

public boolean onTouch(View v, MotionEvent event) { 
      if (event.getAction() == MotionEvent.ACTION_DOWN) { 
       startingX = (int) event.getX(); 
       startingY = (int) event.getY(); 
      } 
      if(event.getAction() == MotionEvent.ACTION_MOVE) { 
       int scaleX = 1; 
       int scaleY = 1; 
       if(touchStateScale == true){ 
        scaleX = (int) (event.getX(0) - event.getX(1)); 
        scaleY = (int) (event.getY(0) - event.getY(1)); 
       } 
       int endingX = (int) event.getX(); 
       int endingY = (int) event.getY(); 

       int newX = endingX-startingX; 
       int newY = endingY-startingY; 


      ((ImageView) v).setImageBitmap(drawNewImageScaled(baseImage, newImageResourceId, newX, newY, scaleX, scaleY)); 
      } 
      if(event.getActionMasked() == MotionEvent.ACTION_POINTER_DOWN){ 
       Log.i(TAG, "second pointer detected"); 
       touchStateScale = true; 
      } 
      if (event.getAction() == MotionEvent.ACTION_UP) { 
       touchStateScale = false; 
       return false; 
      } 
      return true; 
     } 
    };