2017-06-16 4 views
0

フィンガーまたは2本の指が押されたときに異なるアクションを実行する必要があるアプリで問題が発生します。私は2本の指、マルチタッチ一部レジスタを押したときAndroid 2フィンガータッチトリガー1フィンガータッチと2フィンガータッチ

@Override 
    public boolean onTouchEvent(MotionEvent event){ 
     int touchX = (int)event.getX(); 
     int touchY = (int)event.getY(); 
     int action = event.getActionMasked(); 

     //Multitouch 
     if(event.getPointerCount() > 1 && action == MotionEvent.ACTION_POINTER_DOWN){ 
      System.out.println("2 Finger press"); 

      return true; 
     } 
     else if(action == MotionEvent.ACTION_DOWN && action != MotionEvent.ACTION_POINTER_DOWN){ 

      if(event.getPointerCount() == 1) { 
       System.out.println("single finger down"); 
       invalidate(); 
       return true; 
      } 
     } 

     return false; 
    } 

私が午前問題があり、その後ので、単一のプレスを行います。

は現在、私は次のコードを持っています。

私はそれを修正する方法をいくつか調べました。その理由は、私が問題を解決すると思ったaction != MotionEvent.ACTION_POINTER_DOWNというシングルタッチ条件をチェックしているからです。これで問題は解決しなかったので、event.getPointerCount() == 1をチェックすることにしましたが、残念ながら2本の指で押すと両方の行が印刷されます。

要約すると、2本の指が押されたときに2本の指の部分だけを呼び出す必要があります。

答えて

1

"Handling Multi-Touch Gestures"のドキュメントを参照してください。それはあなたが探しているものを正確に詳述します。

本質的に、各アクティブポインタには、画面と接触するときにIDが割り当てられます。あなたのソリューションでは、どのIDが有効になり、さまざまなアクション状態を観察することによって削除されるのかを考慮する必要があります。

何かこれらの線に沿って少し(しかしgetActionIndex()のようなメソッドのための互換性の呼び出しを注意してください):

更新されたコードSAMPLE

public class MotionActivity extends AppCompatActivity { 

    private int primaryPointerId = -1; 
    private int secondaryPointerId = -1; 

    @Override 
    protected void onCreate(@Nullable Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     setContentView(new FrameLayout(this)); 
    } 

    @Override 
    public boolean onTouchEvent(MotionEvent event){ 
     int action = event.getActionMasked(); 

     switch(action) { 
      case MotionEvent.ACTION_DOWN: 
       primaryPointerId = event.getPointerId(0); 

       Log.d(getClass().getName(), "Primary pointer ID == [" + primaryPointerId + "]"); 

       break; 

      case MotionEvent.ACTION_POINTER_DOWN: 
       secondaryPointerId = event.getPointerId(event.getActionIndex()); 

       Log.d(getClass().getName(), "Secondary pointer ID == [" + secondaryPointerId + "]"); 

       break; 

      case MotionEvent.ACTION_MOVE: 
       if(primaryPointerId > -1 && secondaryPointerId > -1) { 
        Log.d(getClass().getName(), "Two-point touch..."); 
       } else { 
        Log.d(getClass().getName(), "One-point touch..."); 
       } 

       break; 

      case MotionEvent.ACTION_POINTER_UP: 
       if(event.getPointerId(event.getActionIndex()) == primaryPointerId) { 
        primaryPointerId = secondaryPointerId; 
       } 

       secondaryPointerId = -1; 

       break; 

      case MotionEvent.ACTION_UP: 
       primaryPointerId = -1; 

       break; 
     } 

     return true; 
    } 
} 
+0

私はその上のドキュメントを再読み込みする必要がありますし、それをどうやって行うのかを考えてください。私は、あなたのサンプルコードが間違っていると信じていますが、2本の指の押さえを全く登録していません。私はこれがsecondaryPointerId = -1によって引き起こされたと考えます。これは、マルチタッチの条件が満たされないことを意味します。 – kalenpw

+0

'' MotionEvent.ACTION_POINTER_DOWN'のアクションを受け取ったときに 'secondaryPointerId'を割り当てる必要があります。正しいアクションインデックスを参照する方法についての私の仕組みはオフになっているかもしれません(私はそれをメモリから書きました)が、要点は正しいです。 'secondaryPointerId' == -1の場合は、表面に指が1つ(または全くない)ためです。 – hsl

+0

私はそれをもっと調べていましたが、問題は 'case MotionEvent.ACTION_POINTER_DOWN'は実際には入力されませんでした。なぜこれが正しいと思うのですか?私はあなたがsecondaryPointerIdについて何を意味するのかを見ています – kalenpw

関連する問題