9

タッチ イベントのマスキングに関していくつか質問があります。ここや他の場所で多くのことを読みましたが、まだ部品について少し混乱しています.

1) とevent.getActionMasked()同じevent.getAction() & MotionEvent.ACTION_MASK(Samsung S2 および HTC Desire にあるようです)

2) 上記の 2 つのコマンドはすべての情報を提供し、それ以上の情報を提供しますevent.getAction()か、それとも異なりますか。

3)私は、タッチされている場所とどのpointerIdを使用しているか、またはポインターが使用されていないかどうかを簡単に示すコードを作成しました(現時点では2回のタッチに対してのみ作成されています)。上記のデバイスでは正しく動作しているように見えますが、完全に正しく行わないと、一部のデバイスが非常に異なる動作をする可能性があることを私は知っています。したがって、以下が正しく、すべてのデバイスで動作するかどうか疑問に思っています。

boolean pointer0down=false, pointer1down=false;
String st="", str0 ="", str1 ="";

public boolean onTouchEvent( MotionEvent event )
{

  if (event.getActionMasked()==MotionEvent.ACTION_UP
        ||event.getActionMasked()==MotionEvent.ACTION_POINTER_UP
        ||event.getActionMasked()==MotionEvent.ACTION_CANCEL)
   {
     if (event.getPointerId((event.getActionIndex()& MotionEvent.ACTION_MASK))==0)
        pointer0down=false;
     if (event.getPointerId((event.getActionIndex()& MotionEvent.ACTION_MASK))==1)
        pointer1down=false;
   }

  if (event.getActionMasked()==MotionEvent.ACTION_DOWN
    ||event.getActionMasked()==MotionEvent.ACTION_POINTER_DOWN)
  {
    if (event.getPointerId((event.getActionIndex()& MotionEvent.ACTION_MASK))==0)
       pointer0down=true;
    if (event.getPointerId((event.getActionIndex()& MotionEvent.ACTION_MASK))==1)
       pointer1down=true;
   }

 if (pointer0down)
    str0="\tx: " + event.getX(0) + "\ty: "+event.getY(0);
 else
    str0="\tNot down";

 if (pointer1down )
    str1="\tx: " + event.getX(1) + "\ty: "+event.getY(1);
 else
    str1="\tNot down";

 st="pointer0:"+str0+"\npointer1:"+str1;

    return true;
} 
4

1 に答える 1

17

いくつかの背景 -

getAction から返される整数は、アクション コード (例: ACTION_DOWN) とポインター インデックス (例: which finger) の両方をエンコードするパックされた整数です。

シングル タッチの場合、関係する指は 1 本だけなので、ポインター インデックスを格納する必要はなく、値はアクション コードだけです。したがって、次のようなことをしても安全ですgetAction() == ACTION_DOWN

マルチタッチの場合、パッケージ化された整数に余分なポインター インデックスがあるため、この比較は正しくありません。実行することでアクションコードを抽出し、実行することgetAction() & ACTION_MASKでポインターインデックスを抽出できますgetAction() & ACTION_POINTER_INDEX_MASK

今あなたの質問に -

1: はい。getActionMaskedは、アクション コード ビットを抽出するヘルパー メソッドと考えてください。ポインター インデックスを抽出するには、同等のgetActionIndexヘルパー メソッドがあります。これらの方法はどちらもシングルタッチまたはマルチタッチで機能するため、「最も安全」です。

2: 上で説明したように、getAction はマルチタッチのポインター インデックスもエンコードします。

3: コードにバグがあります。event.getPointerId((event.getActionIndex() & MotionEvent.ACTION_MASK))は技術的に正しくありません。代わりに、あなたがやるべきですevent.getPointerId(event.getActionIndex())。getActionIndexの論理 AND 演算子が正しくないため、非常に幸運です。これは 2 バイトであることが判明し、マスク自体は 2 バイト (0xff) です :)

于 2013-03-13T03:11:47.770 に答える