Jetpack Compose 介绍和快速上手

Compose版本发展

19年,Compose在Google IO大会横空出世,大家都议论纷纷,为其前途堪忧。

21年7月Compose 1.0的正式发布,却让大家看到了Google在推广Compose上的坚决,这也注定Compose会成为UI开发的新风向。

23年1月 发布了1.4版本, 在不断更新迭代......

Compose是什么

Compose则是一个全新的UI库,隶属Jetpack中的一员,它的出现是为了重新定义Android UI的开发方式——声明式UI编程

Compose的优势

  • 声明式UI,它基于声明式的UI编程模型,当数据发生改变时,UI将自动刷新。这意味着不再需要编写命令式代码来控制 UI 的每一个细节
  • 去掉XML,完全解除了混合写法(xml+Java、kotlin)的局限性
  • 超强兼容性,大多数常用库(如Navigation、ViewModel和Kotlin协程)都适用于Compose,Compose 能够与现有 View 体系并存,你可以为一个既有项目引入 Compose
  • 加速开发,为我们提供了很多开箱即用的Material 组件,如果的APP是使用的material设计的话,那么使用Jetpack Compose 能让你节省不少精力。
  • 精简代码数量,减少bug的出现
  • 实时预览,Compose 预览机制可以做到与真机无异,真正的所见所即得

Compose和View的关系

Compose 是基于 Canvas渲染,它的原理是通过AndroidComposeViewdispatchDraw分发绘制,通过dispatchTouchEvent分发手势,来实现「在同一个 View 的内部完成整个 UI 组件树」的效果。

AndroidComposeView的作用是承上启下,作为Compose和View混合开发的桥梁,从而实现API互相调用的能力

Compose 是不会有能力上的天然限制的,也就是传统 View 方案能做的事 Compose 全都可以做,比如各种复杂的动画、手势、嵌套的多层级布局,Compose 都可以做到。

Compose 没有做出对等实现的只有 SurfaceView 和 TextureView 这两个类,它们是用于高速刷新的内容的,比如视频播放或者相机的取景器界面。需要使用原生的 SurfaceView 或者 TextureView

扩展: 直接在Android上使用skia引擎进行绘制UI,这样就和flutter完全一致了,不过google为了兼容原来的view没有选择skia这个方案,兼容性是有了,但是也限制了compose的性能。

声明式UI & 命令式UI

声明式UI和命令式UI是两种不同的编程风格。

在命令式UI中,需要手动构建一个全功能的UI实例,比如一个TextView文本,在随后UI发生变化时,调用set方法手动刷新UI。

fun timer(){var count = 0textView.setOnClickListener{count+=1textView.text = "count:${count}""}
}

而在声明式UI中,开发人员描述当前的UI状态,数据更新后UI的刷新交给Compose框架。

@Composable
fun Timer(){var count by remember { mutableStateOf(0) }Text(text = "count:${count}", modifier = Modifier.clickable(onClick = count++))
}

Compose项目集成

使用Jetpack Compose 来开始你的开发工作有2种方式:

  • 将Compose 依赖库添加到现有项目
  • 创建一个支持Jetpack Compose的新应用

gradle 配置

在app目录下的build.gradle 中将app支持的最低API 版本设置为21或更高,同时开启Jetpack Compose enable开关,代码如下:

kotlin编译器与Compose兼容性对应表

android {buildFeatures {compose = true}kotlinOptions {jvmTarget = "1.8"}composeOptions {kotlinCompilerExtensionVersion = "1.4.0"}
}

Compose依赖添加

  • 借助 Compose 物料清单 (BoM),只需指定 BoM 的版本,即可管理所有 Compose 依赖库版本
dependencies {implementation platform('androidx.compose:compose-bom:2023.01.00')implementation("androidx.compose.foundation:foundation")implementation 'androidx.compose.ui:ui'
}

android推出的BOM(Bill of Material的缩写)来简化我们添加compose依赖过于繁杂的问题

  • 为什么建议使用 BoM 管理 Compose 库版本?

    • compose的一系列依赖,版本众多,更新且又频繁,且又相互有所依赖,对于我们开发来说,理清这些层层次次关系足以头大,然后还有个致命问题,我们几个库使用不同版本,可能还会导致编译直接报错,出现依赖版本等冲突问题
    • 今后,Compose 库将单独进行版本控制,这意味着版本号将开始按照自己的节奏递增。每个库的最新稳定版本已经过测试,并保证能够很好地协同工作。不过,找到每个库的最新稳定版本可能比较困难,而 BoM 会帮助您自动使用这些最新版本
  • BoM 是否会自动将所有 Compose 库添加到我的应用中?

    • 不会。需要再应用中实际添加和使用 Compose 库,必须在模块(应用级)Gradle 文件(通常是 app/build.gradle)中将每个库声明为单独的依赖项行。

    • 使用 BoM 可确保应用中的任何 Compose 库版本兼容,但 BoM 实际上并不会将这些 Compose 库添加到您的应用中。

    • 更新 BoM 版本时,使用的所有Compose库都会自动更新到新版本。

VersionCatlogs 依赖添加

BOM与Compose依赖版本对应表

// settings.gradle....versionCatlogs{create('composeLibs'){// Bom与Compose依赖库版本对应关系// https://developer.android.com/jetpack/compose/bom/bom-mapping?hl=zh-cn// 目前使用的是Bom:2023.01.00,但其中foundation使用了1.4.0-beta02,是因为该版本中LazyVerticalStaggeredGrid// 才支持自定义跨列(spanCount)的能力library('bom','androidx.compose','compose-bom').version('2023.01.00')// material组件库,如下拉刷新library('material', 'androidx.compose.material', 'material').withoutVersion()// 基础ui组件库library('ui', 'androidx.compose.ui', 'ui').withoutVersion()// as预览library('preview', 'androidx.compose.ui', 'ui-tooling-preview').withoutVersion()library('tooling','androidx.compose.ui','ui-tooling').withoutVersion()// 基础能力库 modifier修饰符,列表library('foundation', 'androidx.compose.foundation', 'foundation').version('1.4.0-beta02')// icon及扩展library('icons', 'androidx.compose.material', 'material-icons-core').withoutVersion()library('icons-ext', 'androidx.compose.material', 'material-icons-extended').withoutVersion()library('activity-compose', 'androidx.activity', 'activity-compose').version('1.6.1')// activity 和 viewmodel的扩展library('viewmodel-compose', 'androidx.lifecycle', 'lifecycle-viewmodel-compose').version('2.5.1')bundle('compose', ['material', 'ui', 'preview','tooling','icons', 'icons-ext','foundation','activity-compose','viewmodel-compose'])}}

添加一个 Text 元素

首先,我们会在 onCreate 方法中添加一个 Text 元素来显示一个 Hello World! 的文本。

setContent 块定义了一个我们可以调用 Composable 函数的 avtivity 的布局,Composable 函数只能从其他的 Composable 函数中调用

Jetpack Compose 使用一个 Kotlin 编译器插件来将这些 Composable 函数转化为应用程序的 UI 元素。例如,由 Compose UI 库定义的 Text() 函数就可以在屏幕上显示一个文本标签。

class MainActivity : ComponentActivity() {override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContent {Text("Hello world!")}}
}

定义一个 composable 函数

  • Jetpack Compose 是围绕着 Composable 函数建立的。要创建一个 Composable 函数,只需在函数名称中添加 @Composable 注解。

  • Composable 函数只能从其他 Composable 函数的范围内调用。

为了更好的理解,定义一个 MessageCard() 函数,它包含了一个 name 参数,并使用这个参数来配置文本元素

class ComposeActivity : ComponentActivity() {override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContent {MessageCard("Hello world!!! Welcome to Compose")}}// Composable 函数一般用大写开头,为了和普通的函数作为区分@Composablefun MessageCard(name: String) {Text(text = name)}
}

  • Android Studio 可以让你在 IDE 中预览你的 Composable 函数,而不需要部署到设备上。

  • 但是有个限制, 需要预览的 Composable 函数必须不能有任何参数。因为这个限制,你不能直接预览 MessageCard() 函数。

  • 但是,你可以尝试写第一个叫 PreviewMessageCard() 的函数,它调用带有参数的 MessageCard()。在 @Composable 之前添加 @Preview 注解。
@Preview(showBackground = true)
@Composable
fun MessageCardPreview() {TestApplicationTheme {MessageCard("Hello world!!! Welcome to Compose")}
}

消息卡片的搭建

到目前为止,我们已经建立了我们的第一个 Composable 的函数和预览! 为了发现更多的 Jetpack Compose 功能,我们将构建一个简单的页面结构,其中包含可以通过一些动画展开的消息列表。

data class Message(val author: String, val body: String)// Composable 函数一般用大写开头,为了和普通的函数作为区分
@Composable
fun MessageCard(msg: Message) {Row {Text(text = msg.author)Text(text = msg.body)}
}@Preview(showBackground = true)
@Composable
fun MessageCardPreview() {TestApplicationTheme {MessageCard(msg = Message(author = "Hello Compose",body = "I am lovely-chubby"))}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/134048.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

千里共婵娟 | 结合微信公众号用JavaScript完整开发实现换中秋头像的功能

🏆作者简介,黑夜开发者,CSDN领军人物,全栈领域优质创作者✌,阿里云社区专家博主,2023年6月csdn上海赛道top4。 🏆数年电商行业从业经验,历任核心研发工程师,项目技术负责…

uni-app运行到微信开发者工具-没有打印的情况

前言 到我们进场使用微信开发者工具时,就会发现它经常会有bug,特别是在软件更新,组件库更新之后 最近在更新微信开发者工具之后发现所有打印都不显示了,虽然是小问题-但对于强迫症很烦 以为是代码配置问题-结果是更新之后打印开…

制作ubuntu18.04系统盘

文章目录 前言一、下载ubuntu18.04的iso文件二、制作u盘系统盘2、使用ultra来制作系统盘2.1、加载iso2.2、制作系统盘 前言 安装ubuntu18.04系统 一、下载ubuntu18.04的iso文件 打开下面的网址,找到自己需要的iso文件 https://releases.ubuntu.com/二、制作u盘系…

任意区域的色彩一致性处理方法

影像任意感兴趣区域的色彩一致性处理方法,主要是针对掩膜后的影像,类似下图,对非背景区域的像素进行处理 其中非黑色部分我们叫待匀色区域。 这种处理 对于wallis 和直方图匹配 很容易实现,但是颜色转移就相对而言 困难点。 颜…

解决中国科大 USTC 邮箱系统的超大附件上传的邮箱控件安装问题

USTC邮箱系统上传超过 48M 的附件的步骤: 从文件中转站上传文件,会提示下载邮箱控件 cmplugin_setup.exe ,默认安装C盘即可 2. 安装好之后依然无法上传超大文件,因为只有 IE 浏览器支持该功能,所以可以使用 Edge 浏览…

华为云云耀云服务器L实例评测|Git 私服搭建指南

前言 本文为华为云云耀云服务器L实例测评文章,测评内容是 云耀云服务器L实例 Git 私有服务器搭建指南 系统配置:2核2G 3M Ubuntu 20.04 我们平时在使用代码托管服务的时候,可能某些代码托管平台对成员有限制,或是由于内容原因会对…

Python中异常处理4-4

在Python中的异常处理4-1_棉猴的博客-CSDN博客中提到,在try块中的代码运行时如果出现异常,会自动抛出这个异常。可以通过raise语句手动抛出异常。 1 raise语句手动抛出异常 raise后面跟要抛出的异常类或者异常类的实例,表示手动抛出该异常&…

【基于Cocos Creator 3.5的赛车游戏】8.引入触摸屏幕事件并简单的控制小车

转载知识星球 | 深度连接铁杆粉丝,运营高品质社群,知识变现的工具 项目地址:赛车小游戏-基于Cocos Creator 3.5版本实现: 课程的源码,基于Cocos Creator 3.5版本实现 上一张您已经对Cocos的坐标系有了了解。这一章我们将让小车能…

Python __slots__:限制类实例动态添加属性和方法

​通过学习《Python类变量和实例变量》一节,了解了如何动态的为单个实例对象添加属性,甚至如果必要的话,还可以为所有的类实例对象统一添加属性(通过给类添加属性)。​ ​ 那么,Python 是 ​否也允许动态地…

MySQL 约束与复杂查询

当涉及到数据库管理系统(DBMS)的高级主题时,包括数据库的约束、表的设计以及各种类型的查询,特别是聚合查询、联合查询和合并查询,是非常重要的。这些主题可以帮助我们更好地理解数据库的内部工作机制以及如何有效地操…

二叉搜索树经典笔试题【力扣、牛客】

文章目录 1.根据二叉树创建字符串2. 二叉树的层序遍历3.二叉树的层序遍历Ⅱ4.二叉树的最近公共祖先1.法一:定位p、q在左还是右 分类讨论2.法二:利用stack求出p、q路径 求相交值 5.二叉搜索树与双向链表1.法一:递归:递归过程修正指…

Acwing 828. 模拟栈

Acwing 828. 模拟栈 题目要求思路讲解代码展示 题目要求 思路讲解 栈&#xff1a;先进后出 队列&#xff1a;先进先出 代码展示 #include <iostream>using namespace std;const int N 100010;int m; int stk[N], tt;int main() {cin >> m;while (m -- ){string o…

java创建excel文件和解析excel文件

创建excel文件 package com.bjpowernode.crm.poi;import org.apache.poi.hssf.usermodel.*; import org.apache.poi.ss.usermodel.HorizontalAlignment;import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.…

leetcode刷题(简单篇):9.回文数

9.回文数 题目描述&#xff1a;给你一个整数 x &#xff0c;如果 x 是一个回文整数&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 回文数是指正序&#xff08;从左向右&#xff09;和倒序&#xff08;从右向左&#xff09;读都是一样的整数。 例如&…

mybatis mapper.xml转建表语句

从网上下载了代码&#xff0c;但是发现没有DDL建表语句&#xff0c;只能自己手动创建了&#xff0c;感觉太麻烦&#xff0c;就写了一个工具类 将所有的mapper.xml放入到一个文件夹中&#xff0c;程序会自动读取生成建表语句 依赖的jar <dependency><groupId>org.d…

关于Python数据分析,这里有一条高效的学习路径

无处不在的数据分析 谷歌的数据分析可以预测一个地区即将爆发的流感&#xff0c;从而进行针对性的预防&#xff1b;淘宝可以根据你浏览和消费的数据进行分析&#xff0c;为你精准推荐商品&#xff1b;口碑极好的网易云音乐&#xff0c;通过其相似性算法&#xff0c;为不同的人…

Python中Mock和Patch的区别

前言&#xff1a; 嗨喽~大家好呀&#xff0c;这里是魔王呐 ❤ ~! python更多源码/资料/解答/教程等 点击此处跳转文末名片免费获取 在测试并行开发&#xff08;TPD&#xff09;中&#xff0c;代码开发是第一位的。 尽管如此&#xff0c;我们还是要写出开发的测试&#xff0c…

教育领域数据可视化:点亮知识之路

教育领域一直以来都在不断进步和演变&#xff0c;而数据可视化技术正在为这一领域带来一场革命。在过去的几年里&#xff0c;教育者们越来越意识到&#xff0c;通过将教育数据转化为可视化图表和图形&#xff0c;可以更好地理解学生的表现、需求和趋势&#xff0c;从而提供更好…

科学计算器网站Desmos网站

科学计算器网站Desmos网站 有时在学习工作或者生活中&#xff0c;需要用到计算问题&#xff0c;但由于电脑上没有安装相应的专业软件&#xff0c;难以计算有的问题&#xff0c;因而&#xff0c;本文推荐一种免费的在线计算网站Desmos。 一、Desmos网址 Desmos官网的地址为&a…

doccano 文本标注工具使用

最近在做面向大模型的文本标注工作&#xff0c;涉及到多人协同的问题&#xff0c;因此用到了doccano工具。 这个工具可以使用docker进行安装&#xff0c;安装之后的启动也都比较简单。 关于基础使用&#xff08;例如管理员登录、新建任务、上传数据集等&#xff09;&#xff…