MAD,现代安卓开发技术:Android 领域开发方式的重大变革~(3)

简介: MAD,现代安卓开发技术:Android 领域开发方式的重大变革~(3)

6.Jetpack Compose

1832b220aa754cd18c504acc7686a560.pngJetpack Compose 是 Google 耗费五年倾力打造,用于构建 Android 原生界面的全新 UI 工具包。Android 诞生多年,UI 体系早已成熟,为什么这么要重造一个轮子?🤔


原因:


XML 布局冗长、繁琐:遇到复杂的布局,把屏幕竖过来都看不全

View 编程方式的嵌套会带来性能影响:不合理的布局导致测量性能翻倍

手动更新视图复杂、易错

声明性界面模型逐渐流行:这种方式可以简化 UI 的构建和更新步骤,仅执行必要的更改

其发展历程:


17 年立项

之后长达三年的内部调查和实验

20 年初 dev 版公开,年中 alpha 版推出

21 年初 beta 版发布

21 年 4 月全球挑战推广

21 年 7 月正式发布

1832b220aa754cd18c504acc7686a560.png

6.1 Compose 挑战赛

去年上半年 Google 启动了为期四周的全球 Compose 挑战赛,提供了 500 多份乐高联名积木,十几部 Pixel 手机奖品,引发数万计Android开发者尝鲜,提交作品。


第一周的挑战做一个宠物领养 App,我花了一个周末做了个 LovePet 并拿到了这个飘洋过海的乐高积木,在推特上提交作品截图之后还有好多老外点赞,是很不错的体验。

后面的挑战还有定时器 App,复刻 App 设计作品,发挥想象做个天气 App 等

1832b220aa754cd18c504acc7686a560.png

这些比赛内容其实涵盖了 Compose 所需要用到的大部分技术。Google 的大力推广也足见其决心和重视程度,日后必将成为Android平台上重要的UI编写方式,早日上车!💪

6.2 编程思想

我们通过一个展示 “Hello World” 文本的小例子,来直观感受一下 Compose 编程思想的明显差异。

1832b220aa754cd18c504acc7686a560.png

  • 传统的 UI 编程方式
    我们再熟悉不过了。常见的操作是先定义一个 xml,然后通过 Activity 的 setContentView() 将 xml 放进去,之后就交给系统来加载。
<androidx.constraintlayout.widget.ConstraintLayout ...>
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello World"  ... />
</androidx.constraintlayout.widget.ConstraintLayout>
class MainActivity: AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        ...
        setContentView(R.layout.activity_main)
    }
}
  • Compose 编程方式

Compose UI 工具包则依赖 Composable 注解将展示 UI 的函数声明为可组合函数,Compose 编译器负责标记可组合函数内的组件,并进行展示。

布局的部分均需要放在该函数内交由 Compose 组合。

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        ...
        setContent {
            SimpleComposable()
        }
    }
    @Composable
    fun SimpleComposable() {
        Text("Hello World")
    }
}

6.3 进阶示例

来看一下下面这个简单的动态效果,并思考一下:如果采用传统的 View 编程方式来实现,你需要多少代码量?

2Zmh5D.gif

采用传统的 View 方式,无非是如下的思路,布局加上逻辑少于 100 行代码不太容易实现:


布局:CardView + LinearLayout(ImageView + TextView)

代码:监听、展开和隐藏 TextView,并考虑阴影和淡出动画)

那如果采用 Compose 来实现呢?只需要 10 行即可。


Composable 函数组合圆角组件 Card + 垂直布局组件 Column

Column 嵌套图片组件 Image 和动画组件 AnimatedVisibility 包裹的文本组件 Text

Column 的 click 事件更新展开或隐藏的 state,进而触发 AnimatedVisibility 的重组,刷新 Text 的展示与否

@Composable
fun JetpackCompose() {
    Card {
        var expanded by remember { mutableStateOf(false) }
        Column(Modifier.clickable { expanded = !expanded }) {
            Image(painterResource(R.drawable.jetpack_compose))
            AnimatedVisibility(expanded) {
                Text(
                    text = "Jetpack Compose",
                    style = MaterialTheme.typographt.h2,
                )
            }
        }
    }
}

6.4 优势

1832b220aa754cd18c504acc7686a560.png

篇幅有限,事实上 Compose 具备非常多的优势,亟待大家的挖掘:


声明式 UI:只负责描述界面,Compose 系统负责其余工作


状态驱动:界面随着状态自动更新


高效渲染:固定测量,层级嵌套性能仍是 O(n)


结合 AS 的 Preview 视图可实时查看和直接交互 UI


兼容传统 View 树编程方式,可混合使用


支持 Material Design 设计语言


拥有 Jetpack 框架的大力配合


基于 Kotlin,代码简洁,大量 Kotlin 专属 API


跨平台亦有布局:Desktop、 Web


大家可以利用 Compose 先来实现一个新画面,或者改造一个现有画面,逐步推进 Compose 的学习和实践。但是 Compose UI 工具包目前在部分场景下的组件支持有限,比如 WebView、CameraView 等,这些场景下仍需要配合 Android 原生的 View 方式来完成。

6.5 Sample

1832b220aa754cd18c504acc7686a560.png

Movie 客户端

本人使用 Compose 的大部分 UI 组件、视图切换和数据刷新重构的电影搜索 App。

https://github.com/ellisonchan/ComposeMovie

1832b220aa754cd18c504acc7686a560.png

  • 俄罗斯方块
    fun 神将自定义 Compose 组件和状态管理发挥到了极致,搭配定时器和各式动画实现,非常值得用来深入学习 Compose 技术。
    https://github.com/vitaviva/compose-tetris

网络异常,图片无法展示
|

ComposeBird

本人在 fun 神的俄罗斯方块游戏的激励下使用 Compose 复刻了风靡一时的 Flappy Bird,感兴趣的也可以学习实现思路。

https://github.com/ellisonchan/ComposeBird

网络异常,图片无法展示
|

未来展望

image.png

本次介绍了 MAD 涵盖的诸多新技术,大家可以感受到 Google 在一刻不停地革新技术。从工具到语言、框架到发行方式都在进行全方位地改良,之前耕耘多年的技术说废就废,绝不手软。


究其原因,绕不开产品生命的两大角色:开发者和消费者。


提升开发者的开发效率

改善消费者的产品体验

然而新事物的出现必然伴随着旧事物的衰落,开发者该如何对待老技术、如何看待层出不穷、前途不明的新技术?光跨平台这一项,Google 和 Jetbrains 就推出了 Flutter、KMM、Compose Multiplatform 三个技术,任何人都卷不过来的。


我总结了几句四字短语,与你分享我的感受和态度:


不可无视,适当了解,跟上形势:保持关注,防止日后看不懂人家用了什么技术,甚至无法理解别人的代码

拥抱变化,勇于尝鲜,有备无患:找个感兴趣的切入点虚心学习、体会新技术的动机

不可依赖,了解原理,学习模仿:光使用还不够,需要深入了解其实现,确保坑来临的时候游刃有余

是否深入,见仁见智,自行评估:适当取舍、甚至观望,一些技术是昙花一现的

资料资源

官方资料

各类学习点的文档主页,主页和分支页面从背景、思想、API到使用方法等层面进行了充分说明。可以帮助你快速了解和掌握相关技术。

1672187913945.png

官方 Sample

Google优秀的开发者关系工程师的诚心之作,针对语言、工具和框架开发和持续维护着详尽的Sample。辅助大家学习这些技术,并进行适当地借鉴。

学习对象 地址

1672187975240.png

我的文章

Compose 系列:

「Jetpack Compose 助我快速打造电影 App」

「一气呵成:用Compose完美复刻Flappy Bird!」

Jetpack 系列:


「深度解读 Jetpack 框架的基石-AppCompat」

「为什么推荐使用 Jetpack CameraX?」

「Android 上数据库的新选择,Jetpack Room」

「Jetpack Hilt 有哪些改善又有哪些限制 」

「从Preference组件的更迭看Jetpack的前世今生」

「CameraX + 华为 ScanKit:二维码扫描的终极解决方案」

「Jetpack新成员SplashScreen:打造全新的App启动画面」

「Jetpack 叒一新成员 DragAndDrop 框架:大大简化拖放手势开发」

我的 Sample

1672188046371.png


相关文章
|
14天前
|
搜索推荐 前端开发 API
探索安卓开发中的自定义视图:打造个性化用户界面
在安卓应用开发的广阔天地中,自定义视图是一块神奇的画布,让开发者能够突破标准控件的限制,绘制出独一无二的用户界面。本文将带你走进自定义视图的世界,从基础概念到实战技巧,逐步揭示如何在安卓平台上创建和运用自定义视图来提升用户体验。无论你是初学者还是有一定经验的开发者,这篇文章都将为你打开新的视野,让你的应用在众多同质化产品中脱颖而出。
40 19
|
14天前
|
JSON Java API
探索安卓开发:打造你的首个天气应用
在这篇技术指南中,我们将一起潜入安卓开发的海洋,学习如何从零开始构建一个简单的天气应用。通过这个实践项目,你将掌握安卓开发的核心概念、界面设计、网络编程以及数据解析等技能。无论你是初学者还是有一定基础的开发者,这篇文章都将为你提供一个清晰的路线图和实用的代码示例,帮助你在安卓开发的道路上迈出坚实的一步。让我们一起开始这段旅程,打造属于你自己的第一个安卓应用吧!
41 14
|
14天前
|
开发框架 Android开发 iOS开发
安卓与iOS开发中的跨平台策略:一次编码,多平台部署
在移动应用开发的广阔天地中,安卓和iOS两大阵营各占一方。随着技术的发展,跨平台开发框架应运而生,它们承诺着“一次编码,到处运行”的便捷。本文将深入探讨跨平台开发的现状、挑战以及未来趋势,同时通过代码示例揭示跨平台工具的实际运用。
|
15天前
|
搜索推荐 前端开发 测试技术
打造个性化安卓应用:从设计到开发的全面指南
在这个数字时代,拥有一个定制的移动应用不仅是一种趋势,更是个人或企业品牌的重要延伸。本文将引导你通过一系列简单易懂的步骤,从构思你的应用理念开始,直至实现一个功能齐全的安卓应用。无论你是编程新手还是希望拓展技能的开发者,这篇文章都将为你提供必要的工具和知识,帮助你将创意转化为现实。
|
15天前
|
Java Android开发 开发者
探索安卓开发:构建你的第一个“Hello World”应用
在安卓开发的浩瀚海洋中,每个新手都渴望扬帆起航。本文将作为你的指南针,引领你通过创建一个简单的“Hello World”应用,迈出安卓开发的第一步。我们将一起搭建开发环境、了解基本概念,并编写第一行代码。就像印度圣雄甘地所说:“你必须成为你希望在世界上看到的改变。”让我们一起开始这段旅程,成为我们想要见到的开发者吧!
24 0
|
人机交互 Android开发 iOS开发
|
程序员 Android开发 开发者
|
27天前
|
开发框架 前端开发 Android开发
安卓与iOS开发中的跨平台策略
在移动应用开发的战场上,安卓和iOS两大阵营各据一方。随着技术的演进,跨平台开发框架成为开发者的新宠,旨在实现一次编码、多平台部署的梦想。本文将探讨跨平台开发的优势与挑战,并分享实用的开发技巧,帮助开发者在安卓和iOS的世界中游刃有余。
|
29天前
|
缓存 前端开发 Android开发
安卓开发中的自定义视图:从零到英雄
【10月更文挑战第42天】 在安卓的世界里,自定义视图是一块画布,让开发者能够绘制出独一无二的界面体验。本文将带你走进自定义视图的大门,通过深入浅出的方式,让你从零基础到能够独立设计并实现复杂的自定义组件。我们将探索自定义视图的核心概念、实现步骤,以及如何优化你的视图以提高性能和兼容性。准备好了吗?让我们开始这段创造性的旅程吧!
26 1
|
1月前
|
搜索推荐 Android开发 开发者
探索安卓开发中的自定义视图:打造个性化UI组件
【10月更文挑战第39天】在安卓开发的世界中,自定义视图是实现独特界面设计的关键。本文将引导你理解自定义视图的概念、创建流程,以及如何通过它们增强应用的用户体验。我们将从基础出发,逐步深入,最终让你能够自信地设计和实现专属的UI组件。