Compose发展历史
🗂️ Jim Sproch 是 谷歌高级工程师(Compose之父,那Compose之母是谁?),有着 前端开发领域 丰富的 工作经验,开创性的 提出 借助 Kotlin Compiler Plugin 为 Android 打造声明式UI框架的想法。
- 2017年 启动 Jetpack Compose 项目
- 2019年5月 Jim Sproch 团队 在 Google/IO 大会 上做了 Compose的分享
- 2019年10月 Compose 发布首个 Preview 版本
- 2020年6月 发布 Developer Preview2 版本
- 2020年9月 发布第一个 Alpha 版本
- 2021年2月 发布第一个 Beta 版本
- 2021年7月 Jetpack Compose 1.0 正式版本 发布
Compose是什么?
Compose是一套 现代化的 UI工具包,它是一个库,又或者说是个框架(重新定义了AndroidUI的写法)。
它 用更少的代码,强大的工具 和 直观的 Kotlin API简化并加速了 Andoid上的UI开发。
它拥有的几个特性:声明式,一切皆为函数(Composable函数),组合(组合优于继承),单一数据源(单向流动),重组。
它 还包含 Android,Desktop(WIndows,Linux,macOS),Web等不同平台的UI开发。
Compose模块分层了解
Compose模块 | 说明 |
---|---|
Material | 此模块位于最上层,基于 Material Design 系统实现的各种 Composable,同时提供了基于 Material Design 的 主题,图标等。 |
Foundation | 此模块为UI提供了一些基础的 Composable,例如 Row, Column, LazyColumn等布局类UI,以及特定手势识别等,这些基础 Composable 在很多平台都可以通用。 |
UI | UI层的功能众多,包含了多个模块(ui-text, ui-graphics, ui-tooling等),这些模块构筑了上层 Composable运行的基础,例如 Composable 的测量,布局,绘制,事件处理以及 Modifier管理等。 |
Runtime | Compose 通过UI树的diff驱动界面刷新,此模块提供了基本的对UI树的管理能力。此模块 还 提供了 Compose 运行时的基本组件,例如 remember、mutableStateOf、@Composable 注释 和 SideEffect。 |
谷歌为什么推Compose?
为什么推Compose,要从几个方面来说。
第一, 随着不断迭代,历史遗留问题 积重难返。比如 View代码的臃肿,继承的控件设计不合理,落伍(引入很多不必要的功能),基础控件只能随系统更新 等。
这就很像公司的一些老项目,也在迭代,也在使用新技术,新架构等,随着业务的迭代,历史遗留问题越积越多,最后不得不 新建一个新的工程 进行 重写(懂的都懂)。
第二, 近几年谷歌推出了很多新东西,比如Kotlin,新框架 等.。但 UI开发这块 效率太拉胯,所以需要 提升UI开发效率。
第三, 其它产商 已推出 声明式UI,需要紧跟时代步伐;
Android传统视图 与 Compose, Flutter,Qt-QML,React, SwiftUI 等声明式UI 对比
Android传统视图
命令式的编程风格
Compose
Flutter
Qt-QML
SwitfUI
对Compose的评价与未来
据Android开发者统计,Google Play商店中排名前一千的应用中就有超过一百个正在使用 Compose。
国内Android招聘信息上很多 将 Compose 作为加分项。
大家用了 Compose 都说好!!!大家好才是真的好!!!
常用控件了解
1.基础组件
1.1 文字组件
Text(文本), TextField(输入框);
按钮 Button
1.2 图片组件
Icon 组件用于帮助开发者显示一系列的小图标。支持三种不同类型的图片设置:
矢量图(ImageVector),位图(ImageBitmap),画笔(Painter 自定义绘制)
类似 ImageView
图片库的使用
是否支持开发中使用的图片格式
Compose 中的图像和图形 | Jetpack Compose | Android Developers
是否支持开发中常用的图片格式(webp,pag,lottie...)?
1.3 选择器
Checkbox(复选框)
TriStateCheckbox(三态选择框)
Switch(单选开关);
RadioButton(单选)
1.4 进度条
LinearProgressIndicator(直线进度条)
CircularProgressIndicator(圆形进度条)
2.布局组件
2.1 线性布局
androidx.compose.foundation.layout | Android Developers
Column(类似vertical 的 LinearLayout), Row(类似horizontal 的 LinearLayout);
Flow Layouts(FlowRow and FlowColumn)
当 Column/Row 放不下里面的内容时,自动换行
2.2 帧布局
Box, Surface;
2.3 其它
Spacer(留白), Card, BoxWithConstraints, ConstraintLayout(约束布局), Scaffold脚手架, BottomNavigation底部导航栏, Pager, Dialog, DropdownMenu, ModalBottomSheetLayout
3.列表组件
列表和网格 | Jetpack Compose | Android Developers
LazyColum 竖向列表/LazyRow 横向列表
LazyVerticalGrid 网格列表
常用库了解
名称 | 说明 |
---|---|
Navigation Animation | navigation动画 |
Placeholder | 骨架屏,页面完全渲染之前的灰色轮廓 |
Core Theme Adapter | XML主题适配 |
Swipe Refresh | androidx.compose.material.pullrefresh |
Permissions | 权限请求库 |
WebView wrapper | |
Test Harness | UI测试 |
Coil | 图片加载库 |
Lottie | 动画工具库 |
动画
使用 Jetpack Compose 实现精美动画_哔哩哔哩_bilibili
动画 | Jetpack Compose | Android Developers
高级动画API
AnimatedVisibility/AnimatedContent/ContentTransform/animateXXXAsState
(24条消息) Jetpack Compose中的动画_川峰的博客-CSDN博客
状态管理
状态和 Jetpack Compose | Android Developers
实践 | Jetpack Compose 中的状态管理_哔哩哔哩_bilibili
- Composables:用于管理简单的界面元素状态;
- 状态容器:用于管理复杂的界面元素状态且拥有界面逻辑;
- ViewModel:提供对于业务逻辑和 UI 状态的状态容
主题
Compose主题切换——让你的APP也能一键换肤 - 掘金 (juejin.cn)
在应用中使用 Compose Material 3_哔哩哔哩_bilibili
Compose 中的 Material Design 2 | Jetpack Compose | Android Developers
Compose性能如何?
相比 XML , Compose 性能到底怎么样? - 掘金 (juejin.cn)
(20条消息) 如何优化 Compose 的性能?通过「底层原理」寻找答案 | 开发者说·DTalk_Android 开发者的博客-CSDN博客
Jetpack Compose 渲染性能到底怎么样? - 知乎 (zhihu.com)
Jetpack Compose 性能提升最佳实践 - YouTube
遵循最佳实践 | Jetpack Compose | Android Developers
TV开发的问题
1.适配问题
Jetpack Compose 实现完美屏幕适配 - 掘金 (juejin.cn)
使用文章的方法,适配的方式也比较简单(我这里是以电视的1920分辨率来适配的)
val displayMetrics = LocalContext.current.resources.displayMetrics
val fontScale = LocalDensity.current.fontScale
val density = displayMetrics.density
val widthPixels = displayMetrics.widthPixels
val widthDp = widthPixels / density
val display = "density: $density\nwidthPixels: $widthPixels\nwidthDp: $widthDp"
CompositionLocalProvider(
LocalDensity provides Density(
density = widthPixels / 1920f,
fontScale = fontScale
)
) {
... ...
}
2.TV开发的焦点问题
Jetpack Compose中的焦点管理 - 掘金 (juejin.cn)
(24条消息) Jetpack Compose中的软键盘与焦点控制_compose 获取焦点_川峰的博客-CSDN博客
3.使用Android View
-
如何 在Compose View 中 嵌入 Android View
-
WebView wrapper库使用 WebView wrapper
4.Service悬浮窗问题
gist-github-com.translate.goog/handstandsa…
原理剖析
沉思录 | 揭秘 Compose 原理:图解 Composable 的本质 - 掘金 (juejin.cn)
(24条消息) Jetpack Compose_川峰的博客-CSDN博客
技术原理 | 你好 Compose (jetpackcompose.cn)
Jetpack Compose 布局详情_哔哩哔哩_bilibili
扒一扒 Jetpack Compose 实现原理 - 掘金 (juejin.cn)
参考资料
《Jetpack Compose Android全新UI编程》,《Jetpack Compose 从入门到实践》
Overview - Jetpack Compose Playground (foso.github.io)
Switch - Jetpack Compose Playground
Jetpack Compose 快来学学吧! - 掘金 (juejin.cn)
Accompanist (google.github.io)
Jetpack-Compose-Tutorials非常全面的教程
Compose Layouts and Modifiers - MAD Skills-Youtbe
声明式 UI?Android 官方怒推的 Jetpack Compose 到底是什么 (qq.com)
(24条消息) 川峰的博客_CSDN博客-架构,设计模式,Jetpack Compose领域博主
Demo展示
GitHub - ericktijerou/photosearch: PhotoSearch is an Android TV app using Jetpack Compose.
GitHub - vitaviva/compose-weather: CuteWeather is a beautiful weather app build in Jetpack Compose
使用Jetpack Compose编写一款简单的AndroidTV应用 - 掘金 (juejin.cn)