【问题标题】:Prevent parent from getting touch events only for certain views?防止父级仅针对某些视图获取触摸事件?
【发布时间】:2018-06-28 05:27:42
【问题描述】:

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

How to vary between child and parent view group touch events

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

【问题讨论】:

    标签: java android viewgroup


    【解决方案1】:

    您可以从您的DrawViewonTouchEvent 获取ScrollView

    ScrollView scrollView = (ScrollView) getParent();
    

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

    scrollView.requestDisallowInterceptTouchEvent(true);
    

    【讨论】:

    • 谢谢,我做了类似的事情。
    【解决方案2】:

    您可以在 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)

    【讨论】:

    • 谢谢,这是一个有效的解决方案,但@Hong Duan 建议的解决方案更简单。
    【解决方案3】:

    所以我最终在DrawViewonTouchEvent 方法中这样做了

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多