2016-12-07 4 views
0

У меня есть пользовательский объект, который также распространяется на View.OnTouchListener. Он использует onTouch события, которые нужно перетаскивать. Всякий раз, когда этот пользовательский объект обнаруживает столкновение с целевым объектом, он запускает настраиваемое событие. После получения этого события MainActivity использует открытый метод этого пользовательского объекта для запуска анимации, который перемещает пользовательский объект в исходное положение. В onAnimationStart от AnimatorSet, OnTouchListener установлено значение null, а в onAnimationEnd этот пользовательский объект снова присваивается OnTouchListener - это является виновником неисправности, которая заключается в следующем. Я касаюсь пользовательского вида и перетаскиваю палец в целевой объект, но я не отпускаю палец, когда начинается анимация возврата в исходное положение и продолжает перетаскивать ее вокруг целевого объекта. Пользовательский вид возвращается в исходное положение, но затем снова появляется в касании и возвращается в исходное положение, и это повторяется снова и снова.Как сбросить OnTouchListener?

Я попытался сломать событие MOVE, возвращая «true», чтобы использовать событие, но ничего не помогает. Как мне сбросить/сбросить новый onTouchListener с предыдущего касания?

onTouch код (в классе MyCustomObject):

@Override 
public boolean onTouch(final View view, MotionEvent motionEvent) { 
     switch (motionEvent.getAction()) { 

      case MotionEvent.ACTION_DOWN: { 

       //moves view's center to the click location 

       break; 
      } 

      case MotionEvent.ACTION_UP: { 

       //returns view to initial position 

       break; 
      } 

      case MotionEvent.ACTION_MOVE: { 

       //moves the view at the center of touch -- dragging function 

       //checks for collision 
       if (collission occured) { 

         //trigger event 
         listener.myEvent((MyCustomObject) view); 

       } 

       break; 
      } 

     } 

     //does not consume touch 
     return true; 

    } 

обработки событий кода (в классе MainActivity):

MyCustomObject.EventsListener listener = new MyCustomObject.EventsListener() { 
      @Override 
      public void MyEvent(MyCustomObject submittedObject) { 

       //some code to decide if return to initial position should occur 

       //return custom object to initial position 
       submittedObject.returnToInitPosition(submittedObject); 

       } 

      } 

Код returnToInitPosition() (в MyCustomObject класс):

public void returnToInitPosition(final View view) { 

    //return to initial position animation 
    AnimatorSet set = new AnimatorSet(); 
    set.playTogether(---my anims---); 

    //temporary remove of onTouch listener 
    set.addListener(new AnimatorListenerAdapter() { 
     @Override 
     public void onAnimationStart(Animator animation) { 
      super.onAnimationStart(animation); 

      //remove listener on animation start 
      view.setOnTouchListener(null); 
     } 

     @Override 
     public void onAnimationEnd(Animator animation) { 
      super.onAnimationEnd(animation); 

      //re-add listener on animation complete 
      view.setOnTouchListener(MyCustomObject.this); 
     } 

    }); 

    //start animation 
    set.start(); 

} 
+0

Я также попытался отправить событие ACTION_UP из анимации в конце прыжка, чтобы сломать перетаскивание. – wilkas

+0

Также пытались использовать 'view.setEnabled (false);' и 'view.setEnabled (true);' в состояниях анимации, но все работает одинаково, предыдущий жест продолжается. – wilkas

+0

Не совсем понятно, что вы просите. – barq

ответ

0

Мне удалось решить это, назначив другого приёмника прослушивания при запуске анимации. Этот другой пользовательский сенсорный прослушиватель игнорирует все другие события, кроме ACTION_UP (таким образом текущий жест заканчивается). После обнаружения этого действия первоначальный сенсорный прослушиватель переназначается.

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