Contour——Kotlin构建Android UI的新方式(已废弃)
请注意:Contour项目已被废弃,我们建议开发者转向使用Jetpack Compose UI。
Contour曾是一个革命性的UI库,提供了一种类型安全的、以Kotlin为中心的API,旨在作为Android布局API最薄的包装层。它允许您在纯Kotlin中构建复合视图,而无需使用不透明的布局规则,而是通过直接参与布局阶段来实现。Contour与ConstraintLayout类似,但不同之处在于,您不是在XML中定义约束,而是使用可执行的lambda表达式。
抛弃XML,拥抱Kotlin
XML曾经是静态内容的良好载体,但在现代动态UI的时代,它的地位已经动摇。我们的UI越来越多地需要动态行为,如:
- 根据屏幕大小更改配置
- 延迟加载UI元素
- 运行时A/B测试组件
- 动态主题应用
- 根据应用状态添加和删除组件
然而,XML是一个静态标记语言,我们却试图让它成为编程语言。替代方案是什么?一个完整的编程语言——Kotlin!转向Kotlin,我们可以获得哪些好处?
- 没有findViewById,视图声明存在于作用域内。
- 消除R.id.my_view的模糊性,Kotlin拥有命名空间和封装!
- 静态类型!
- 强大的IDE支持(告别卡顿的XML编辑器)
- 不再需要ViewHolder
- 更容易的依赖注入
使用方法
Contour通过创建视图位置和尺寸的关系来工作,类似于ConstraintLayout
。但是,你不再提供XML属性,而是提供在布局阶段直接调用的“轴解算器”(axis solver),这些解算器通过layoutBy()
提供。下面是一个例子:
class BioView(context: Context) : ContourLayout(context) {
// 省略代码...
}
运行时布局逻辑
由于你在编写普通的Kotlin代码,所以可以引用其他视图并使用数学运算符描述你的布局。这些lambda函数也可以用于运行时决策,这些决策将在每次布局传递时进行评估。
上下文感知API
Contour努力使开发人员更容易做到正确的事情。为此,所有布局函数返回的都是正确的可用操作接口。
轴向类型安全性
Contour大量使用内联类以提供布局中的轴向类型安全性。
循环引用调试
当出现循环引用时,Contour会快速并大声地报告错误,并尽可能提供上下文信息。
与Compose的比较
Contour与Jetpack Compose的主要区别在于,Compose是一种使用反应式编程驱动视图的程序化UI工具包,而Contour只关心视图布局的基础部分——使其尽可能灵活且易于使用。
版本发布与许可
Contour的最新稳定版本为1.1.0,可通过Gradle引入。此外,开发版本的快照也可在Sonatype的snapshots
仓库获取。
许可证
Contour遵循Apache License 2.0协议。
尽管Contour项目已不再活跃,但它展示了一种构建Android界面的创新方式。如果你正在寻找一种更加类型安全、更接近于代码的布局解决方案,那么Contour的历史记录和技术思路仍然值得学习和借鉴。