Android: จับ MotionEvent ข้ามกิจกรรม

ฉันมีสองกิจกรรม A และ B ฉันต้องการให้เหตุการณ์สัมผัสเดียว MotionEvent.ACTION_DOWN ติดอยู่ใน A ในขณะที่ยังกดค้างไว้ ให้เปิด B จากนั้นให้จับเหตุการณ์การเปิดตัว MotionEvent.ACTION_UP ใน B

ใน A มี View v ที่มี OnTouchListener พร้อมการโทรกลับต่อไปนี้:

@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 มี View v2 ที่ทับซ้อนกัน (เหนือ v ดั้งเดิม) ด้วย OnTouchListener ประเภทเดียวกัน แต่ "onTouch" ของ B ไม่ถูกเรียก เมื่อกิจกรรมเริ่มต้นขึ้นเว้นแต่ฉันจะขยับนิ้ว (สร้างกิจกรรมการสัมผัสใหม่)

พูดง่ายๆ ฉันกำลังสร้างแอปพลิเคชันที่จะทำให้กิจกรรมใหม่ปรากฏขึ้นเมื่อกดบนหน้าจอค้างไว้และสิ้นสุดเมื่อฉันปล่อยนิ้ว

เป็นไปไม่ได้หรือที่จะมีการถ่ายโอนสถานะ MotionEvent.ACTION_DOWNed จากมุมมองหนึ่งไปยังอีกมุมมองหนึ่ง หรือกิจกรรมใหม่ B จะล้าง "ผู้ฟังแบบสัมผัสบนหน้าจอ" ในปัจจุบันที่มีให้เฉพาะ A เนื่องจากเริ่มต้นที่นั่นหรือไม่

ขอขอบคุณสำหรับคำอธิบายว่า MotionEvents เหล่านี้ถูกส่งไปยังกิจกรรมและ/หรือวิธีแก้ปัญหา/แฮ็กปัญหาของฉันอย่างไร


person Eric Chen    schedule 06.10.2011    source แหล่งที่มา
comment
คุณพบวิธีแก้ปัญหานี้หรือไม่?   -  person MM.    schedule 10.02.2013
comment
คุณพบวิธีแก้ปัญหาหรือไม่?   -  person ClassA    schedule 21.09.2018


คำตอบ (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 Activity Override OnTouchEvent (ทำให้ B ใช้ OnTouchListener) เช่นนี้:

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

และจำไว้ว่า someview ต้องเป็น view เพื่อที่จะจับ ontouchevent ทำให้กิจกรรมไม่รู้จริงๆ ว่าต้องทำอย่างไร

person A.Quiroga    schedule 06.10.2011
comment
ปัญหาคือว่าส่วน case MotionEvent.ACTION_UP ไม่ได้ถูกเรียกเมื่อฉันปล่อยนิ้ว ถ้ามันไม่ยากเกินไปที่จะส่งกิจกรรมไปยังกิจกรรม B (เช่นเดียวกับที่คุณทำที่นั่น) - person Eric Chen; 07.10.2011