Android | Tangram 动态页面之路(四)vlayout 原理

本系列文章主要介绍天猫团队开源的Tangram框架的使用心得和原理,由于Tangram底层基于vlayout,所以也会简单讲解,该系列将按以下大纲进行介绍:
vlayout原理
Tangram原理
Tangram二次封装
本文将对Tangram的底层实现vlayout进行讲解。
vlayout
在Tangram和vlayout介绍这篇文章提到过,
vlayout自定义了一个VirtualLayoutManager,它继承自 LinearLayoutManager;引入了 LayoutHelper 的概念,它负责具体的布局逻辑;VirtualLayoutManager管理了一系列LayoutHelper,将具体的布局能力交给LayoutHelper来完成,每一种LayoutHelper提供一种布局方式,框架内置提供了几种常用的布局类型,包括:网格布局、线性布局、瀑布流布局、悬浮布局、吸边布局等。这样实现了混合布局的能力,并且支持扩展外部,注册新的LayoutHelper,实现特殊的布局方式。
大致意思是这样,

在VLayoutActivity中,
来到子适配器SubAdapter,
在delegateAdapter.setAdapters(adapters)时,取出适配器指定的布局方式,进行透传,
来到VirtualLayoutManager,
LayoutHelper被赋值好后,进行布局,这里暂不深究View的测量布局绘制流程,来到VirtualLayoutManager.onLayoutChildren,
具体的测量和布局的实现layoutViews,我们举两个比较典型的布局方式分析,ColumnLayoutHelper和FloatLayoutHelper。
举例ColumnLayoutHelper列布局
设置比重,第一列和第四列占比33,中间两列不指定比重,则平分剩余空间,
效果如下,

来看layoutViews方法,
3.将剩余宽度平分给没有设置百分比的child,
4.为所有child统一高度,为最小高度
5.测量完成,进行布局,最终交给RecyclerView.LayoutManager进行处理,即layoutDecorated,
举例FloatLayoutHelper浮动可拖拽布局
FloatLayoutHelper的布局代码就不看了,大概就是根据位置和偏移量计算具体位置,我们重点关注下他的触摸事件实现,
效果如下,

RecyclerView复用和Cantor函数
RecyclerView最终使用的是管理子适配器集合的DelegateAdapter,通常情况下,我们是没法保证各个子适配器间的viewType能不冲突的,所以这里只分析hasConsistItemType=false的情况,具体原因见FAQ(组件复用的问题),
这边有点晦涩,画了张图,需要细品~

这样,自然就可以利用RecyclerView自带的复用机制帮我们管理view的复用了,
关于cantor函数:
设idx1,type1;idx2,type2,
当 idx1 != idx2 或 type1 != type2,
viewType1 = cantor(idx1,type1)
viewType2 = cantor(idx2,type2) 时
满足 viewType1 != viewType2
同时支持逆运算:
viewType1 => idx1,type1
viewType2 => idx2,type2
感兴趣的话可以看vlayout中使用数学的小场景。
参考文章

版权声明: 本文为 InfoQ 作者【哈利迪】的原创文章。
原文链接:【http://xie.infoq.cn/article/5e575e7b16b9ffc6c3dfba69b】。文章转载请联系作者。











评论