CoordinatorLayout源码分析
Coordinatorlayout作为协调者布局,主要协调不同的子View测量,布局,向下分发事件和向behavior传递事件,类似于代理模式的代理者。
测量过程: onMeasure()
遍历子View,with = maxUsed , height = maxUsed;
final int width =View.resolveSizeAndState(widthUsed, widthMeasureSpec,childState &View.MEASURED_STATE_MASK);
final int height =View.resolveSizeAndState(heightUsed, heightMeasureSpec,<
布局过程:onLayout()
也是先判断lp.getBehavior()的返回值,如果behavior没有layout设置,则默认从左向右布局。
final Rect out =acquireTempRect();
GravityCompat.apply(resolveGravity(lp.gravity), child.getMeasuredWidth(),
child.getMeasuredHeight(),parent,out, layoutDirection);
child.layout(out.left,out.top,out.right,out.bottom);
事件分发:触摸在AppBarLayout上:
文章图片
AppBarLayout事件分发 1 :在Coordinatorlayout的onTouchevent中,处理。优先判断behavior是否处理。默认AppBarLayout.Behavior如果不拦截,向下传递。
2 : AppBarLayout没有重写OnTouchevent和onInterceptTouchEvent方法,所以默认不处理,继续向上分发给CL
3 :传给CL的OntouchEvent方法,询问behavior是否处理。HeaderScrollingViewBehavior中的OnTouchevent()返回true,表示处理后续Move事件。 对于AppBarLayout会调用scroll(parent, child, dy, getMaxDragOffset(child), 0),滑动。
4 : ViewTreeObserver.OnPreDrawListener 监听Appbarlayout滚动,然后因为RecyclerView设置了AppBarlayout.ScrollingViewBehavior,就会收到onDependentViewChanged()的调用, offsetChildAsNeeded(child,dependency)调用,recyclerview就跟着滑动了。
事件分发:触摸在RecyclerView上
文章图片
RecyclerView事件分发
1 :在Coordinatorlayout的onTouchevent中处理。优先判断behavior是否处理。默认AppBarLayout.ScrollgingViewBehavior的onInterceptTouchEvent()返回false, 向下传递。
2 : recyclerView分发事件,onInterceptTouchEvent()方法返回false, 继续分发,最终传递给onTouchEvent(),该方法返回true,
后续的Move和Up事件将交给RecyclerView处理。
3 : OnTouchEvent()处理滑动,会通知CL,CL会把再分发给各个子Behavior。比如Appbarlayout.Behavior(),AppBarlayout就会跟着滑动。
4 : RecyclerView的AppBarLayout.ScrollingViewBehavior 可以监听滚动距离等,也会触发onDependentViewChanged()。
总结:Appbarlayout最终处理事件再behavior的OnTouchEvent中,而RecyclerView最终处理在RecyclerView的OnTouchEvent中。
【CoordinatorLayout源码分析】事件都会向上传递给CoordinatorLayout中,然后分发给各个behavior。
推荐阅读
- 如何寻找情感问答App的分析切入点
- D13|D13 张贇 Banner分析
- 自媒体形势分析
- 2020-12(完成事项)
- Android事件传递源码分析
- Python数据分析(一)(Matplotlib使用)
- Quartz|Quartz 源码解析(四) —— QuartzScheduler和Listener事件监听
- 泽宇读书会——如何阅读一本书笔记
- Java内存泄漏分析系列之二(jstack生成的Thread|Java内存泄漏分析系列之二:jstack生成的Thread Dump日志结构解析)
- [源码解析]|[源码解析] NVIDIA HugeCTR,GPU版本参数服务器---(3)