如何重置 OnTouchListener?
How to reset OnTouchListener?
我有一个自定义对象,它也扩展了 View.OnTouchListener
。它使用 onTouch
事件来拖动。每当此自定义对象检测到与目标对象的碰撞时,它就会触发自定义事件。收到此事件后,MainActivity
使用该自定义对象的 public 方法开始动画,将自定义对象移动到初始位置。在 AnimatorSet
的 onAnimationStart
中,OnTouchListener
设置为 null
,而在 onAnimationEnd
中,自定义对象再次分配了 OnTouchListener
- 这是故障的罪魁祸首,如下所示。
我触摸自定义视图并将手指拖动到目标对象,但是当 return 到初始位置的动画开始并继续围绕目标对象拖动时,我没有松开手指。自定义视图 returns 到初始位置,但随后重新出现在触摸位置和 returns 到初始位置,这一次又一次地重复。
我尝试中断 MOVE 事件,returning "true" 以使用该事件,但无济于事。我如何 release/reset 新 onTouchListener
从以前的接触?
onTouch 代码(在 MyCustomObject class 中):
@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 class):
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 class 中):
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 之外的所有其他事件(以这种方式结束当前手势)。检测到此动作后,将重新分配原始触摸侦听器。
我有一个自定义对象,它也扩展了 View.OnTouchListener
。它使用 onTouch
事件来拖动。每当此自定义对象检测到与目标对象的碰撞时,它就会触发自定义事件。收到此事件后,MainActivity
使用该自定义对象的 public 方法开始动画,将自定义对象移动到初始位置。在 AnimatorSet
的 onAnimationStart
中,OnTouchListener
设置为 null
,而在 onAnimationEnd
中,自定义对象再次分配了 OnTouchListener
- 这是故障的罪魁祸首,如下所示。
我触摸自定义视图并将手指拖动到目标对象,但是当 return 到初始位置的动画开始并继续围绕目标对象拖动时,我没有松开手指。自定义视图 returns 到初始位置,但随后重新出现在触摸位置和 returns 到初始位置,这一次又一次地重复。
我尝试中断 MOVE 事件,returning "true" 以使用该事件,但无济于事。我如何 release/reset 新 onTouchListener
从以前的接触?
onTouch 代码(在 MyCustomObject class 中):
@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 class):
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 class 中):
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 之外的所有其他事件(以这种方式结束当前手势)。检测到此动作后,将重新分配原始触摸侦听器。