【发布时间】:2016-12-07 06:35:46
【问题描述】:
我有一个自定义对象,它也扩展了View.OnTouchListener。它使用onTouch 事件进行拖动。每当此自定义对象检测到与目标对象的碰撞时,它都会触发自定义事件。收到此事件后,MainActivity 使用该自定义对象的公共方法启动动画,将自定义对象移动到初始位置。在AnimatorSet 的onAnimationStart 中,OnTouchListener 设置为null,而在onAnimationEnd 中,该自定义对象再次分配了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 事件,它会破坏拖动。
-
也尝试在动画状态下使用
view.setEnabled(false);和view.setEnabled(true);,但一切都一样,继续之前的手势。 -
不太清楚,你在问什么。
-
我在问如何确保我的 CustomObject 在发生碰撞事件后会保持在原位,我需要重新触摸它才能再次拖动它。换句话说,即使用户继续拖动手指,我也需要模拟在触发事件时释放手指。
-
我什至尝试在 1 秒后使用 Runnable 和 Handler 重新分配 OnTouchListener,但如果我继续拖动手指超过 1 秒,我的自定义对象仍然会对之前的手势做出反应。
标签: android android-view