1

Итак, я думаю, что у меня очень простая проблема, но я не могу понять это.Android OnTouch MotionEvent Actions

У меня есть ImageView, и я использую его метод setOnTouchListener (OnTouch).

Как я могу провести различие между событием ACTION_DOWN и событием ACTION_MOVE?

Даже когда я просто нажимаю (касание) на ImageView, ACTION_MOVE событие вызывается.

Моя цель - открыть что-нибудь (сделать что-нибудь), когда пользователь нажимает на нее и перемещает ее, когда пользователь удерживает ее и перемещает.

private int initialX; 
private int initialY; 
private float initialTouchX; 
private float initialTouchY; 

@Override 
public boolean onTouch(View v, MotionEvent event) { 
    switch (event.getAction()) { 
     case MotionEvent.ACTION_DOWN: 
      initialX = params.x; 
      initialY = params.y; 
      initialTouchX = event.getRawX(); 
      initialTouchY = event.getRawY(); 
      return true; 
     case MotionEvent.ACTION_UP: 
      return true; 
     case MotionEvent.ACTION_MOVE: 
      params.x = initialX + (int) (event.getRawX() - initialTouchX); 
      params.y = initialY + (int) (event.getRawY() - initialTouchY); 
      mWindowManager.updateViewLayout(mImgFloatingView, params); 

      // Log.d("Params", "X: " + params.x + ". Y: " + params.y + "."); 

      if(params.x == initialX && params.y == initialY) { 
       Toast.makeText(getBaseContext(), "Test", Toast.LENGTH_SHORT).show(); 
      } 

      return true; 
     } 
     return false; 
} 
+0

ACTION_DOWN вызывается, когда вы сначала наводите палец на экран.Затем, если вы держите палец на экране и начинаете его перемещать, ACTION_MOVE называется – yrazlik

+0

Я понимаю, что, но моя проблема в том, что когда я просто нажимаю на «ImageView», сначала вызывается ACTION_DOWN, а затем ACTION_MOVE. Это происходит даже тогда, когда я просто нажимаю (клик), а не двигаюсь. Почему это? –

ответ

0

Что происходит, так это то, что View.OnTouchListener отправит вам ВСЕ события. Если вы нажмете и переместите только на 1 пиксель, он будет зарегистрирован как ACTION_MOVE.

Вам понадобится реализовать некоторую логику для определения действия «hold» - ожидания 100 мс или что-то подобное - после чего может быть выполнено действие «перетащить». До этого времени это должно быть просто щелчком.

0

Как и другие, ACTION_MOVE вызывается вместе с ACTION_DOWN из-за чувствительности устройства и присущей им нечувствительности больших пальцев. Это называется touch slop. Результаты, которые вы хотите получить, можно получить, установив пороговые значения для перемещения времени и расстояния. Кроме того, вы можете использовать gesture detector.

OnTouch MotionEvent Действия

Основываясь на названии вопроса, я пришел сюда в поисках быстрой ссылки для onTouchMotionEvent действий. Так вот фрагмент скопирован из documentation:

@Override 
public boolean onTouchEvent(MotionEvent event){ 

    int action = event.getActionMasked(); 

    switch(action) { 
     case (MotionEvent.ACTION_DOWN) : 
      Log.d(DEBUG_TAG,"Action was DOWN"); 
      return true; 
     case (MotionEvent.ACTION_MOVE) : 
      Log.d(DEBUG_TAG,"Action was MOVE"); 
      return true; 
     case (MotionEvent.ACTION_UP) : 
      Log.d(DEBUG_TAG,"Action was UP"); 
      return true; 
     case (MotionEvent.ACTION_CANCEL) : 
      Log.d(DEBUG_TAG,"Action was CANCEL"); 
      return true; 
     case (MotionEvent.ACTION_OUTSIDE) : 
      Log.d(DEBUG_TAG,"Movement occurred outside bounds " + 
        "of current screen element"); 
      return true; 
     default : 
      return super.onTouchEvent(event); 
    } 
} 

Примечания:

  • Приведенный выше код может быть использован в деятельности или подклассы зрения. Если подклассирование представления нежелательно, то одни и те же события движения можно отслеживать, добавив OnTouchListener к представлению. (Пример также взят из documentation)

    View myView = findViewById(R.id.my_view); 
    myView.setOnTouchListener(new OnTouchListener() { 
        public boolean onTouch(View v, MotionEvent event) { 
         // ... Respond to touch events 
         return true; 
        } 
    }); 
    
  • Difference between getAction() and getActionMasked()

  • Возвращение true означает, что будущие события будут обработаны. Поэтому, если вы вернули false для ACTION_DOWN, тогда все остальные события (например, перемещение или вверх) будут проигнорированы.

Дальнейшее чтение

  • Using Touch Gestures: Это серия официальных уроков в документации. Это важно прочитать, чтобы понять, как правильно обрабатывать сенсорные события и жесты.
Смежные вопросы