4

我有两个活动A和B。我希望在A中捕获一个触摸事件MotionEvent.ACTION_DOWN,同时仍然按住,启动B,然后在B中捕获释放事件MotionEvent.ACTION_UP。

在 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 可用的“屏幕触摸侦听器”,因为它是在那里启动的?

感谢您对这些 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 Activity Override OnTouchEvent (make B implements OnTouchListener) 中是这样的:

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

请记住, someview 必须是一个视图才能捕获 ontouchevent ,因为活动并不真正知道如何处理它。

于 2011-10-06T21:47:13.303 回答