4

A と B の 2 つのアクティビティがあります。ワンタッチ イベント MotionEvent.ACTION_DOWN を A でキャッチし、押したまま B を起動し、リリース イベント MotionEvent.ACTION_UP を B でキャッチしたいと考えています。

A には、次のコールバックを持つ OnTouchListener を持つ View v があります。

@Override
public boolean onTouch(View v, MotionEvent event) {
    switch (event.getAction() & MotionEvent.ACTION_MASK) {
    case MotionEvent.ACTION_DOWN:
        startActivity(new Intent(A.this, B.class));
        break;
    case MotionEvent.ACTION_UP:
        // not called
        break;
    }
    // false doesn't work either
    return true;
}

B には、同じ種類の OnTouchListener を持つ (元の v の上に) View v2 が重複していますが、指を動かさない限り (タッチ イベントを再生成する)、アクティビティが開始されたときにB の「onTouch」が呼び出されません。

簡単に言えば、画面を長押しすると新しいアクティビティが表示され、指を離すと終了するアプリケーションを実行しています。

MotionEvent.ACTION_DOWNed 状態をあるビューから別のビューに転送することはできませんか? それとも、新しいアクティビティ B は、そこで開始されたため、A だけが利用できる現在の「画面上のタッチ リスナー」をすべてクリアしますか?

これらの MotionEvents がどのようにアクティビティにディスパッチされるか、および/または私の問題に対する解決策/ハックについて説明していただきありがとうございます。

4

1 に答える 1

1
   @Override
   public boolean onTouch(View v, MotionEvent event) {
    switch (event.getAction() & MotionEvent.ACTION_MASK) {
    case MotionEvent.ACTION_DOWN:
        startActivity(new Intent(A.this, B.class));
        break;
    case MotionEvent.ACTION_UP:

          // Obtain MotionEvent object
          long downTime = SystemClock.uptimeMillis();
          long eventTime = SystemClock.uptimeMillis() + 100;
          float x = 0.0f;
          float y = 0.0f;
          // List of meta states found here:               developer.android.com/reference/android/view/KeyEvent.html#getMetaState()
          int metaState = 0;
          MotionEvent motionEvent = MotionEvent.obtain(
             downTime, 
             eventTime, 
             MotionEvent.ACTION_UP, 
             x, 
             y, 
             metaState
            );

            // Dispatch touch event to activity (make B static or get the activity var some other way)

            B.OnTouchEvent(motionEvent);
       break;
    }
    // false doesn't work either
    return true;
}

そして、Bアクティビティでは、次のようにOnTouchEventをオーバーライドします(BにOnTouchListenerを実装させます)。

@Override
public bool OnTouchEvent( MotionEvent e )
{
    return someview.OnTouchEvent( e );
}

そして覚えておいてください、someviewはontoucheventをキャッチするためのビューでなければなりません、なぜならアクティビティはそれをどうするかを本当に知らないからです。

于 2011-10-06T21:47:13.303 に答える