2016-12-07 13 views
0

私はView.OnTouchListenerも拡張しているカスタムオブジェクトを持っています。それはonTouchイベントをドラッグして使用します。このカスタムオブジェクトは、ターゲットオブジェクトとの衝突を検出するたびに、カスタムイベントを起動します。このイベントを受け取ったMainActivityは、カスタムオブジェクトのパブリックメソッドを使用してアニメーションを開始し、カスタムオブジェクトを初期位置に移動します。 onAnimationStartAnimatorSetの場合、は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(); 

} 
+0

アニメーションの終了からACTION_UPイベントをディスパッチしようとしましたが、ドラッグを中断します。 – wilkas

+0

アニメーションの状態で 'view.setEnabled(false);'と 'view.setEnabled(true);を使ってみましたが、すべて同じ動作をしていました。 – wilkas

+0

あなたは何を求めているのですか? – barq

答えて

0

私はアニメーションの開始時に別のタッチリスナーを割り当てることでこれを解決することができました。この別のカスタムタッチリスナーは、ACTION_UP以外のすべてのイベントを無視します(この方法では、現在のジェスチャは終了します)。この動作を検出すると、元のタッチリスナが再割り当てされる。

関連する問題