从9月末找到工作后,就感觉一直在懈怠,中途三分钟热度温习了下Thinking in Java,而且也买了一些Android的进阶书籍在箱子里放着,但是一直没有看,感觉非常惭愧,
所以最近决定不能颓废了,拿起《Andorid群英传》开始阅读,真心是本好书。
开始我对Android事件分发,拦截的机制的学习是基于一些csdn的博客的了解,不过总是感觉梳理不清楚这个流程,这次阅读《Android群英传》让我有了很清晰的认识,所以记录下这部分的理解。
Android的事件分发,传递机制首先会有:
1.ViewGroup>到View这个过程,这个过程称之为Android的事件分发
2.View>ViewGroup这个过程,这个过程称之为Android的事件处理返回
其中ViewGroup的部分可以有多层嵌套,处理方式如上1.2依次进行。
ViewGroup作为一个上级有三个方法需要重写:
dispatchTouchEvent();
onInterceptTouchEvent();
onTouchEvent();
View作为下线只有两个方法需要被重写:
dispatchTouchEvent();
onTouchEvent();
从两者的区别就可以很好的看出,作为事件拦截的核心方法就是onInterceptTouchEvent();
为了更好的说明,我依照返回值将整个流程演示一遍:
a.用户触摸屏幕
b.ViewGroup接收到信号,使用 dispatchTouchEvent(),然后调用onInterceptTouchEvent();;(返回值是true(c),返回值是false(d))
c.ViewGroup不再向下传递事件,调用自身的onTouchEvent()完成逻辑;
d,ViewGroup向下传递事件给View,调用View的onTouchEvent();(返回值是true(e),返回值是false(f))
e.View不向上级ViewGroup返回事件的处理,整个事件到此完结
f.View向上级ViewGroup返回事件的处理,上级ViewGroup 调用onTouchEvent(),整个事件到此完结
到此整个事件分发,拦截的流程都走了一遍,对于嵌套的ViewGroup可以如此类推。
最后我想说的是对于这个返回值的理解,我个人是没有阅读这一部分的源码的(惭愧),所以对这个的理解我只能根据《Android群英传》里的加上自己的理解:
若是返回true,那么可以认为这个事件已经完成了,不需要向下传递或者是向上返回;
若是返回false,那么可以认为这个事件仍旧没有完成,需要继续向下传递或者是向上返回。
以后自己理解这其中的缘由之后,看过源码之后,会过来进行补充。