原创_Android Jetpack Compose 最全上手指南,互联网寒冬公司倒闭后
声明式 UI 框架近年来飞速发展,并且被 Web 开发带向高潮。React 更是为声明式 UI 奠定了坚实基础并一直引领其未来的发展。随后 Flutter 的发布也将声明式 UI 的思想成功带到移动端开发领域…
声明式UI的意思就是,描述你想要一个什么样的UI界面,状态变化时,界面按照先前描述的重新“渲染”即可得到状态绝对正确的界面,而不用像命令一样,告诉程序一步一步该干什么,维护各种状态。扯远了,这个并不是今天文章的重点,稍微了解一下就好,其他的就不在本文延伸。关于声明式的更多介绍,建议看看这篇文章:zhuanlan.zhihu.com/p/68275232
我们回到本文的重点Jetpack Compose。
二、Jetpack Compose 介绍
Jetpack Compose 是一个用于构建原生Android UI 的现代化工具包,它基于声明式的编程模型,因此你可以简单地描述UI的外观,而Compose则负责其余的工作-当状态发生改变时,你的UI将自动更新。由于Compose基于Kotlin构建,因此可以与Java编程语言完全互操作,并且可以直接访问所有Android和Jetpack API。它与现有的UI工具包也是完全兼容的,因此你可以混合原来的View和现在新的View,并且从一开始就使用Material和动画进行设计。
三、Jetpack Compose 环境准备和Hello World
每当我们学习一门新的语言,我们都是从一个hello world
开始,今天我们也从一个hello world
来开始Jetpack Compose 吧! 要想获得Jetpack Compose 的最佳体验,我们需要下载最新版本的Android Studio 预览版本(即Android Studio 4.0)。因为Android Studio 4.0 添加了对Jetpack Compose 的支持,如新的Compose 模版和Compose 及时预览。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NFDbn5sN-1638176762409)(https://user-gold-cdn.xitu.io/2019/11/18/16e7cdb8ae434097?imageView2/0/w/1280/h/960/ignore-error/1)]
使用Jetpack Compose 来开始你的开发工作有2种方式:
- 将Jetpack Compose 添加到现有项目
- 创建一个支持Jetpack Compose的新应用
接下来分别介绍一下这两种方式。
1. 将Jetpack Compose 添加到现有项目
如果你想在现有的项目中使用Jetpack Compose,你需要配置一些必须的设置和依赖:
(1)gradle 配置
在app目录下的build.gradle
中将app支持的最低API 版本设置为21或更高,同时开启Jetpack Compose enable
开关,代码如下:
android {
defaultConfig {
…
minSdkVersion 21
}
buildFeatures {
// Enables Jetpack Compose for this module
compose true
}
…
// Set both the Java and Kotlin compilers to target Java 8.
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
kotlinOptions {
jvmTarget = “1.8”
}
}
(2) 使用试验版Kotlin-Gradle
插件
Jetpack Compose 需要试验版的Kotlin-Gradle
插件,在根目录下的build.gradle
添加如下代码:
buildscript {
repositories {
google()
jcenter()
// To download the required version of the Kotlin-Gradle plugin,
// add the following repository.
maven { url ‘https://dl.bintray.com/kotlin/kotlin-eap’ }
…
dependencies {
classpath ‘com.android.tools.build:gradle:4.0.0-alpha01’
classpath ‘org.jetbrains.kotlin:kotlin-gradle-plugin:1.3.60-eap-25’
}
}
allprojects {
repositories {
google()
jcenter()
maven { url ‘https://dl.bintray.com/kotlin/kotlin-eap’ }
}
}
(3) 添加Jetpack Compose工具包依赖项
在app目录下的build.gradle
添加Jetpack Compose 工具包依赖项,代码如下:
dependencies {
// You also need to include the following Compose toolkit dependencies.
implementation ‘androidx.ui:ui-tooling:0.1.0-dev02’
implementation ‘androidx.ui:ui-layout:0.1.0-dev02’
implementation ‘androidx.ui:ui-material:0.1.0-dev02’
…
}
ok,到这儿准备工作就完毕,就可以开始写代码了,但是前面说了,还有一种方式接入Jetp
《Android学习笔记总结+最新移动架构视频+大厂安卓面试真题+项目实战源码讲义》
【docs.qq.com/doc/DSkNLaERkbnFoS0ZF】 完整内容开源分享
ack Compose ,我们来一起看看。
2. 创建一个支持Jetpack Compose的新应用
比起在现有应用中接入Jetpack Compose ,创建一个支持Jetpack Compose 的新项目则简单了许多,因为Android Studio 4.0 提供了一个新的Compose 模版,只要选择这个模版创建应用,则所有上面的那些配置项都自动帮我们完成了。
创建一个支持Jetpack Compose 的应用,如下几个步骤就可以了:
- 如果你在Android Studio的欢迎窗口,点击
Start a new Android Studio project
,如果你已经打开了Android Studio 项目,则在顶部菜单栏选择File > New > New Project
- 如果你在Android Studio的欢迎窗口,点击
- 在
Select a Project Template
窗口,选择Empty Compose Activity
并且点击下一步
- 在
- 在
Configure your project
窗口,做如下几步:
- 在
a. 设置
项目名称
,包名
和保存位置
b. 注意,在语言下来菜单中,Kotlin 是唯一一个可选项,因为Jetpack Compose 只能用Kotlin来写的才能运行。
c.
Minimum API level
下拉菜单中,选择21或者更高- 点击
Finish
- 点击
现在,你就可以使用Jetpack Compose 来编写你的应用了。
3. Hello wold
在MainActivity.kt
中添加如下代码:
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContent {
Text(“Hello, Android技术杂货铺”)
}
}
}
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kP9Vu7L5-1638176762441)(https://user-gold-cdn.xitu.io/2019/11/18/16e7cdb8b0567bea?imageView2/0/w/1280/h/960/ignore-error/1)]
Jetpack Compose是围绕composable
函数来构建的。这些函数使你可以通过描述应用程序的形状和数据依赖,以编程方式定义应用程序的UI,而不是着眼于UI的构建过程。要创建composable
函数,只需要在函数名前面加上一个@composable
注解即可, 上面的Text
就是一个composable
函数。
4. 定义一个composable
函数
一个composable
函数只能在另一个composable
函数的作用域里北调用,要使一个函数变为composable
函数,只需在函数名前加上@composable
注解,我们把上面的代码中,setContent
中的部分移到外面,抽取到一个composable函数中,然后传递一个参数name
给 text
元素。
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContent {
Greeting(“Android技术杂货铺”)
}
}
}
@Composable
fun Greeting(name: String) {
Text(text = “Hello $name!”)
}
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-z9z8uR1l-1638176762443)(https://user-gold-cdn.xitu.io/2019/11/18/16e7cdb8b0c73af6?imageView2/0/w/1280/h/960/ignore-error/1)]
四、布局
UI元素是分层级的,元素包含在其他元素中。在Jetpack Compose中,你可以通过从其他composable
函数中调composable
函数来构建UI层次结构。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BdKYvGGq-1638176762443)(https://user-gold-cdn.xitu.io/2019/11/18/16e7cdb8b17ee5cf?imageView2/0/w/1280/h/960/ignore-error/1)]
在Android的xml
布局中,如果要显示一个垂直结构的布局,最长用的就是LinearLayout
, 设置android:orientation
值为vertical
, 子元素就会垂直排列,那么,在Jetpack Compose 中,如何来实现垂直布局呢?先添加几个Text
来看一下。
1. 添加多个Text
在上面的例子中,我们添加了一个Text
显示文本,现在我们添加三个文本,代码如下:
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContent {
NewsStory()
}
}
}
@Composable
fun NewsStory() {
Text(“我超❤️JetPack Compose的!”)
Text(“Android技术杂货铺”)
Text(“依然范特西”)
}
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VKjBEIRl-1638176762444)(https://user-gold-cdn.xitu.io/2019/11/18/16e7cdb8b493a133?imageView2/0/w/1280/h/960/ignore-error/1)]
从上图可以看到,我们添加了3个文本,但是,由于我们还没有提供有关如何排列它们的任何信息,因此三个文本元素相互重叠绘制,使得文本不可读。
2. 使用Column
要使重叠绘制的Text
文本能够垂直排列,我们就需要使用到Column
函数,写过flutter的同学看起来是不是很眼熟?是的,跟flutter里面的Column Widget 名字和功能完全一样,甚至连他们的属性都一摸一样。
@Composable
fun NewsStory() {
Column { // 添加Column,使布局垂直排列
Text(“我超❤️JetPack Compose的!”)
Text(“Android技术杂货铺”)
Text(“依然范特西”)
}
}
效果如下:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sZVgFwWr-1638176762445)(https://user-gold-cdn.xitu.io/2019/11/18/16e7cdb8e1fdf3e6?imageView2/0/w/1280/h/960/ignore-error/1)]
可以看到,前面重叠的布局,现在已经垂直排列了,但是,默认情况下,从左上角开始,一个接一个的排列,没有任何间距。接下来,我们给Column
设置一些样式。
3. 给Column
添加样式
在调用Column()
时,可以传递参数给Column()
来配置Column
的大小、位置以及设置子元素的排列方式。
@Composable
fun NewsStory() {
Column (
crossAxisSize = LayoutSize.Expand,
modifier = Spacing(16.dp)
){ // 添加Column,使布局垂直排列
Text(“我超❤️JetPack Compose的!”)
Text(“Android技术杂货铺”)
Text(“依然范特西”)
}
}
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IctyaX7n-1638176762446)(https://user-gold-cdn.xitu.io/2019/11/18/16e7cdb8e23d6a12?imageView2/0/w/1280/h/960/ignore-error/1)]
如上图所示,我们填充了padding,其他效果几乎一摸一样, 上面代码中的设置属性解释如下:
crossAxisSize
: 指定Column
组件(注:Compose中,所有的组件都是composable函数,文中的组件都是指代composable函数
)在水平方向的大小,设置crossAxisSize
为LayoutSize.Expand
即表示Column宽度应为其父组件允许的最大宽度,相当于传统布局中的match_parant
,还有一个值为LayoutSize.Wrap
,看名字就知道,包裹内容,相当于传统布局中的wrap_content
。modifier:
使你可以进行其他格式更改。在这种情况下,我们将应用一个Spacing
修改器,该设置将Cloumn
与周围的视图产生间距。
4. 如何显示一张图片?
在原来的安卓原生布局中,显示图片有相应的控件ImageView
,设置本地图片地址或者Bitmap
就能展示,在Jetpack Compose 中该如何显示图片呢?
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zej97LZ4-1638176762446)(https://user-gold-cdn.xitu.io/2019/11/18/16e7cdb8e4573b58?imageView2/0/w/1280/h/960/ignore-error/1)]
我们先下载这张图片到本地,添加到资源管理器中,命名为header.png
, 我们更改一下上面的NewsStory ()
方法,先从资源文件夹获取图片image,然后通过DrawImage()
将图片绘制出来:
@Composable
fun NewsStory() {
// 获取图片
val image = +imageResource(R.mipmap.header)
Column (
crossAxisSize = LayoutSize.Expand,
modifier = Spacing(16.dp)
){ // 添加Column,使布局垂直排列
// 显示图片
DrawImage(image)
Text(“我超❤️JetPack Compose的!”)
Text(“Android技术杂货铺”)
Text(“依然范特西”)
}
}
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DJm2gKch-1638176762447)(https://user-gold-cdn.xitu.io/2019/11/18/16e7cdb8e639450a?imageView2/0/w/1280/h/960/ignore-error/1)]
可以看到,图片不会按正确的比列显示,接下来,我们来修复它。
图片已添加到布局中,但会展开以填充整个视图,并和文本是拼叠排列,文字显示在上层。要设置图形样式,请将其放入Container
(又一个和flutter中一样的控件)
Container
: 一个通用的内容对象,用于保存和安排其他UI元素。然后,你可以将大小和位置的设置应用于容器。
@Composable
fun NewsStory() {
// 获取图片
val image = +imageResource(R.mipmap.header)
Column (
crossAxisSize = LayoutSize.Expand,
modifier = Spacing(16.dp)
){ // 添加Column,使布局垂直排列
// 放在容器中,设置大小
Container(expanded = true, height = 180.dp) {
// 显示图片
DrawImage(image)
}
Text(“我超❤️JetPack Compose的!”)
Text(“Android技术杂货铺”)
Text(“依然范特西”)
}
}
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7d1xxTbE-1638176762448)(https://user-gold-cdn.xitu.io/2019/11/18/16e7cdb8f0f185c1?imageView2/0/w/1280/h/960/ignore-error/1)]
expanded :
指定Container的大小,默认是false
(Container的大小是子组件的大小,相当于wrap_content
),如果将它设置为true
,就指定Container的大小为父控件所允许的最大size, 相当于match_parent
。height :
设置Container容器的高度,height
属性的优先级高于expanded
,因此会覆盖expanded
,如上面的例子,设置height
为180dp
,也就是容器宽为父控件宽度,高为180dp
5. 添加间距Spacer
我们看到,图片和文本之间没有间距,传统布局中,我们可以添加Margin
属性,设置间距,在Jetpack Compose 中,我们可以使用HeightSpacer()
和WidthSpacer()
来设置垂直和水平间距
HeightSpacer(height = 20.dp) //设置垂直间距20dp
WidthSpacer(width = 20.dp) // 设置水平间距20dp
在上面的例子中,我们来为图片和文本之间添加20dp
的间距:
@Composable
fun NewsStory() {
// 获取图片
val image = +imageResource(R.mipmap.header)
Column (
crossAxisSize = LayoutSize.Expand,
modifier = Spacing(16.dp)
){ // 添加Column,使布局垂直排列
// 放在容器中,设置大小
Container(expanded = true, height = 180.dp) {
// 显示图片
DrawImage(image)
}
HeightSpacer(height = 20.dp) // 添加垂直方向间距20dp
Text(“我超❤️JetPack Compose的!”)
Text(“Android技术杂货铺”)
Text(“依然范特西”)
}
}
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EG5yZ5p4-1638176762448)(https://user-gold-cdn.xitu.io/2019/11/18/16e7cdb90b5d9976?imageView2/0/w/1280/h/960/ignore-error/1)]
五、使用Material design 设计
Compose 旨在支持Material Design 设计原则,许多组件都实现了Material Design 设计,可以开箱即用,在这一节中,将使用一些Material小组件来对app进行样式设置
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hiC8mUac-1638176762449)(https://user-gold-cdn.xitu.io/2019/11/18/16e7cdb913ecd34d?imageView2/0/w/1280/h/960/ignore-error/1)]
1. 添加Shape
样式
Shape
是Material Design 系统中的支柱之一,我们来用clip
函数对图片进行圆角裁剪。
@Composable
fun NewsStory() {
// 获取图片
val image = +imageResource(R.mipmap.header)
Column (
crossAxisSize = LayoutSize.Expand,
modifier = Spacing(16.dp)
){ // 添加Column,使布局垂直排列
// 放在容器中,设置大小
Container(expanded = true, height = 180.dp) {
Clip(shape = RoundedCornerShape(10.dp)) {
// 显示图片
DrawImage(image)
}
hape是Material Design 系统中的支柱之一,我们来用
clip`函数对图片进行圆角裁剪。
@Composable
fun NewsStory() {
// 获取图片
val image = +imageResource(R.mipmap.header)
Column (
crossAxisSize = LayoutSize.Expand,
modifier = Spacing(16.dp)
){ // 添加Column,使布局垂直排列
// 放在容器中,设置大小
Container(expanded = true, height = 180.dp) {
Clip(shape = RoundedCornerShape(10.dp)) {
// 显示图片
DrawImage(image)
}
原创_Android Jetpack Compose 最全上手指南,互联网寒冬公司倒闭后相关推荐
- 原创|Android Jetpack Compose 最全上手指南
在今年的Google/IO大会上,亮相了一个全新的 Android 原生 UI 开发框架-Jetpack Compose, 与苹果的SwiftIUI一样,Jetpack Compose是一个声明式的U ...
- (转)Android Jetpack Compose 最全上手指南
在今年的Google/IO大会上,亮相了一个全新的 Android 原生 UI 开发框架-Jetpack Compose, 与苹果的SwiftIUI一样,Jetpack Compose是一个声明式的U ...
- Android Jetpack Compose 最全上手指南 | 开发者说·DTalk
本文原作者: 码农西哥,原文发布于微信公众号: Android 技术杂货铺 https://mp.weixin.qq.com/s/7tKv_RamfW0rG8tZHXH_rg 在 2019 年的 G ...
- 互联网寒冬公司倒闭后,最全Android知识总结
前言 2020年过去了,很久之前就希望自己可以潜心研究源码,研究技术,但是空闲时间不是看电影,就是玩游戏都没有认真看技术方面的东西感觉很内疚,今年一定要好好的研究端正态度,认真学习技术. 核心分析内容 ...
- Android原生UI开发框架 《Jetpack Compose入门到精通》最全上手指南
前言 在去年的Google/IO大会上,亮相了一个全新的 Android 原生 UI 开发框架-Jetpack Compose, 与苹果的SwiftIUI一样,Jetpack Compose是一个声明 ...
- 原创|我为什么不建议你等公司倒闭后,再找工作!
大家好,我是涩郎,一名「知识挖掘师」兼「知识布道师」. 今天我们聊个好玩的案例. 面试案例 我给大家讲一个很有意思的招聘案例.有一个朋友,他碰到了一个各方面都非常优秀的人,打心眼儿里想要把他招过来,但 ...
- Android 开发新技术:Jetpack Compose当仁不让
前言 Jetpack Compose是用于构建原生Android 界面的新款工具包. 平时我们开发Android界面都是靠XML画出来,但是Compose 则是用代码来写界面,和Flutter写法有点 ...
- 重磅首发!Jetpack Compose 完全开发手册,从入门到精通!
前 言 Jetpack 架构组件 及 标准化开发模式 的确立,意味着 Android 开发已步入成熟阶段.现在的Android岗招人的时候也非常看重应试者对 Jetpack 架构组件的理解程度. 今天 ...
- 告别XML,Android新声明式UI框架《Jetpack Compose入门到精通》最全开发指南
什么是Jetpack Compose? Jetpack Compose是Android的新声明式UI框架.长期以来, Android 开发人员习惯于使用带有状态视图的xml编写UI,这些状态视图通过逐 ...
最新文章
- 第一个Sprint冲刺第十天
- springboot-异常处理使用与原理解析
- 服务器端利器--双缓冲队列
- css中实现div的显示和隐藏
- java ftp 读取 txt文件_java通过ftp方式读取文件,并解析入库
- linux 使用 cp 命令强制覆盖功能
- sonar 6.2 安装配置properties文件
- 55种网页常用小技巧(转载)
- mvc2 mvc_每个人都知道MVC…
- 记得把每一次面试当做经验积累,深夜思考
- 百度CDN与360CDN简单评测,果断选择百度CDN
- corn java 可配置_定时任务工具——CronUtil
- CentOS 7第一次使用时的基础配置
- HR-Former | 随迟但到,HRNet+Transformer轻装归来(非常值得学习!!!)
- 锐起无盘工作站网卡配置
- python文字转语音
- 中小制造型企业如何成功实施5S管理?
- Python3+PCAN-USB基于PCAN-Basic二次开发实现上位机功能
- java求一元二次方程:ax2+bx+c=0的根
- 天使投资人如何评估创业公司价值