阻止 parent 仅获取特定视图的触摸事件?

Prevent parent from getting touch events only for certain views?

我里面有一个 ScrollView 和线性布局。在线性布局内,我有多个视图。多个视图之一(可以说是 DrawView)用于绘制东西,所以我必须覆盖该方法的 onTouchEvent 并绘制东西。当前,当我在 DrawView 上拖动或移动时,ScrollView 也会处理导致整个视图移动的触摸。我想要的是当我触摸 DrawView 时,滚动视图不应移动。我在这里查看了其中一些答案

但我没有找到任何可以添加到 DrawView 中的东西,这将阻止 ScrollView 上下移动。请注意 DrawView 不会扩展 ViewGroup 所以我无法访问 requestDisallowInterceptTouchEvent

您可以在 DrawView 收到触摸事件时阻止 ScrollView 滚动。为此,您需要创建一个自定义 ScrollView 调用,如下所示 [Original Code Snippet]

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)

您可以从 DrawViewonTouchEvent:

中获取 ScrollView
ScrollView scrollView = (ScrollView) getParent();

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

scrollView.requestDisallowInterceptTouchEvent(true);

所以我最终在 DrawView 中使用 onTouchEvent 方法

getParent().requestDisallowInterceptTouchEvent(true); 成功了!