2012-12-04 7 views
8

私はタッチイベントのマスキングに関連するいくつかの小さな質問があります。私はここや他の場所で多くのことを読んだことがありますが、まだ少し混乱しています。AndroidマルチタッチとgetActionMasked()

1)event.getAction() & MotionEvent.ACTION_MASKと同じevent.getActionMasked()(彼らはサムスンS2とHTC欲望上にあるように見える)

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; 
} 

答えて

16

一部背景 -

整数getActionから返されたアクションコード(例えばACTION_DOWN)及びポインタインデックス(例えば指)の両方をコードパック整数です。

ワンタッチでは、指が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の不正な論理と演算子で、2バイトとなり、マスク自体は2バイト(0xff)です。

+0

優秀な説明! – George

関連する問題