2014-01-30 2 views
2

У меня есть кнопка, которую я оживляю при нажатии кнопки. Я хочу, чтобы он вернулся в свое «нормальное» состояние после того, как я перетащил за пределы определенного порога.Как мне заставить перестать слушать события касания после ACTION_MOVE?

Я создаю прямоугольник границ обзора на ACTION_DOWN и проверьте, не находится ли он из области касания в ACTION_MOVE. Я успешно обнаруживаю прикосновение «вне границ», но я не могу получить представление, чтобы перестать слушать прикосновения. Это похоже на то, что он игнорирует мой метод animateToNormal().

Я попытался изменить возвращаемое значение boolean на true вместо false, что не помогло. Я также попытался удалить прослушиватель прикосновений в случае ACTION_MOVE (установить нуль), но мне нужно снова подключиться, чтобы продолжить прослушивание касаний. Я полагаю, что могу добавить произвольную задержку, прежде чем добавлять ее обратно, но это кажется ужасным взломом.

Я тестирую это на устройстве 4.2 (LG G2).

private static class AnimationOnTouchListener implements View.OnTouchListener { 
     private Rect rect; 

     @Override 
     public boolean onTouch(View view, MotionEvent motionEvent) { 

      switch(motionEvent.getAction()) { 
       case MotionEvent.ACTION_DOWN: 
        rect = new Rect(view.getLeft(), view.getTop(), view.getRight(), view.getBottom()); 
        animatePressed(); 
        return false; 

       case MotionEvent.ACTION_CANCEL: 
       case MotionEvent.ACTION_UP: 
        // back to normal state 
        animateBackToNormal(); 
        return false; 

       case MotionEvent.ACTION_MOVE: 
        if(!rect.contains(view.getLeft() + (int) motionEvent.getX(), view.getTop() + (int) motionEvent.getY())){ 
         d(TAG, "out of bounds"); 
         animateBackToNormal(); 
         // STOP LISTENING TO MY TOUCH EVENTS! 

        } else { 
         d(TAG, "in bounds"); 
        } 
        return false; 
       default: 
        return true; 
      } 
     } 
+0

Забавно, у меня есть другая проблема. Я хочу продолжать получать события, но я этого не делаю. http://stackoverflow.com/questions/34908569/android-continue-receiving-touch-events-in-a-view-after-the-touch-is-dragged –

ответ

6

Почему вы просто не слушаете, а устанавливаете утверждение, чтобы игнорировать событие движения?

Нечто подобное:

private static class AnimationOnTouchListener implements View.OnTouchListener { 
     private Rect rect; 
     private boolean ignore = false; 

    @Override 
    public boolean onTouch(View view, MotionEvent motionEvent) { 
     if(ignore && motionEvent.getAction()!=MotionEvent.ACTION_UP) 
      return false; 
     switch(motionEvent.getAction()) { 
      case MotionEvent.ACTION_DOWN: 
       rect = new Rect(view.getLeft(), view.getTop(), view.getRight(), view.getBottom()); 
       animatePressed(); 
       return false; 

      case MotionEvent.ACTION_CANCEL: 
      case MotionEvent.ACTION_UP: 
       // back to normal state 
       animateBackToNormal(); 

       // IMPORTANT - touch down won't work if this isn't there. 
       ignore = false; 
       return false; 

      case MotionEvent.ACTION_MOVE: 
       if(!rect.contains(view.getLeft() + (int) motionEvent.getX(), view.getTop() + (int) motionEvent.getY())){ 
        d(TAG, "out of bounds"); 
        animateBackToNormal(); 
        // STOP LISTENING TO MY TOUCH EVENTS! 
        ignore = true; 
       } else { 
        d(TAG, "in bounds"); 
       } 
       return false; 
      default: 
       return true; 
     } 
    } 
+0

У меня возникло непонимание того, что сделали возвращаемые значения. Благодаря! Мне нужно было сделать одну настройку для вашего кода (добавьте 'ignore = false;' в 'ACTION_UP', но в целом это работает! – loeschg

+0

Просто, чтобы сказать, это кажется мне быстрым решением, но не лучшим, если вы найдете" более «правильное решение», пожалуйста, напишите в этой теме – GhostDerfel

+0

, вы делаете хороший момент. Я не буду принимать ваш ответ еще немного, чтобы побудить других публиковать сообщения. Я согласен, если нет других ответов. – loeschg

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