我们接着上一篇讲(Android ViewGroup事件分发分析(上))
1,有个问题button的onClick事件和onLongClick事情能不能都执行呢?
当然可以。上篇提到过button设置的onLongClick返回值boolean类型,只要这里返回false,就能够执行onLongClick后还会执行onClick,我们还是看看代码吧。

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

看到不,只有mHasOerformedLongPress=false才会执行performClick也就是说onLongClick返回的false这里的performClick才能够执行,也就是onClick才能执行。到此结束onClick与onLongClick能不能都调用的问题。
2,如何做到只执行Mylly的onClick而不执行Button的onClick方法呢?
别说不给Button设置onClickListener,这个方法不算。
还记得Mylly重写的onInterceptTouchEvent方法么?

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

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

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

到这里执行了super.dispatchTouchEvent,接下来就和MyButton的执行思路一样了,因为ViewGroup本身也是View。所以最终调用了Mylly的onClick方法。
3,如何不让父控件拦截事件呢?

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

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

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