私はView.OnTouchListener
も拡張しているカスタムオブジェクトを持っています。それはonTouch
イベントをドラッグして使用します。このカスタムオブジェクトは、ターゲットオブジェクトとの衝突を検出するたびに、カスタムイベントを起動します。このイベントを受け取ったMainActivity
は、カスタムオブジェクトのパブリックメソッドを使用してアニメーションを開始し、カスタムオブジェクトを初期位置に移動します。 onAnimationStart
がAnimatorSet
の場合、はnull
に設定され、onAnimationEnd
にはカスタムオブジェクトが再びOnTouchListener
と割り当てられています。これは、以下のような誤動作の原因です。 私はカスタムビューをタッチしてターゲットオブジェクトに指をドラッグしますが、最初の位置に戻るアニメーションが開始され、ターゲットオブジェクトの周りにドラッグし続けると指を離しません。カスタムビューは元の位置に戻りますが、タッチ位置に再び表示され、最初の位置に戻り、何度も何度も繰り返されます。OnTouchListenerをリセットするには?
私はイベントを消費するために "true"を返すMOVEイベントを壊そうとしましたが、何も役に立ちません。以前のタッチから新しい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クラスの)イベント処理コード:returnToInitPositionの
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);
}
}
コード()(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