Android ViewGroup的事件分发分析(下)

Android ViewGroup的事件分发分析(下)

我们接着上一篇讲(Android ViewGroup事件分发分析(上)

1,有个问题button的onClick事件和onLongClick事情能不能都执行呢?

当然可以。上篇提到过button设置的onLongClick返回值boolean类型,只要这里返回false,就能够执行onLongClick后还会执行onClick,我们还是看看代码吧。


image.png

image.png

就是说当onLongClick返回了true这个mHasOerformedLongPress就为true,再回到onToucnEvent的ACTION_UP分支。


image.png

image.png


看到不,只有mHasOerformedLongPress=false才会执行performClick也就是说onLongClick返回的false这里的performClick才能够执行,也就是onClick才能执行。到此结束onClick与onLongClick能不能都调用的问题。

2,如何做到只执行Mylly的onClick而不执行Button的onClick方法呢?

别说不给Button设置onClickListener,这个方法不算。
还记得Mylly重写的onInterceptTouchEvent方法么?


image.png

image.png

在这里把result设置为true就可以了。为什么呢?我们接着看源码。


image.png

image.png


这里的intercepted就是true了,再往下看看。
image.png

image.png


这里的mFirstTouchTarget是null,所以就进入了dispatchTransformedTouchEvent,child为null。
image.png

image.png

到这里执行了super.dispatchTouchEvent,接下来就和MyButton的执行思路一样了,因为ViewGroup本身也是View。所以最终调用了Mylly的onClick方法。

3,如何不让父控件拦截事件呢?

image.png

image.png

如果在ACTION_DOWN这里返回了true,那就不好意思了,子view无论如何都是获取不到事件了,这个事件只能是ViewGroup自己消费了。


image.png

image.png

如果是在ACTION_UP里设置result为true,只要在Button里调用


image.png

image.png


这样子View还是能处理事件,父控件拦截不了。但是如果子控件没有设置这句话,就会出现这次点击事件没有方法接收。

猜你喜欢

转载自blog.csdn.net/xadlovezy/article/details/81224895