防止父视图接收某些视图的触摸事件?

4
我有一个 ScrollView,里面包含一个线性布局。在线性布局中,我有多个视图。其中的一个视图(假设是 DrawView)用于绘制东西,因此我必须重写该方法的 onTouchEvent 并进行绘制。目前,当我在 DrawView 上拖动或移动时,ScrollView 也会处理触摸事件,导致整个视图移动。我想要的是,当我触摸 DrawView 时,滚动视图不应该移动。我查看了这里的一些答案 How to vary between child and parent view group touch events,但我没有找到任何可以添加到 DrawView 中以防止 ScrollView 上下移动的内容。请注意,DrawView 没有扩展 ViewGroup,因此我无法访问 requestDisallowInterceptTouchEvent
3个回答

4
你可以从 DrawViewonTouchEvent 中获取 ScrollView
ScrollView scrollView = (ScrollView) getParent();

然后,您可以在scrollView上调用requestDisallowInterceptTouchEvent,以防止在触摸DrawView时它滚动。

scrollView.requestDisallowInterceptTouchEvent(true);

谢谢,我做了类似的事情。 - Dishonered

2

每当您的DrawView触发事件时,您可以防止ScrollView滚动。要做到这一点,您需要创建一个自定义的ScrollView,如下所示:

[原始代码片段]
public class MyScrollView extends ScrollView {
    private boolean enableScrolling = true;
    public MyScrollView(Context context) {
        super(context);
    }

    public MyScrollView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public MyScrollView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    @TargetApi(Build.VERSION_CODES.LOLLIPOP)
    public MyScrollView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
        super(context, attrs, defStyleAttr, defStyleRes);
    }

    @Override
    public boolean onInterceptTouchEvent(MotionEvent ev) {

        if (scrollingEnabled()) {
            return super.onInterceptTouchEvent(ev);
        } else {
            return false;
        }
    }

    @Override
    public boolean onTouchEvent(MotionEvent ev) {
        if (scrollingEnabled()) {
            return super.onTouchEvent(ev);
        } else {
            return false;
        }
    }

    private boolean scrollingEnabled(){
        return enableScrolling;
    }

    public void setScrolling(boolean enableScrolling) {
        this.enableScrolling = enableScrolling;
    }
}

根据您的需求,您可以调用 scrollView.setScrolling(true/false)


谢谢,这是一个有效的解决方案,但更简单的解决方案是由@Hong Duan建议的。 - Dishonered

1

所以我最终在DrawViewonTouchEvent方法中进行了以下操作:

getParent().requestDisallowInterceptTouchEvent(true);,它起作用了!


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