2010-11-19 3 views
8

マルチタッチを処理する必要のあるアプリケーションを開発しています。基本的に私は回転のためのワンタッチが欲しいです(これは問題ありません)。スクロール用のマルチタッチ。マルチタッチをコーディングする方法

私は基本的なコードを持っていますが、シングルからマルチタッチ、およびバイカの移動が発生すると問題が発生します。基本的には、マルチタッチの中央位置(2本の指)と1本の指の絶対位置が離れているため、動きが激しくなります。だから私が画面上に2本の指を持っていれば、彼らは中央の位置を作り、1本の指を持ち上げると、中央の位置から絶対的な1本の指の位置への素早い動きのようになります。これは私が望まない動きです。

これは私のコードです:

@Override 
public boolean onTouchEvent(MotionEvent event) { 
    float xEvent[] = new float[ 2 ]; 
    float yEvent[] = new float[ 2 ]; 
    switch(event.getPointerCount()) { 
     case 1: 
      xEvent[ 0 ] = event.getX(0); 
      yEvent[ 0 ] = event.getY(0); 
      switch(event.getAction()) { 
       case MotionEvent.ACTION_DOWN: 
        camera.onTouchDown(xEvent[ 0 ], yEvent[ 0 ]); 
        return true; 
       case MotionEvent.ACTION_MOVE: 
        camera.onTouchRotate(xEvent[ 0 ], yEvent[ 0 ]); 
        return true; 
       default: return super.onTouchEvent(event); 
      } 
     case 2: 
      xEvent[ 0 ] = event.getX(0); 
      yEvent[ 0 ] = event.getY(0); 
      xEvent[ 1 ] = event.getX(1); 
      yEvent[ 1 ] = event.getY(1); 
      switch(event.getAction()) { 
       case MotionEvent.ACTION_DOWN: 
        camera.onTouchDown(((xEvent[ 0 ] + xEvent[ 1 ])/2), ((yEvent[ 0 ] + yEvent[ 1 ])/2)); 
        return true; 
       case MotionEvent.ACTION_MOVE: 
        camera.onTouchSlide(((xEvent[ 0 ] + xEvent[ 1 ])/2), ((yEvent[ 0 ] + yEvent[ 1 ])/2)); 
        return true; 
       case MotionEvent.ACTION_POINTER_1_UP: 
        camera.onTouchDown(xEvent[ 1 ], yEvent[ 1 ]); 
        return true; 
       case MotionEvent.ACTION_POINTER_2_UP: 
        camera.onTouchDown(xEvent[ 0 ], yEvent[ 0 ]); 
        return true; 
       default: return super.onTouchEvent(event); 
      } 
     default: return false; 
    } 
} 

カメラのonTouchDown機能だけでタッチ移動の最初の値を設定します。そのため、マルチタッチからシングルタッチの動きに新しい値を設定するアップ動作にもこの機能を使用しています。

誰かが自分の問題点を知っていて、さらに助けてくれることを願っています。

答えて

10

ここでスタートあなたはすでにそれを読んでいない場合、それは、Androidでマルチタッチを扱う多くのものの上に行く:http://android-developers.blogspot.com/2010/06/making-sense-of-multitouch.html

あなたの投稿コードについていくつかのこと:

  1. あなた'LLポインターカウントが2のACTION_DOWNは表示されません。ACTION_DOWNは、最初にダウンするポインターに対してのみ送信されます。最初の後に画面に触れるすべての指はACTION_POINTER_DOWNを送信します。
  2. 指触れが2つしかないと仮定すると、もっと簡単になることがあります。
  3. マスクされたアクション(使用MotionEvent#getActionMasked())を使用すると、各ポインタインデックスを個別にコーディングするよりもずっと簡単です。
  4. 最後に、インデックスは、MotionEventからデータを引き出すためのものです。時間の経過とともにポインタの動きを追跡する場合は、ポインタIDを使用します。
  5. ポインタIDは単なる数字です。彼らが0以上の整数であること以外にどのような値を持つかについては仮定しないでください。
+0

Thanx!私はちょうど80%働く1つの実装を終了しました。しかし、そのリンクを読んだ後、私はマスクとIDを使ってうまくいくと思います。 – Espen

2

すでに内蔵のより良い方法があるかもしれませんが、あなたは、簡単な計算でこれを解決することができます。

をするだけ.ACTION_POINTER_X_UPイベントが発生して保持Booleanオブジェクトの各指の位置を保持するオブジェクトを作成しますあなたが最後に使用したタッチモードの種類。

case MotionEvent.ACTION_POINTER_1_UP: 
     camera.onTouchDown(xEvent[ 1 ], yEvent[ 1 ]); 
     boolean usedMultiTouch = true; 
     int x = event.getX(1); 
     int y = event.getY(1); 
     return true; 

次のあなたのACTION_MOVE彼らはマルチからシングルタッチに行ってきましたように、ユーザーが自分の指を移動する(ケース内= 1)文が起動します。

さて、あなたは何をしたいかに応じて、あなたは.ACTION_UPイベントが発生するまで(ブール値は、あなたのチェックです)、あなたは偽

または

に戻りブール値を設定し、単一の動きを無視しますか

あなたは、保存された位置の値とまだ画面上にある指に基づいて数学を行うメソッドを呼び出します。数学はかなり簡単なはずですが、あなたが実際にやりたいことはわかりません。

関連する問題