前言
● V- Layout 是阿里出品的基础 UI 框架,用于快速实现页面的复杂布局,在手机天猫 Android版 内广泛使用

● 让人激动的是,在上个月V- Layout终于在Github上开源!
Github - alibaba - vlayout

● 在五一假期我对V- Layout进行了详细分析,我将献上一份 V- Layout的使用攻略 & 源码分析,希望你们会喜欢。
目录

  1. 为什么要使用 V - Layout在讲解 V - Layout 前,我们先来搞懂一个问题:为什么要使用 V - Layout
    1.1 背景
    ● Android中 UI 性能消耗主要来自于两个方面:
    a. 布局层次嵌套导致多重 measure/layout
    b. View控件的创建和销毁
    ● 为了解决上述问题,现有的解决方式是:
    a. 少用嵌套布局
    b. 使用 ListView/GirdView/RecyclerView等基础空间来处理View的回收与复用。
    但是,很多时候我们需要在一个长列表下做多种类型的布局来分配各种元素,,特别是电商平台首页等页面,布局元素结构更加复杂多样。如下图:

此时的解决方案有所变化:不采用子View的复用,只采用一个主要的复用容器(如ListView 或 RecyclerView+LinearLayoutManager),然后在其中使用嵌套方式直接用各个组件进行拼接,减少了复用的能力
1.2 问题
这种做法还是会损失Android应用的性能。
1.3 解决方案
● 通过自定义 LayoutManager 管理所有的布局类型
● 即阿里出品的基础 UI 框架项目 VirtualLayout就是采用该方式来解决上述问题
2. 简介
● 定义:VirtualLayout是阿里出品的基础 UI 框架项目
● 作用:快速实现复杂的布局格式的混排
○ 基于 RecyclerView & LayoutManager扩展
○ 目前已在Github开源:Github - alibaba - vlayout

  1. 应用场景
    ● 复杂的布局格式混排,如:浮动布局、栏格布局、通栏布局、一拖N布局、瀑布流布局,还可以组合使用这些布局
    ● 具体场景是:如电商平台首页、活动页等等
    V - Layout 目前已在手机天猫 & 淘宝 Android 版内广泛使用

  2. 原理解析
    V - Layout的本质原理是:通过自定义一个VirtualLayoutManager(继承自 LayoutManager),用于管理一系列LayoutHelper,将具体的布局能力交给LayoutHelper来完成,从而 快速实现组合布局 的需求。

    1. 每个 LayoutHelper负责 页面某一个范围内的布局
    2. V - Layout默认实现了10种默认布局:(对应同名的LayoutHelper)

4.1 源码类说明
V - Layout的源码类图如下:

1.RecyclerView
● 定义:页面布局的主体
● 特别注意:在V - layout框架里绑定 VirtualLayoutAdapter(继承Adapter) & VirtualLayoutManager(继承LayoutManager)
2. VirtualLayoutAdapter
● 定义:数据适配器。
继承自系统的Adaper
● 作用:创建组件 & 绑定数据到组件
● 额外:定义了两个接口:
a. getLayoutHelper():用于返回某个位置组件对应的一个LayoutHelper
b. setLayoutHelpers():调用此方法设置整个页面所需要的一系列LayoutHelper
这两方法的具体实现委托给 VirtualLayoutManager完成
3. VirtualLayoutManager
● 定义:布局管理器
继承自系统的 LinearLayoutManager
● 作用:
a. 在 RecyclerView加载组件或者滑动时调用VirtualLayoutManager 的layoutChunk(),返回当前还有哪些空白区域可摆放组件
b. 管理 LayoutHelper列表
● 额外:实现了VirtualLayoutAdapter的 getLayoutHelper() & setLayoutHelpers()
4. LayoutHelperFinder
● 定义:LayoutHelper 寻找器
● 作用:根据页面状态 寻找对应的 LayoutHelper 并返回给 VirtualLayoutManager
a. VirtualLayoutManager会持有一个LayoutHelperFinder
b. 当layoutChunck()被调用时会传入一个位置参数,告诉VirtualLayoutManager当前要布局第几个组件
c. VirtualLayoutManager通知持有的 LayoutHelperFinder找到传入参数位置对应的 LayoutHelper(每个 LayoutHelper 都会绑定它负责的布局区域的起始位置和结束位置)

  1. LayoutHelper
    ● 定义:布局协助器
    ● 作用:负责具体的布局逻辑
    ● 其中定义了一系列接口用于和VirtualLayoutManager通信:
    接口作用isOutOfRange()告诉VirtualLayoutManager它所传递过来位置是否在当前LayoutHelper的布局区域内;setRange()设置当前LayoutHelper负责的布局区域doLayout()真正的布局逻辑接口beforeLayout()在布局前做一些前置工作afterLayout()在布局完成后做一些后置工作
  2. MarginLayoutHelper
    ● 定义:继承自 LayoutHelper
    ● 作用:扩展LayoutHelper,提供了布局常用的内边距padding、外边距margin的计算功能
  3. BaseLayoutHelper
    ● 定义:MarginLayoutHelper的第一层具体实现
    ● 作用:填充 当前LayoutHelper在屏幕范围内的具体区域 背景色、背景图等逻辑
  4. 子LayoutHelper
    ● 定义:MarginLayoutHelper的第二层具体实现
    ● 作用:负责具体的布局逻辑
    a. 每种子LayoutHelper负责一种布局逻辑
    b. 重点实现了beforeLayout()、doLayout()、afterLayout()
    c. 特别是doLayout():会获取一组件,并对组件进行尺寸计算、界面布局。
    d. V - Layout默认实现了10种默认布局:(对应同名的LayoutHelper)

下面会进行详细介绍。
● 特别注意:
a. 每一种LayoutHelper负责布局一批组件范围内的组件,不同组件范围内的组件之间,如果类型相同,可以在滑动过程中回收复用。因此回收粒度比较细,且可以跨布局类型复用。
b. 支持扩展外部:即注册新的LayoutHelper,实现特殊的布局方式。下面会详细说明
介绍完类之后,我将详细分析 V - Layout的工作流程。
4.2 工作流程
● V - Layout的工作流程分为 初始化 & 布局流程。如下图:

● 下面我将对初始化 & 布局流程作详细分析。
4.2.1 初始化

● 在使用 V - layout 快速实现复杂布局前,需要先做一系列的初始化工作。
初始化流程与使用普通的 RecyclerView + LayoutManager 初始化流程基本一致:Vlayout的使用者

此处的初始化 实际上 就是 使用者在使用 V - layout 时需要做的初始化工作,在下面的实例讲解我会进行更加详细的说明。
4.2.2 具体布局流程
● 当完成初始化工作后,每当用户刚打开页面第一次渲染布局 或 用户滑动页面时,都会进行一次布局流程
● 布局流程的本质是:自定义 VirtualLayoutManager持续获取页面状态,并通过LayoutHelperFinder找到对应的LayoutHelper从而实现对应的布局逻辑,从而快速实现组合布局 的需求
● 具体流程如下

总结
下面用一张图总结 V - Layout 的原理 & 工作流程

在讲完原理后,接下来我将如何使用 V - Layout。
5. 使用步骤
● V - Layout的使用其实就是上面说的初始化工作
● 使用步骤如下:

下面我将对每个步骤进行详细说明。
步骤1:创建RecyclerView & VirtualLayoutManager 对象并进行绑定
recyclerView = (RecyclerView) findViewById(R.id.my_recycler_view); // 创建RecyclerView对象 VirtualLayoutManager layoutManager = new VirtualLayoutManager(this); // 创建VirtualLayoutManager对象// 同时内部会创建一个LayoutHelperFinder对象,用来后续的LayoutHelper查找 recyclerView.setLayoutManager(layoutManager); // 将VirtualLayoutManager绑定到recyclerView
● 1
● 2
● 3
● 4
● 5
● 6
● 7
● 8
● 9
● 10
● 1
● 2
● 3
● 4
● 5
● 6
● 7
● 8
● 9
● 10
步骤2:设置回收复用池大小
如果一屏内相同类型的 View 个数比较多,需要设置一个合适的大小,防止来回滚动时重新创建 View)
// 设置组件复用回收池 RecyclerView.RecycledViewPool viewPool = new RecyclerView.RecycledViewPool(); recyclerView.setRecycledViewPool(viewPool); viewPool.setMaxRecycledViews(0, 10);
● 1
● 2
● 3
● 4
● 1
● 2
● 3
● 4
步骤3:设置Adapter
设置 V - Layout的Adapter有两种方式:
● 方式1:继承 自 DelegateAdapter
● 方式2:继承 自 VirtualLayoutAdapter
下面会进行详细说明:
方式1:继承 自 DelegateAdapter
● 定义:DelegateAdapter是V - Layout专门为管理 LayoutHelper定制的 Adapter
继承自VirtualLayoutAdapter
● 作用:通过管理不同布局的Adapter,继而管理不同的 LayoutHelper,从而实现使用不同组合布局
a. 特别注意:虽不可直接绑定LayoutHelper,但是它内部有一个继承自RecyclerView.Adapter的内部类Adapter可以绑定LayoutHelper;
b. 即通过一个List把绑定好的Adapter打包起来,再放去DelegateAdapter,这样就可以实现组合使用不同的布局
● 具体做法:
a. 写法与复写系统自带的Adapter非常类似:只比系统自带的RecyclerAdapter需要多重载onCreateLayoutHelper方法,其余类似
b. 关于Android系统自带的RecyclerAdapter的使用具体请看我写的文章Android开发:ListView、AdapterView、RecyclerView全面解析
publicclassMyAdapterextendsDelegateAdapter.Adapter

Android开源库V - Layout:淘宝、天猫都在用的UI框架,赶紧用起来吧相关推荐

  1. Android开源库V - Layout:淘宝、天猫都在用的UI框架,赶紧用起来吧!

    前言 V- Layout 是阿里出品的基础 UI 框架,用于快速实现页面的复杂布局,在手机天猫 Android版 内广泛使用 让人激动的是,在上个月V- Layout终于在Github上开源! Git ...

  2. Android开源库V - Layout,适用于电商首页、活动页多布局的Layout

    转载至:http://blog.csdn.net/carson_ho/article/details/71077193 感谢Carson_Ho分享 前言 V- Layout 是阿里出品的基础 UI 框 ...

  3. Android Tangram模型:连淘宝、天猫都在用的UI框架模型你一定要懂

    前言 Tangram 是阿里出品.用于快速实现组合布局的框架模型,在手机天猫 Android & iOS版 内广泛使用 今天我将对Tangram 模型 进行全面介绍,希望你们会喜欢. Cars ...

  4. Android-Tangram模型:淘宝、天猫都在用的UI框架模型你一定要懂

    3. 应用场景 常规业务 中 复杂的布局格式混排,如:浮动布局.栏格布局.通栏布局.一拖N布局.瀑布流布局,还可以组合使用这些布局 具体场景是:如电商平台首页.活动频道等等 Tangram 模型目前已 ...

  5. 走过14个双11,淘宝天猫迎来价值重估

    又一年双11,全民购物的狂欢节来临,围绕着新旧电商的争议又起来了. 十三年前,淘宝商城(天猫)在秋冬交替之际举办了一场促销节,加速了电商行业的发展进程,双11将线上购物的生活方式带入千家万户,淘宝也开 ...

  6. 淘宝如何隐藏店铺首页宝贝让同行看不到商品链接,分享最新屏蔽淘宝天猫PC电脑端代码技术

    淘宝如何隐藏店铺首页宝贝让同行看不到商品链接,分享最新屏蔽淘宝天猫PC电脑端代码技术 之前发布的老技术大家就不要尝试了,已经失效了,我们经过不懈努力终于研究出可以代替之前旧版屏蔽技术,此技术截止目前为 ...

  7. Android开源库总结

    自己总结的Android开源项目及库. github排名https://github.com/trending, github搜索:https://github.com/search UI Aweso ...

  8. Material之Behavior实现支付宝密码弹窗 仿淘宝/天猫商品属性选择

    版权声明:转载必须注明本文转自严振杰的博客: http://blog.csdn.net/yanzhenjie1003 今天的效果在支付宝.淘宝.京东等电商App中很常见.比如支付宝输入密码弹窗.商城下 ...

  9. 淘宝/天猫/1688拍立淘API接口(以图搜商品API接口,图片搜索API接口,图片搜索商品API接口)代码对接教程

    淘宝/天猫/1688拍立淘API接口(以图搜商品API接口,图片搜索API接口,图片搜索商品API接口)代码对接教程如下: 1.公共参数 名称 类型 必须 描述(接口代码教程wx19970108018 ...

最新文章

  1. 用GAN来做图像生成,这是最好的方法
  2. 编程问题之:x=xamp;(x-1)
  3. JAVA模拟HTTP post请求上传图片
  4. mysql删除员工_数据库删除职工信息
  5. zabbix v3.0安装部署【转】
  6. C#中拷贝指定文件夹下的所有文件夹目录到指定文件夹中的方法
  7. Microsoft MVC3 框架
  8. Gram 矩阵性质及应用
  9. JAVA中整型常量的长度,Java基础入门篇(三)——Java常量、变量,
  10. rk3288 lvds屏参资料_RK3288四核高性能主板,微型工业主机
  11. leetcode 226 Invert Binary Tree 翻转二叉树
  12. python xpath爬虫_[爬虫]python下的xpath清洗数据之html数据清洗
  13. 2017计算机二级c语言题库,2017年计算机C语言二级考试题库
  14. 6-2 每个单词的首字母改为大写 (12 分)
  15. 怎么进计算机更新失败,系统更新失败无法进入系统怎么办?
  16. 窃隐私泄露、放高利贷,输入法的暗箱操作
  17. npm安装任何包都报错解决方法
  18. 2022MySQL数据库-基础篇
  19. 始祖双碳新闻 | 2022年7月19日碳中和行业早知道
  20. IoT黑板报0113:你天天在扫的二维码其实是日本人发明的

热门文章

  1. Ubuntu安装Go及开发工具Goland
  2. 小学计算机室信息化实施方案,未来校园信息化建设方案
  3. 使用google actionConsole设置assistant 语音助手
  4. 华为机试:拼接URL
  5. Steiner 椭圆及其结论
  6. 找不到中文语音预训练模型?中文版Wav2vec 2.0和HuBERT来了
  7. Win10 安裝pytorch 的坑
  8. OpenGL 绘制音频波形
  9. 如何创建快捷方式并添加到开始菜单、桌面、任务栏....
  10. 多变量分析绘图及分类属性绘图【知识整理】