我有两个活动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分派到活动和/或任何解决方案/黑客攻击我的问题。
答案 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,因为活动并不真正知道如何处理它。