当父视图滚动时,Android视图停止接收触摸事件。

6

我有一个自定义的Android视图,它覆盖了onTouchEvent(MotionEvent)以处理视图内内容的水平滚动。然而,当包含此视图的ScrollView垂直滚动时,自定义视图停止接收触摸事件。理想情况下,我希望自定义视图继续接收事件,以便可以处理自己的水平滚动,而包含的视图层次结构处理垂直滚动。

是否有任何方法在滚动时继续接收这些运动事件?如果没有,是否还有其他获取所需触摸事件的方法?


只是为了澄清 - 最后接收到的动作事件是一个取消操作(MotionEvent#ACTION_CANCEL)。 - Adrian
2个回答

10

如果您想继续进行水平滚动并防止垂直滚动,请在子视图中使用requestDisallowInterceptTouchEvent(true),然后在完成后将其重置。

private float downXpos = 0;
private float downYpos = 0;
private boolean touchcaptured = false;
@Override
public boolean onTouchEvent(MotionEvent event) {
    switch(event.getAction()) {
    case MotionEvent.ACTION_DOWN:
        downXpos = event.getX();
        downYpos = event.getY();
        touchcaptured = false;
        break;
    case MotionEvent.ACTION_UP:
        requestDisallowInterceptTouchEvent(false);
        break;
    case MotionEvent.ACTION_MOVE:
        float xdisplacement = Math.abs(event.getX() - downXpos);
        float ydisplacement = Math.abs(event.getY() - downYpos);
        if( !touchcaptured && xdisplacement > ydisplacement && xdisplacement > 10) {
            requestDisallowInterceptTouchEvent(true);
            touchcaptured = true;
        }
        break;
    }
    super.onTouchEvent(event);
    return true;
}

当我期望这段代码时,它是完美的解决方案并且运行良好。当滚动停止在向下或向上时,并能够在触摸时左右移动。 - Najib.Nj

0
我在回答自己的问题,以防其他人像我一样不擅长通过谷歌寻找答案。:P
解决这个问题的方法是扩展ScrollView并覆盖onInterceptTouchEvent方法,使其仅拦截Y移动显着的触摸事件(根据一个建议,大于X移动)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接