实现:其实我只是想实现listview的headview放一个scrollView,然后它可以单独滑动,也可以被listview往上推
需知:
1.View跟ViewGroup的区别在于,ViewGroup可以包含多个view,而且可以含有一些布局属性
2.OnClick的调用是在onTouch方法中
(http://blog.csdn.net/guolin_blog/article/details/9097463这个链接里面有完整的onTouch源码解析,也有分析,可以参考一下)
方法详述(都在onTouch方法里面系统调用):
dispatchTouchEvent:分发点击事件,比如你触摸了该控件,系统就会去看dispathTouchEvent,根据这个返回值来判断是否要向下分发该事件(你可以重写该方法来决定是否向下传递触摸事件,比如实现listview的该方法,返回true,那么下面的就能获取焦点)
onInterceptTouchEvent:是否阻止事件传递,如果返回True则由自己处理,不再向下传递
OK,知道完了这两个前提,我们就开始正文,介绍我们的模拟点击
首先如果有个button,你点击了,那么它首先就会去调用触摸onTouch方法,而不是onClick,因为很明显的在需知里面说了,onClick是在onTouch里面实现的,然后系统会调用控件的dispatchTouchEvent方法(),根据返回值来判断是否要向下传递该触摸事件,在调用这个方法的时候,我们可以查看源码,我们会发现,它在dispatchTouchEvent方法内部调用了onInterceptTouchEvent方法.
系统默认的规则是:
1.Android事件分发是先传递到ViewGroup,再由ViewGroup传递到View的。
2. 在ViewGroup中可以通过onInterceptTouchEvent方法对事件传递进行拦截,onInterceptTouchEvent方法返回true代表不允许事件继续向子View传递,返回false代表不对事件进行拦截,默认返回false。
3. 子View中如果将传递的事件消费掉,ViewGroup中将无法接收到任何事件。
好了,Android事件分发机制完全解析到此全部结束,结合上下两篇,相信大家对事件分发的理解已经非常深刻了。