Android MotionEvent:在视图之间传输

时间:2015-10-13 16:09:14

标签: android ontouchevent motionevent

我有两个自定义视图组,它们为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);模拟前景视图中的触摸,现在我希望背景视图在触摸持有拖动图像时控制触摸。

2 个答案:

答案 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);

最终成功了。