美文网首页 Android知识进阶(遥远的重头开始)
Android-View的事件分发及拦截-父控件和子控件都处理触

Android-View的事件分发及拦截-父控件和子控件都处理触

作者: MonkeyLei | 来源:发表于2019-07-18 09:04 被阅读0次

    比如接着上篇Android-View的事件分发及拦截机制简单流程先体验再研究(场景?疑问? 具体?待续...) ,小白现在要实现就是子View和父ViewGroup都响应点击事件。

    1. 单纯的都只是响应down事件

    这个就很简单了 - 直接子View的**public boolean **onTouchEvent(MotionEvent event) 里面直接返回false就行了。也就是子控件响应了一次down后,接下来就交给父ViewGroup了.(子View就啥几把也干不了了);

    2. 响应down和up事件,move啥的

    我们知道子View如果onTouch里面返回了true,那么将会处理后续的move,up事件。而不再交给上层父ViewGroup。那父ViewGroup就没办法在Touch里面处理,所以我们只能放到dispatchTouchEvent或者onInterceptTouchEvent中处理这个down,up等事件:

    比如dispatchTouchEvent中:

         @Override
        public boolean dispatchTouchEvent(MotionEvent ev) {
            Log.d("event", "CustomConstraintLayout dispatchTouchEvent"+ ev.getAction());
            switch (ev.getAction()) {
                case MotionEvent.ACTION_DOWN:
                    break;
                case MotionEvent.ACTION_MOVE:
                    break;
                case MotionEvent.ACTION_UP:
                    Toast.makeText(getContext(), "小孩,粑粑也被点击了呀!", Toast.LENGTH_SHORT).show();
                    break;
            }
            return super.dispatchTouchEvent(ev);
        }
    

    这样的情况就是父ViewGroup先执行点击事件,然后子View再执行。 如果您需要父ViewGroup晚点,可以延时执行啥的。

    如果此时,子View的dispatchTouchEvent返回true - 表示拦截,不继续了

        @Override
        public boolean dispatchTouchEvent(MotionEvent ev) {
            Log.d("event", "CustomTextView dispatchTouchEvent" + ev.getAction());
            return true;
        }
    

    那么子View的所有的事件都不会响应了。其实也就是我们的一个事件先传递,touch再处理的树形图:

    百度上拔个图来

    image

    简单记录下下而已,继续加深理解...这是上一篇的续,还是上一篇....啧啧....后面是官方文档分析来着...

    相关文章

      网友评论

        本文标题:Android-View的事件分发及拦截-父控件和子控件都处理触

        本文链接:https://www.haomeiwen.com/subject/jocklctx.html