我有两个自定义视图组,它们为motevent实现了onTouchListener。
我正在使用framelayout来显示它们。 第二个视图组的大小小于第一个视图组。 所以第一个是背景,第二个是前景。
我想将第二个/较小视图组的项目拖动到后台视图组。
问题:将项目拖动到后台视图组(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);
模拟前景视图中的触摸,现在我希望背景视图在触摸持有拖动图像时控制触摸。
答案 0 :(得分:0)
查看onTouchEvent()
方法的文档,更具体地说是它的返回参数:
返回
True 如果事件被处理, false ,否则。
如果您希望将事件传递给背景视图,则需要确保在ACTION_UP
发生时,该方法返回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
}
}
请记住,您的背景视图还需要轮流实施触控侦听器才能实现此目的。
答案 1 :(得分:0)
更改此内容
mAwesomePager.getChildAt(mAwesomePager.mLastDragged).dispatchTouchEvent(motionEvent);
到这个
return mAwesomePager.dispatchTouchEvent(motionEvent);
最终成功了。