Android MotionEvent : 在视图之间传输
Android MotionEvent : Transfer between views
我有两个自定义视图组,它们为 motionevent 实现了 onTouchListener。
我正在使用框架布局来展示它们。
第二个视图组比第一个小。
所以第一个在后台,第二个在前台。
我想将 second/smaller 视图组的项目拖到背景视图组。
问题:将项目拖动到背景视图组 (i.e mAwesomePager)
时,我希望 ACTION_UP
在第二个视图组(较小的)上触发,ACTION_MOVE
在第二个视图组上触发第一个视图组,所以基本上 touchEvent
在后台从较小的视图组转移到较大的视图组,并且 MotionEvent
继续,用户不必从屏幕上拿起手指然后再放回去。
下面是一些有用的代码:
@Override
public boolean onTouchEvent(MotionEvent ev) {
if (mRectOut == true) {
ev.setAction(MotionEvent.ACTION_UP);
mFrame.bringChildToFront(mAwesomePager);
//mAwesomePager.setClickable(true);
// Obtain MotionEvent object
long downTime = SystemClock.uptimeMillis();
long eventTime = SystemClock.uptimeMillis() + 100;
// 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_DOWN,
ev.getX(),
ev.getY(),
metaState
);
mAwesomePager.getChildAt(mAwesomePager.mLastDragged).dispatchTouchEvent(motionEvent);
}
//some more code here
}
我正在尝试通过此 ev.setAction(MotionEvent.ACTION_UP);
在前景视图中模拟触摸关闭,现在我希望背景视图在触摸按住拖动的图像时控制触摸。
查看 onTouchEvent()
方法的文档,更具体地说是它的 return 参数:
Returns
True if the event was handled, false otherwise.
如果您希望将事件传递给背景视图,您需要确保当 ACTION_UP
发生时,方法 returns false 所以 Android 知道运动事件尚未被消耗,应该被转发到层次结构中的下一个视图。
这里有一个基本的操作片段:
public boolean onTouchEvent(MotionEvent ev) {
if (event.getAction() == MotionEvent.ACTION_UP) {
// handle ACTION_UP with the foreground view
return false; // event will be sent to the background view
} else {
// handle ACTION_MOVE with the foreground view
return true; // event will stop here
}
}
请记住,您的背景视图还需要在轮到它时实现触摸侦听器才能实现这一点。
改变这个
mAwesomePager.getChildAt(mAwesomePager.mLastDragged).dispatchTouchEvent(motionEvent);
到这个
return mAwesomePager.dispatchTouchEvent(motionEvent);
终于成功了。
我有两个自定义视图组,它们为 motionevent 实现了 onTouchListener。
我正在使用框架布局来展示它们。 第二个视图组比第一个小。 所以第一个在后台,第二个在前台。
我想将 second/smaller 视图组的项目拖到背景视图组。
问题:将项目拖动到背景视图组 (i.e mAwesomePager)
时,我希望 ACTION_UP
在第二个视图组(较小的)上触发,ACTION_MOVE
在第二个视图组上触发第一个视图组,所以基本上 touchEvent
在后台从较小的视图组转移到较大的视图组,并且 MotionEvent
继续,用户不必从屏幕上拿起手指然后再放回去。
下面是一些有用的代码:
@Override
public boolean onTouchEvent(MotionEvent ev) {
if (mRectOut == true) {
ev.setAction(MotionEvent.ACTION_UP);
mFrame.bringChildToFront(mAwesomePager);
//mAwesomePager.setClickable(true);
// Obtain MotionEvent object
long downTime = SystemClock.uptimeMillis();
long eventTime = SystemClock.uptimeMillis() + 100;
// 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_DOWN,
ev.getX(),
ev.getY(),
metaState
);
mAwesomePager.getChildAt(mAwesomePager.mLastDragged).dispatchTouchEvent(motionEvent);
}
//some more code here
}
我正在尝试通过此 ev.setAction(MotionEvent.ACTION_UP);
在前景视图中模拟触摸关闭,现在我希望背景视图在触摸按住拖动的图像时控制触摸。
查看 onTouchEvent()
方法的文档,更具体地说是它的 return 参数:
Returns
True if the event was handled, false otherwise.
如果您希望将事件传递给背景视图,您需要确保当 ACTION_UP
发生时,方法 returns false 所以 Android 知道运动事件尚未被消耗,应该被转发到层次结构中的下一个视图。
这里有一个基本的操作片段:
public boolean onTouchEvent(MotionEvent ev) {
if (event.getAction() == MotionEvent.ACTION_UP) {
// handle ACTION_UP with the foreground view
return false; // event will be sent to the background view
} else {
// handle ACTION_MOVE with the foreground view
return true; // event will stop here
}
}
请记住,您的背景视图还需要在轮到它时实现触摸侦听器才能实现这一点。
改变这个
mAwesomePager.getChildAt(mAwesomePager.mLastDragged).dispatchTouchEvent(motionEvent);
到这个
return mAwesomePager.dispatchTouchEvent(motionEvent);
终于成功了。