Android | Tangram动态页面之路(一)需求背景
本系列文章主要介绍天猫团队开源的Tangram框架的使用心得和原理,由于Tangram
底层基于vlayout,所以也会简单讲解,该系列将按以下大纲进行介绍:
- 需求背景 页面模板的多维度定投(分时、分人群等)、数据资源位聚合、RecyclerView的异构和扁平。
- Tangram和vlayout介绍
- Tangram的使用
- vlayout原理
- Tangram原理
- Tangram二次封装
本文先主要介绍下需求背景。
需求背景
首先,笔者在工作中(生产环境)使用的并非Tangram,而是公司内部的框架(未开源),不过原理都大同小异,本系列文章也不会精细到每一行源码,不求齐全,只求用尽可能小的篇幅讲明白。
页面定投
大家都知道,电商行业喜欢造节,从双11双12,到现在的321、618、921等,几乎一年四季都会有营销活动,这些活动能带动GMV持续造血。一场大促,通常会分预热期和正式期。预热期用来造势,着重透出主会场、活动等内容;正式期则在接近尾声时,着重透出倒计时内容增强紧迫感(再不剁手就没机会了),如下图:
可以看出,从预热期到正式期,着重透出的内容不同,结构也不同。也就是说,需要足够灵活的页面模板,满足不同时间,不同人群(如多人多面)展示不同结构的页面
。当然这点h5也能做到,但是h5体验要差于native,一般用于临时活动页或高度灵活的页面。像商城首页,商品详情等相对稳定的页面,对灵活性的要求并非无限制的,只要各模块足够抽象、细粒度,native也是可以满足日常和大促需求的。
数据聚合
如前边的商城首页,数据来源也是多渠道的,比如头部的banner、各类入口、类目模块,数据来源于一个个不同的资源位,由不同的人进行配置,而尾部的商品流数据则来源于推荐引擎,如下图,
客户端不可能去发起多个请求拉取不同资源位的数据,所以就有了聚合层
接口,客户端通过一个聚合接口
,获取聚合数据,
商品流不属于资源位数据,所以独立成一个接口。至此,我们会发现,页面模板不仅要描述页面结构,还要描述各模块所需的数据来源
。大概如下所示:
{
"template":[
{
"component":"banner", //轮播图模块
"data":"makeup:banner" //数据来源于聚合接口,key为banner
},
{
"component":"category", //类目模块
"data":"makeup:category" //数据来源于聚合接口,key为category
},
{
"component":"goods", //商品流模块
"data":"request:recommend" //数据来源于request,key为recommend
}
]
}
RecyclerView的异构和扁平
要实现前边商城首页的复杂布局,通常的思路是定义各种itemType
,然后根据itemType
来解析不同的布局文件,这么做往往需要进行一层嵌套,因为RecyclerView
自带的LayoutManager
不支持如此异构的布局,效果如下图左,
而使用vlayout
,可以免去这层嵌套,如上图右,让子view成为RecyclerView
的直接子view,具体我们运行vlayout
的官方Demo,然后使用AS的Tools - Layout inspector
功能查看view树,可见图中的39和43两个小模块都是RecyclerView
的直接子view,有着平级关系,
这就是用RecyclerView
实现异构和扁平化的基本概念,vlayout
通过自定义LayoutManager
进行了实现。关于异构和扁平,更详细的分析可见参考文章。
参考文章
- 苹果核 - RecyclerView 里的自定义 LayoutManager 的一种设计与实现
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- 嵌入式linux之go语言开发(十三)LittlevGL,漂亮的嵌入式GUI的go语言绑定
- 同事问我MySQL怎么递归查询,我懵逼了...
- RocketMQ学习四-生产者producer
- 想有自己的博客吗?浏览器支持 MarkDown和语法高亮的最简单示例(使用markdown-it、highlight.js和mermaid)
- Golang--Go语言 五百行后台代码实现一简约的个人博客网站-TinyBlog
- RocketMQ学习5
- c语言调用go封装的动态库步骤及减小体积包的方法
- 深入理解JavaScript闭包之闭包的使用场景
- Spring Boot 到底是个啥?
- Spring Boot 整合 Thymeleaf
- webapp打包为Android的apk包的一种方法
- Android应用之Hybird混合开发,集成web页面的方法尝试
- Spring Boot 通过 XML 的方式整合 MyBatis
- layUI登录界面验证码功能模块儿封装
- go语言微信公众号开发后台接口封装