2

私はAndroidの世界も初めてで、Javaもまったく新しいですが、数年前にdot-net:erとして数年間Javaでいくつかの学校のポイントを持っていたので、完全に遅れているわけではありません:)。 .しかし、次の2行で「&」と「>>」が実際に何をしているのか、まだよくわかりません..誰か説明してください..

int action = event.getAction() & MotionEvent.ACTION_MASK;
int pointerIndex = (event.getAction() & MotionEvent.ACTION_POINTER_INDEX_MASK) >> MotionEvent.ACTION_POINTER_INDEX_SHIFT;

最初の行が正しいことを理解していれば、event.getAction() は大量の情報を含む int を返しますが、関心があるのはどのアクションが起動したかだけなので、'& MotionEvent.ACTION_MASK' を追加して、一種の「解析」を行います。そのビット..私は正しいですか、それとも完全に間違っていますか?

2: 2行目、「>>」が何に使用されているのかわかりません..だから説明してください:)

前もって感謝します!

4

1 に答える 1

0

getAction()(Androidの古いバージョンでは)非常に基本的な上、下、ホバー(など)アクションを返すために使用されます。これによりevent.getAction() == ...、特定の種類のアクションであるかどうかを確認するなどのことができました。ただし、マルチタッチの導入により、タッチイベントはより複雑になりました。これで、アクションとともに、ポインタ情報も「アクション」に格納されます。質問する前に:はい、2つの異なる方法にすることができたかもしれませんが、アクションの情報全体を1つにまとめることができるのは簡単ではありませんか?

JavaDocsの@millimooseのリンクに示されているように&、一致するビットだけを保持します(a & b == 12ビットab場合とその場合のみa == b == 1)。また、ビットを使用してさまざまな状態を表す整数であるビットフラグとフィールドの基本を確認することもできます。

したがって、を呼び出すと、のビット(、または右端の8ビット)& MotionEvent.ACTION_MASKに一致するビットのみが保持されます。ここにアクションが格納されます(すべてのアクション整数値が255未満(右端の8ビット)であることに注意してください)。ACTION_MASK11111111

次の行は、8ビットの2番目のセット(右から8〜15ビットを含む)を取り、次にそれらを8ずつ右にシフトして、1 0000 0000(デモンストレーション用に追加されたスペース)がになるようにし1ます。(この演算子、右シフトもJavaDocリンクで説明されています。)

したがって、イベントがACTION_UPであり、ポインタインデックスが6であるとしましょう。これにより、イベントとポインタに関する情報が得られます。(6 << ACTION_POINTER_INDEX_SHIFT) | ACTION_UPこれは、、またはとして表され110 0000 0001ます。この場合、

  • の値は;event.getAction()に等しい110 0000 0001
  • action変数は次のようになります0000 0001(もちろん、先頭の0は無視できます)。と
  • 変数はpointerIndex等しい110(または610進数)。

API 8以降では、にアクセスできることを覚えておいてください。これにより、上記で使用した変数getActionMasked()を取得できます。action

于 2013-01-06T23:36:21.773 に答える