У меня есть пользовательский объект, который также распространяется на 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();
}
Я также попытался отправить событие ACTION_UP из анимации в конце прыжка, чтобы сломать перетаскивание. – wilkas
Также пытались использовать 'view.setEnabled (false);' и 'view.setEnabled (true);' в состояниях анимации, но все работает одинаково, предыдущий жест продолжается. – wilkas
Не совсем понятно, что вы просите. – barq