4

マルチタッチ イベントが原因で、指がまだ押されているときにタッチ インデックスが解放されるという問題が発生しています。

私の Java ラッパー コードを以下に貼り付けます。この関数は、activePointer 値を配列インデックスとして使用して、配列にアップ/ダウン状態を格納する C++ 関数に activePointer 整数を渡します。ダウン イベントは配列値を true に設定し、アップ イベントは配列値を false に設定します。

動作は次のとおりです。

  • 1 本の指が押された場合、タッチ インデックス 0 は true です。
  • 2 本の指が押されている場合、タッチ インデックス 0 と 1 はどちらも true です。
  • 次に 2 番目の指を離すと、タッチ インデックス 0 が true になり、タッチ インデックス 1 が false になります (予想どおり)。
  • 代わりに、1 番目の指が離され、2 番目の指が触れたままになっている場合、タッチ インデックス 0 と 1 の両方が false になります。タッチ インデックス 0 は false で、タッチ インデックス 1 は true のままだと思います。

これは私のJavaラッパーコードです:

@Override
public boolean onTouchEvent(MotionEvent event) {
    Integer activePointer = (event.getAction() >> MotionEvent.ACTION_POINTER_ID_SHIFT);
    Float x = event.getX(activePointer);
    Float y = event.getY(activePointer);

    switch (event.getAction() & MotionEvent.ACTION_MASK) {
    case MotionEvent.ACTION_DOWN:
    case MotionEvent.ACTION_POINTER_DOWN:
        // Log.i("touchtest", "action_down " + activePointer.toString() +
        // "(" + x + "," + y + ")");
        androidRenderer.touch(x, y, activePointer);
        break;
    case MotionEvent.ACTION_MOVE:
        // Log.i("touchtest", "action_move " + activePointer.toString() +
        // "(" + x + "," + y + ")");
        androidRenderer.move(x, y, activePointer);
        break;
    case MotionEvent.ACTION_UP:
    case MotionEvent.ACTION_POINTER_UP:
        // Log.i("touchtest", "action_up " + activePointer.toString() + "("
        // + x + "," + y + ")");
        androidRenderer.up(x, y, activePointer);
        break;
    }
    return true;
}

ドキュメントhereを読みましたが、あまり明確ではありません。

私は関数をいじりましたevent.findPointerIndexが、実際に行っていることのパターンを推測できませんでした。

これがまれな問題だとは想像できません。これについての経験のある人がアドバイスを提供できますか? ありがとうございました。

4

2 に答える 2

0

(event.getAction() >> MotionEvent.ACTION_POINTER_ID_SHIFT)ポインターインデックスのみを提供します。ポインターのインデックスは、マルチタッチ ジェスチャ全体で変化する場合があります。

実際に必要なのはポインタ ID です。MotionEvent.ACTION_POINTER_ID_SHIFTこの名前は、ポインター ID の代わりにポインター インデックスを返すため、少し紛らわしいため、廃止され、API 8 以降、MotionEvent.ACTION_POINTER_INDEX_SHIFT に名前が変更されました。ポインター ID はポインターを一意に識別します。

ポインター ID を取得するには、getPointerId(activePointer)を使用します。

ポインタ ID を渡せandroidRenderer.xxx(x, y, activePointerId);ば問題ありません。

于 2015-01-10T22:16:14.317 に答える