Jetpack Compose是谷歌推出的全新Android UI开发框架,它采用更为先进的声明式开发思想,极大地提升了应用界面的开发效率。 Compose颠覆性的设计理念使得其学习曲线较为陡峭,因此本书对知识点进行了系统全面的整理和编排。全书共分11章,从写第一行Hello World到实现一个全功能的产品级项目,帮助读者规划出了从入门到精通的*佳学习路径。除了对知识点细致的讲解之外,书中还穿插了大量源码示例和*佳实践,帮助读者及时巩固所学的内容,真正达到学以致用。
本书适合Jetpack Compose初学者阅读,同时书中的很多经验总结,对于已经有一定基础的开发者也同样具有参考价值。
市面上的App种类繁多,但它们的设计目标都是一致的,即通过手机将信息更快、更好地呈现给用户。Android自诞生至今的十余年间,虽然各种新技术、新架构层出不穷,但对于信息呈现的实现方式上仍然沿用着基于View的命令式UI开发方式。而这种命令式的代码往往是Android应用架构中很多弊病的根源,而且随着项目规模越来越大,病症会越发明显,让信息更快、更好地呈现的产品目标越来越受到挑战。
Jetpack Compose的出现让这一切有了转机。作为Android平台新一代UI开发框架,它直击病灶,彻底摒弃传统的命令式代码,通过先进的声明式UI帮助开发者用更少的代码开发出更高质量的App,支撑了产品目标的达成。Compose在开发范式上的先进性让我们无比看好它的未来。回想2017年谷歌发布Kotlinfirst到如今才短短数年,Kotlin就已经全面取代Java成为Android首选的开发语言,相信不用多久,我们也会迎来Composefirst的时代,届时Compose必将全面取代View成为Android首选的UI开发标准。如果读者想长期从事Android领域的研发或者是一个Android新技术的爱好者,那么从现在起,让我们一起拥抱这门新技术吧!
本书是Jetpack Compose初学者的良好入门教程,无论是否有Android传统视图的开发基础都可以阅读。但是希望读者已经具备了一定的Kotlin开发经验,不然阅读本书中的代码将十分吃力。书中也有不少进阶的开发技巧和最佳实践,对于已经有过Jetpack Compose使用经验的开发者仍然具有参考意义。本书共11章,具体如下。
第1章介绍Compose的前世今生,让读者从源头了解为什么需要学习这样一门新技术,同时在这一章将运行第一个Hello World程序,带领读者正式开始学习之旅。
第2章将介绍Compose的各种常用的功能以及布局组件,这些组件覆盖了绝大多数的开发需求,可以在完全脱离Android View的情况下开发各种样式的UI界面。
第3章将手把手地带读者用Compose组件搭建功能完整的UI页面。同时还会深入学习主题的使用方法和原理,以及Material Design的一些相关知识。
第4章将系统地学习Compose的状态管理、重组、副作用等知识点,它们才是驱动UI变化的关键,让使用Compose组件搭建的静态页面动起来。
第5章将了解Composable从组合到渲染再到屏幕的整个流程,并且可以通过相关API的学习,掌握自定义布局以及自定义绘制等高级用法,学会如何定制更复杂的UI效果。
第6章学习如何给UI添加炫酷的动画。Compose提供了一系列丰富的动画API,有的可以提供开箱即用的便利性,有的则提供了灵活多样的定制能力,它们都可以帮助读者化身为动画达人。
第7章将学习常用的手势处理、定制手势处理、手势结合动画。Compose事件分发相关的API及其背后的实现原理〖DK〗。基于协程的事件处理API相较于传统的事件处理方式更加简洁〖DK〗。
第8章将学习如何基于Jetpack系列组件为Compose添加页面导航和依赖注入等能力。这有助于读者摆脱对Activity或Fragment的依赖,打造真正的Compose First项目。
第9章将简单了解一些常用三方库对Compose的支持,特别是在Accompanist官方组件之外补充了不少新的工具,这些工具与基础组件都将成为读者日常开发中最得力的武器。
第10章和第11章都是实战内容,编者将带领读者参与两个不同类型产品的完整实现,开发过程中需要对前面章节学习到的各种知识进行综合运用。实战项目有助于读者巩固已学到的内容,也能为读者在生产环境中引入Compose建立决心和自信。
本书在知识讲解之外,也非常重视对实战经验的分享。书中穿插了大量类似经验总结的小贴士,主要分为以下4种类型,辅助读者更好地理解和运用学到的内容。正文内容之外补充知识点。比如关键词的注解或者关联知识点的介绍等。需要在实际开发中极力避免的事项。比如API的不合理使用,不推荐的实现方式等。开发出更高质量代码的实战经验。所有最佳实践会在本书的最后进行汇总,便于读者进行查阅。
本书鼓励读者对书中的内容亲自动手实践。读者可以从配套的Github仓库获取书中出现的源码,亲自运行加深理解。仓库地址为https://github.com/composemuseum/sampleapp/。
由于作者水平有限,本书在编写过程中难免出现错误和遗漏之处,还请读者批评指正!
王鹏,谷歌开发者专家(GDE),字节跳动移动端架构师,CSDN、掘金知名博主,GDG 社区特邀讲师,多次受邀在 Google DevFest、I/O Extended 等活动进行演讲,国内首批一批接触 Compose 的开发者,热衷于 Android Jetpack 新技术的实践与推广。
关振智, 北京邮电大学计算机系硕士,国内*早一批接触 Compose 的开发者,Jetpack Compose 中文技术社区核心成员。掘金优秀创作者, 谷歌开发者社区特邀嘉宾讲师,产出的大量技术内容在社区广受好评。热爱技术,乐于分享。
曾思淇,Jetpack Compose 中文技术社区主要维护者,开源技术爱好者,热衷于 Compose 相关技术的研究与推广,为社区贡献了大量 Compose 入门教程,基于 Compose 开发过多个独立 App。
前言
第1章 全新的Android UI框架/
1.1Jetpack Compose是什么?/
1.1.1谷歌为什么要推出Compose?/
1.1.2命令式UI与声明式UI/
1.1.3Compose API设计原则/
1.1.4Compose与View的关系/
1.1.5不只是Android UI框架/
1.2搭建开发环境/
1.2.1准备所需要的开发工具/
1.2.2部署开发环境/
1.3创建第一个Compose应用/
1.3.1创建新的Compose项目/
1.3.2保持Compose版本更新/
1.3.3在模拟器中运行Compose应用/
1.3.4分析第一个Compose应用/
1.3.5对Compose应用进行预览/
1.3.6已有项目引入Compose/
1.4本章小结/
第2章 了解常用UI组件/
2.1Modifier修饰符/
2.1.1常用修饰符/
2.1.2作用域限定Modifier修饰符/
2.1.3Modifier实现原理/
2.2常用的基础组件/
2.2.1文字组件/
2.2.2图片组件/
2.2.3按钮组件/
2.2.4选择器/
2.2.5对话框/
2.3常用的布局组件/
2.3.1线性布局/
2.3.2帧布局/
2.3.3Spacer留白/
2.3.4ConstraintLayout约束布局/
2.3.5Scaffold脚手架/
2.4列表/
2.4.1Lazy Composables/
2.4.2LazyListScope作用域/
2.4.3内容填充/
2.5本章小结/
第3章 定制UI视图/
3.1构建UI页面/
3.1.1配置颜色、字体与形状/
3.1.2Welcome欢迎页/
3.1.3LoginIn登录页/
3.1.4Home主页/
3.1.5布局预览/
3.2主题/
3.2.1MaterialTheme介绍/
3.2.2理解MaterialTheme与
CompositionLocal/
3.2.3定制主题方案/
3.3本章小结/
第4章 状态管理与重组/
4.1状态管理/
4.1.1什么是状态?/
4.1.2单向数据流/
4.1.3Stateless与Stateful/
4.1.4状态的定义/
4.1.5状态上提/
4.1.6状态的持久化与恢复/
4.1.7使用ViewModel管理状态/
4.1.8LiveData、RxJava、Flow转State/
4.1.9状态的分层管理/
4.2重组与自动刷新/
4.2.1智能的重组/
4.2.2避免重组的陷阱/
4.2.3如何确定重组范围?/
4.2.4优化重组的性能/
4.3生命周期与副作用/
4.3.1Composable的生命周期/
4.3.2Composable的副作用/
4.3.3副作用API/
4.3.4异步处理的副作用API/
4.3.5状态创建的副作用API/
4.3.6副作用API的观察参数/
4.4本章小结/
第5章 Compose组件渲染流程/
5.1组合/
5.2布局/
5.2.1Layout Modifier/
5.2.2LayoutComposable/
5.2.3固有特性测量Intrinsic/
5.2.4SubcomposeLayout/
5.3绘制/
5.3.1Canvas Composable/
5.3.2DrawModifier/
5.3.3使用平台原生Canvas/
5.3.4实战:Canvas绘制波浪加载/
5.4本章小结/
第6章 让页面动起来:动画/
6.1动画分类/
6.2高级别动画API/
6.2.1AnimatedVisibiliy/
6.2.2AnimatedContent/
6.2.3Crossfade/
6.2.4Modifier.animateContentSize/
6.3低级别动画API/
6.3.1animate*AsState/
6.3.2Animatable/
6.4Transition过渡动画/
6.4.1updateTransition/
6.4.2rememberInfiniteTransition/
6.5AnimationSpec动画规格/
6.5.1spring弹跳动画/
6.5.2tween补间动画/
6.5.3keyframes关键帧动画/
6.5.4repeatable循环动画/
6.5.5infiniteRepeatable无限循环动画/
6.5.6snap快闪动画/
6.5.7使用Easing控制动画节奏/
6.6AnimationVector动画矢量值/
6.6.1TwoWayConverter/
6.6.2自定义实现TwoWayConverter/
6.7实战:Compose实现骨架屏的动画
效果/
6.7.1定义背景色/
6.7.2为Brush添加动画/
6.7.3实现骨架屏布局/
6.8实战:Compose实现收藏按钮动画
效果/
6.8.1实现方式1:高级别API
(AnimatedContent)/
6.8.2实现方式2:低级别API
(updateTransition)/
6.9本章小结/
第7章 增进交互体验:手势处理/
7.1常用的手势处理Modifier/
7.1.1Clickable点击/
7.1.2CombinedClickable复合点击/
7.1.3Draggable拖动/
7.1.4Swipeable滑动/
7.1.5Transformable多点触控/
7.1.6Scrollable滚动/
7.1.7NestedScroll嵌套滑动/
7.2定制手势处理/
7.2.1使用PointerInput Modifier/
7.2.2手势事件方法作用域
awaitPointerEventScope/
7.3手势结合动画/
7.4本章小结/
第8章 为Compose添加页面导航/
8.1在Compose中使用Navigation/
8.1.1认识Jetpack Navigation/
8.1.2Navigation for Compose/
8.1.3导航时携带参数/
8.1.4Navigation搭配底部导航栏/
8.1.5嵌套导航图Nested Navigation
Graph/
8.1.6导航DeepLinks/
8.1.7Navigation对ViewModel的
支持/
8.2在Compose中使用Hilt/
8.2.1认识Dagger Hilt/
8.2.2在Compose中使用Hilt/
8.3本章小结/
第9章 Accompanist与第三方组件库/
9.1Accompanist/
9.1.1SystemUiController/
9.1.2Pager/
9.1.3SwipeRefresh/
9.1.4Flow Layouts/
9.1.5Insets/
9.2Lottie/
9.2.1配置依赖/
9.2.2Lottie动画资源/
9.2.3创建Lottie动画/
9.3Coil/
9.3.1配置依赖/
9.3.2AsyncImage/
9.3.3SubcomposeAsyncImage/
9.3.4AsyncImagePainter/
9.4本章小结/
第10章 项目实战:小游戏Tetris/
10.1整体项目架构/
10.2砖块矩阵(BrickMatrix)/
10.2.1drawBrick绘制砖块单元/
10.2.2drawMatrix绘制砖块
矩阵/
10.3下落中的砖块(Sprite)/
10.3.1Shape砖块组合形状/
10.3.2Sprite定义下落砖块/
10.3.3drawSprite绘制下落砖块/
10.4游戏机体(GameBody)/
10.4.1GameButton/
10.4.2组装Button、发送Action/
10.4.3Clicable:分发事件/
10.5订阅游戏状态(ViewState)/
10.5.1ViewState/
10.5.2Action/
10.5.3reduce/
10.6预览游戏画面/
第11章 项目实战:聊天应用Chatty/
11.1整体系统架构/
11.2登录注册模块/
11.3IM聊天模块/
11.3.1对话列表页/
11.3.2对话详情页/
11.4联系人模块/
11.4.1通讯录页/
11.4.2添加搜索页/
11.4.3二维码扫描页/
11.4.4陌生人信息页/
11.5用户信息模块/
11.5.1个人信息页/
11.5.2信息编辑页/
11.5.3联系人信息页/
11.6发现模块/
11.7适配暗黑主题/