Android:跨活动捕捉MotionEvent

时间:2011-10-06 21:34:22

标签: android android-activity ontouchevent ontouchlistener motion

我有两个活动A和B.我想在A中捕获一个触摸事件MotionEvent.ACTION_DOWN,同时仍然按住,启动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,但B的“onTouch”在活动开始时没有被调用,除非我移动手指(重新生成触摸)事件)。

简单地说,我正在做一个应用程序,当按住屏幕并在我松开手指时完成时会出现新的活动。

是否无法将MotionEvent.ACTION_DOWNed状态从一个视图转移到另一个视图?或者,新活动B是否清除了A现有的“屏幕触摸监听器”,因为它是在那里启动的?

感谢您解释如何将这些MotionEvent分派到活动和/或任何解决方案/黑客攻击我的问题。

1 个答案:

答案 0 :(得分: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必须是一个视图,以便捕获ontouchevent,因为活动并不真正知道如何处理它。