阻止家长仅针对某些视图获得触摸事件?

时间:2018-06-28 05:27:43

标签: java android viewgroup

我内部有一个ScrollView和线性布局。在线性布局内,我有多个视图。多个视图之一(可以说是DrawView)用于绘制内容,因此我必须重写该方法的onTouchEvent并绘制内容。目前,当我在DrawView上拖动或移动时,ScrollView还会处理导致整个视图移动的触摸。我想要的是,当我触摸DrawView时,滚动视图不应移动。我在这里做了一些答案

How to vary between child and parent view group touch events

但是我找不到可以在DrawView中添加的任何内容,这将阻止ScrollView上下移动。请注意,DrawView不会扩展ViewGroup,因此我无权访问requestDisallowInterceptTouchEvent

3 个答案:

答案 0 :(得分:1)

每当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)

答案 1 :(得分:1)

您可以从ScrollView的{​​{1}}获得DrawView

onTouchEvent

然后,您可以在ScrollView scrollView = (ScrollView) getParent(); 上调用requestDisallowInterceptTouchEvent,以防止在您触摸scrollView时滚动它。

DrawView

答案 2 :(得分:0)

所以我最终在DrawView方法的onTouchEvent中完成了此操作

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