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】。文章转载请联系作者。
评论