Android: tangkap MotionEvent di seluruh aktivitas

Saya memiliki dua aktivitas A dan B. Saya ingin acara sekali sentuh MotionEvent.ACTION_DOWN terjebak di A, sambil tetap menahan, meluncurkan B, lalu membuat acara rilis MotionEvent.ACTION_UP terjebak di B.

Di A ada View v yang memiliki OnTouchListener dengan callback berikut:

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

Di B ada View v2 yang tumpang tindih (di atas v asli) dengan jenis OnTouchListener yang sama tetapi "onTouch" B tidak dipanggil saat aktivitas dimulai kecuali saya menggerakkan jari saya (meregenerasi peristiwa sentuhan).

Sederhananya, saya sedang menjalankan aplikasi yang akan menyebabkan aktivitas baru muncul saat layar ditekan dan selesai saat saya melepaskan jari.

Apakah tidak mungkin untuk melakukan transfer status MotionEvent.ACTION_DOWNed dari satu tampilan ke tampilan lainnya? Atau apakah aktivitas baru B menghapus "pendengar sentuh di layar" saat ini yang hanya tersedia untuk A karena dimulai di sana?

Terima kasih atas penjelasan apa pun tentang bagaimana MotionEvents ini dikirim ke aktivitas dan/atau solusi/peretasan apa pun untuk masalah saya.


person Eric Chen    schedule 06.10.2011    source sumber
comment
Apakah Anda menemukan solusi untuk ini?   -  person MM.    schedule 10.02.2013
comment
Apakah Anda menemukan solusinya?   -  person ClassA    schedule 21.09.2018


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

Dan di B Activity Override OnTouchEvent (buat B mengimplementasikan OnTouchListener) seperti ini:

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

Dan ingat, someview harus berupa view agar bisa menangkap ontouchevent, karena aktivitasnya tidak tahu apa yang harus dilakukan dengannya.

person A.Quiroga    schedule 06.10.2011
comment
Masalahnya adalah bagian kasus MotionEvent.ACTION_UP tidak dipanggil ketika saya melepaskan jari; jika ya, tidak akan terlalu sulit untuk mengirimkan acara ke aktivitas B (seperti yang Anda lakukan di sana). - person Eric Chen; 07.10.2011