android 对于父布局拦截事件,子view啥时候设置requestdisallowintercepttouchev

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了android 对于父布局拦截事件,子view啥时候设置requestdisallowintercepttouchev相关的知识,希望对你有一定的参考价值。

参考技术A 事件的起源:我们都知道触摸事件是从Activity的dispatchTouchEvent方法开始的。再调用父类的super.dispatchTouchEvent(ev),事件向派发。ViewGroup与View关系:View是android控件的最简单的一个类,所有的控件都直接或间接继承View,即ViewGroup继承View。View有两个回调函数dispatchTouchEvent和onTouchEvent;ViewGroup有三个回调函数dispatchTouchEvent、onTouchEvent和onInterceptTouchEvent。dispatchTouchEvent事件说明:dispatchTouchEvent只负责处理触摸事件的派发,事件由Activity的dispatchTouchEvent开始的。再执行父类的super.dispatchTouchEvent(ev)事件向下派发。onInterceptTouchEvent事件说明:onInterceptTouchEvent是ViewGroup提供的方法,它的默认返回false表示不拦截事件,当返回true时表示拦截了事件,即自己处理消费。onTouchEvent事件说明:ViewGroup和View都有这个方法,onTouchEvent这个方法主要处理触摸事件的按下移动和弹起的操作,当返回为true时表示消费了这个事件,false则不消费,即返回上一层处理。事件的传递过程:Android中事件的传递过程都是从父布局传递到子布局,父布局可以有很多个,即ViewGroup-->ViewGroup-->View的过程,ViewGroup起到的是透传作用。

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

参考技术A 比如接着上篇 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中:

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

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

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

百度上拔个图来

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

以上是关于android 对于父布局拦截事件,子view啥时候设置requestdisallowintercepttouchev的主要内容,如果未能解决你的问题,请参考以下文章

android 拦截事件

Android开发之解决父控件拦截子控件事件问题

父控件的点击事件被Recyclerview拦截

触摸事件拦截整理

Android 子布局超出父布局 子布局点击失效解决方案

android事件分发,拦截,处理