一个轻量级的基于卡片模板的自动化布局框架
Matrix
一个轻量级的基于卡片模板的自动化布局框架
关于我
原理
该框架依据View叠加的树形结构,通过与之对应的树形json快捷简便的动态控制Card的布局结构。实现原理如下:
- 解析服务端下发的树形json数据(节点类型需实现
INode
接口); - 布局引擎深度遍历树的节点,根据节点类型生成(生成方法为
IFactory
的实现类)各节点对应的Card(Card为使用时实现ICard
接口的View或ViewGroup); - 将同一深度的兄弟节点依据权重(权重为使用时
INode
接口获得)排序; - 递归遍历非叶子节点,将Card根据嵌套类型(
NestMode
)回调给具体的Card实现布局嵌套; - 递归完成之后,布局引擎将返回根据树形json布局完成的View。
特性
该框架具有强大的Card布局功能,其主要功能特性如下:
- 框架以Card为最小单位布局(一个Card就是实现ICard接口的自定义View或ViewGroup),不关心Card内部的布局结构
- 框架解析服务端数据从而生成View,因此可实现真正的动态化布局
- 框架支持Card的自动嵌套(比如LinearLayout的VERTICAL与HORIZONTAL)和手动嵌套(预先占坑ViewGroup)
- 框架支持树形节点的Card数据部分为统一数据Bean或独自数据bean(通过json字符串支持,框架提供的
Node
节点模型即为此种类型) - 框架支持以注解(
CardModel
)形式设置独自数据bean的类型 - 框架支持的独自数据bean的类型可以为普通对象(对应json对象)和列表对象(对应json数组)
设置Gradle依赖
Add the JitPack repository to your build file
1
2
3
4
5
6allprojects {
repositories {
...
maven { url 'https://jitpack.io' }
}
}Add the dependency
1
2
3dependencies {
compile 'com.github.seasonfif:matrix:1.0.5'
}
使用方法
框架使用特别简单:
1 | 1. 应用开始执行的地方使用IFactory对象初始化Matrix |
除以上的框架调用之外,使用时应该优先完成以下的内容:1
2
3
4
5
6
71. 一个实现INode接口的节点数据模型(如果计划使用json字符串作为Card数据模型的下发方式则可以使用框架提供的Node对象)
2. 一个实现IFactory抽象工厂接口的Card工厂类
3. 至少有一个实现ICard接口的卡片以及与之对应的卡片数据模型(如果为独自的Card数据模型需要在ICard实现类加上类注解@CardModel(xxx.class))
总而言之就是事先准备好项目需要动态布局各种的Card
示例
提供代码片段以帮助大家更快地理解其使用方法
1. 一个实现INode接口的节点数据模型1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24以框架中的实现为例
public class Node implements INode<String> {
private int type;
private String des;
private int weight;
private String data;
private List<Node> children;
public int getType() {
return type;
}
public int getWeight() {
return weight;
}
public String getDescription() {
return des;
}
public String getData() {
return data;
}
public List<? extends INode> getChildren() {
return children;
}
}
2. 一个实现IFactory抽象工厂接口的Card工厂类
1 | public class CardFactory implements ICardFactory { |
3. 一个实现ICard接口的卡片以及与之对应的卡片数据模型
1 | 卡片实现 |
TODO
- Card缓存机制(由于View体系中同一View对象不能嵌套,因此将缓存Card添加到同为自己的父布局时会异常),如果有好的实现思路可以提issue
第三方
框架使用Gson (A Java serialization/deserialization library to convert Java Objects into JSON and back)作为json字符串转化为数据对象的工具
开源许可
1 | Copyright 2017 seasonfif. |