【问题标题】:Android MotionEvent : Transfer between viewsAndroid MotionEvent:视图之间的传输
【发布时间】:2015-10-13 16:09:13
【问题描述】:

我有两个自定义视图组,它们为 motionevent 实现 onTouchListener。

我正在使用框架布局来显示它们。 第二个视图组的大小小于第一个。 所以第一个在后台,第二个在前台。

我想将第二个/较小视图组的项目拖到背景视图组。

问题:当将项目拖到背景视图组(i.e mAwesomePager)时,我希望ACTION_UP在第二个视图组(较小的)上触发,ACTION_MOVE在第一个视图组上触发,所以基本上@987654324 @ 在后台从较小的视图组转移到较大的视图组,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); 在前景视图中模拟触摸,现在我希望背景视图在触摸按住拖动的图像时控制触摸。

【问题讨论】:

    标签: android touch-event motionevent


    【解决方案1】:

    查看onTouchEvent()方法的文档,更具体地说是它的返回参数:

    如果事件已处理,则返回
    True,否则返回false

    如果您希望将您的事件传递给您的后台视图,您需要确保当ACTION_UP 发生时,该方法返回 false,以便 Android 知道该运动事件尚未被消耗,并且应该被转发到下一个在层次结构中查看。

    这是一个基本的 sn-p 操作:

    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
        }
    }
    

    请记住,您的背景视图还需要轮流实现触摸侦听器才能实现这一点。

    【讨论】:

    • 感谢您的回复。我正在尝试通过此 ev.setAction(MotionEvent.ACTION_UP); 在前景视图中模拟触摸,现在我希望背景视图在触摸按住拖动的图像时控制触摸。 return false 终止两个视图的触摸事件。
    • 假设你一直返回 true,你创建的 motionEvent 会被调度到后台视图吗?
    【解决方案2】:

    改变这个 mAwesomePager.getChildAt(mAwesomePager.mLastDragged).dispatchTouchEvent(motionEvent);

    到这里

    return mAwesomePager.dispatchTouchEvent(motionEvent);

    最终成功了。

    【讨论】:

      猜你喜欢
      • 2012-06-25
      • 1970-01-01
      • 2012-08-31
      • 2015-12-18
      • 2013-06-18
      • 1970-01-01
      • 1970-01-01
      • 2010-10-14
      • 1970-01-01
      相关资源
      最近更新 更多