新东西005--Android View的事件传递

来源:互联网 发布:做淘宝的经验 编辑:程序博客网 时间:2024/06/07 06:42

实现:其实我只是想实现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事件分发机制完全解析到此全部结束,结合上下两篇,相信大家对事件分发的理解已经非常深刻了。


0 0
原创粉丝点击