4

У меня возникла проблема с пользовательской кнопкой, которую я создал. Он состоит из коробки и небольшой линии под ней.Android: обнаружение внешней кнопки ACTION_UP

При нажатии на кнопку анимируется вниз, когда вы нажимаете на нее и снова включаете ее. Это обрабатывается в CustomButton.class:

super.setOnTouchListener(new View.OnTouchListener() { 
      @Override 
      public boolean onTouch(View v, MotionEvent event) { 
       if (event.getActionMasked() == MotionEvent.ACTION_DOWN) { 
        buttonContent.startAnimation(rectMoveDown); 
        colorDown.start(); 
        return false; 
       } 
       if (event.getActionMasked() == MotionEvent.ACTION_UP) { 
        buttonContent.startAnimation(rectMoveUp); 
        colorUp.start(); 
        return false; 
       } 
       return false; 
      } 
     }); 

Тогда в остальной части приложения я использую эту кнопку и установить clicklistener к нему. Поэтому я возвращаю false (я думаю, что это правильно, по крайней мере), так как я не хочу потреблять событие, но передаю его клиенту-клиенту в иерархии.

Однако проблема возникает, когда я сначала нажимаю на кнопку, передвигаю палец за кнопкой, а затем отпустите экран. Затем кнопка не отображает анимацию, выполненную в прослушивателе ACTION_UP.

Кто-нибудь знает, как это исправить?

ответ

3

Найдено, как я мог бы решить после некоторых более тестирования !

После прочтения некоторых более в документации, которую я обнаружил, что MotionEvent.ACTION_CANCEL делает именно то, что мне нужно:

Текущий жест был прерван. Вы не получите больше баллов. Вы должны рассматривать это как событие up, но не выполнять любое действие, которое вы обычно делаете.

Так что теперь мой TouchListener выглядеть следующим образом (и работает, как и должно быть):

super.setOnTouchListener(new View.OnTouchListener() { 
      @Override 
      public boolean onTouch(View v, MotionEvent event) { 
       switch (event.getActionMasked()) { 
        case MotionEvent.ACTION_DOWN: 
         buttonContent.startAnimation(rectMoveDown); 
         colorDown.start(); 
         return false; 
        case MotionEvent.ACTION_UP: 
        case MotionEvent.ACTION_CANCEL: 
         buttonContent.startAnimation(rectMoveUp); 
         colorUp.start(); 
         return false; 
       } 
       return false; 
      } 
     }); 

Это не было, что я начал использовать ключ-дело, что решить ее, но я изменил к нему в чтобы код выглядел лучше. Как вы можете видеть, я обрабатываю ACTION_UP и ACTION_CANCEL точно так же.

Я возвращаю false везде, чтобы активировать OnClickListener, что бы это было не так, если бы я вернул true.

1

Вы должны использовать переключатель вместо если и возвращает истину в случаях:

public boolean onTouch(View v, MotionEvent event) { 
      switch (event.getAction()) { 
       case MotionEvent.ACTION_UP: 
        // Some code 
        return true; 
       case MotionEvent.ACTION_DOWN: 
        // Some code 
        return true; 
      } 
      return false; 
     } 

Это работает для меня, я надеюсь, что это помогает вам

+0

Это не работает для меня! Во-первых, мне нужно вернуть false, поскольку в противном случае кнопка не будет запускать подключенный к нему клик-прослушиватель. И даже когда я вернусь, это не сработает. –

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