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

前言
● 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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值