Jetpack Compose 初体验(上),2024年最新技术水平真的很重要

@Composable
fun VerticalText() {
Text(“Hello World!”)
Text(“Hello Again World!”)
Text(“How old are you, World!”)
}

image-20210413003422129.png

那,就组合喽。

@Composable
fun VerticalText() {
Column {
Text(“Hello World!”)
Text(“Hello Again World!”)
Text(“How old are you, World!”)
}
}

给三个 Text 约定个竖框框,它们就能乖乖地排起队。

image-20210413005809783.png

这里,悄摸摸地说一句,这要是没有~偷瞄 Flutter 的考卷~ 向优秀的思想借鉴,我把三个 Text 布局在我脑门上!

当然,只有这么生硬的排列可不行,我们还需要加点属性,使得整个布局更和谐点——例如,加点边距。

我们希望给 Column 加一个内边距,那么我们就应该给 Column 添加一个属性。Modifier 类用来给组件添加装饰或者行为,如背景、边距、点击事件等。

@Preview(showBackground = true)
@Composable
fun VerticalText() {
Column(
modifier = Modifier.padding(16.dp)
) {
Text(“Hello World!”)
Text(“Hello Again World!”)
Text(“How old are you, World!”)
}
}

image-20210413210728702.png

现在,为了让界面看起来不那么单调,我们给这个界面加上下面这一张图片。

![](Compose 初体验.assets/hello_world_new_black.png)

将这张图片拷贝到 drawable 资源文件夹下面,然后通过下面的方式引用。

@Preview(showBackground = true)
@Composable
fun VerticalText() {
Column(
modifier = Modifier.padding(16.dp)
) {
Image(
painter = painterResource(id = R.drawable.hello_world_new_black),
contentDescription = null
)
Text(“Hello World!”)
Text(“Hello Again World!”)
Text(“How old are you, World!”)
}
}

Image 的其中一个构造函数支持以下参数,其中 painter 参数和 contentDescription 参数没有默认值,为必传参数。

image-20210420220142848.png

这样,图片就被构造出来啦,看一下效果:

image-20210420220432840.png

那怎么该对图片进行一些约束呢?作为一个头图,我不希望它这么哗众取宠,做图片要低调一点。

在上面,我们认识了 Modifier,那就寻求它的帮助,让我们的图片小一些吧。

Image(
painter = painterResource(id = R.drawable.hello_world_new_black),
contentDescription = null,
modifier = Modifier
.width(126.dp)
.height(62.dp),
contentScale = ContentScale.Inside
)

借助 Modifier 将图片的高度和宽度分别进行限定。然后通过 contentScale 参数对图片的缩放方式进行约束。ContentScale.Inside 保持图片比例不变的情况下尽可能地充满父控件的体积。

把上面的 Image 放入 preview 方法,看一下效果:

image-20210420221651702.png

现在头图就被我们拿捏得死死的,但是它还不是很好看,没脖子,加个脖子。

@Preview(showBackground = true)
@Composable
fun VerticalText() {
Column(
modifier = Modifier.padding(16.dp)
) {
Image(
painter = painterResource(id = R.drawable.hello_world_new_black),
contentDescription = null,
modifier = Modifier
.width(126.dp)
.height(62.dp),
contentScale = ContentScale.Inside
)

Spacer(modifier = Modifier.height(16.dp))

Text(“Hello World!”)
Text(“Hello Again World!”)
Text(“How old are you, World!”)
}
}

image-20210420222219906.png

这样是不是好看多了,嗯,是的。

3.Material Design

谷歌霸霸的产品当然是支持 Material Design 的,那咱就看看。

做头图不要锋芒毕露,做图处事要圆滑一点。给头图加个圆角是个不错的想法。

在 Android 传统的 UI 编写中,圆角图片一直没有很简单的解决方案,需要通过诸如自定义 ImageView 的方式来实现。但是,朋友们,当你使用 Compose 框架的时候,只需要一行代码就可以圆角图片的显示!家祭无忘告乃翁。

@Preview(showBackground = true)
@Composable
fun VerticalText() {
Column(
modifier = Modifier.padding(16.dp)
) {
Image(
painter = painterResource(id = R.drawable.hello_world_new_black),
contentDescription = null,
modifier = Modifier
.width(126.dp)
.height(62.dp)
.clip(shape = RoundedCornerShape(4.dp)),
contentScale = ContentScale.Inside
)

Spacer(modifier = Modifier.height(16.dp))

Text(“Hello World!”)
Text(“Hello Again World!”)
Text(“How old are you, World!”)
}
}

这里还是通过 Modifier 来实现需求,怎么样,现在的头图是不是圆滑可爱了很多。

image-20210420223334597.png

头图这么求上进,文字也不能落后,一篇好的文章要主次分明,错落有致。

声明 Typography 对象,然后给 Text 添加 style 属性,来控制文字的样式。

@Preview(showBackground = true)
@Composable
fun VerticalText() {
val typography = MaterialTheme.typography
Column(
modifier = Modifier.padding(16.dp)
) {
Image(
painter = painterResource(id = R.drawable.hello_world_new_black),
contentDescription = null,
modifier = Modifier
.width(126.dp)
.height(62.dp)
.clip(shape = RoundedCornerShape(4.dp)),
contentScale = ContentScale.Inside
)

Spacer(modifier = Modifier.height(16.dp))

Text(“Hello World!”, style = typography.h3)
Text(“Hello Again World!”, style = typography.body1)
Text(“How old are you, World!”, style = typography.body2)
}
}

Typography 提供如下预设属性,囊括标题、子标题、段落体、按钮等。

image-20210420225524291.png

最终效果如下:

image-20210420225406851.png

怎么样,是不是主次开始变得分明了?结构变得清晰了?情节展开得顺滑了?故事开始自然了?……

当然,其他的诸如最大行数、字体、对齐方式等都可以被配置。

二、主题

基本布局已经差不多啦,那么我们再来搞一些共性的东西,就像我们黄种人都有一样的肤色——散在土地里的黄,有种顽强,非常东方……

以前的 View 系统其实也有关于 theme 的定义,那些被定义的 style,在官方定义的一系列 theme 的基础上加以扩展,形成我们 app 的主题。

Compose 框架提供了 Material Design 的实现,Material Design Theme 自然也被应用到 Compose 中,Material Design Theme 包括了对颜色、文本样式和形状等属性的定义,咱们自定义这些属性后,包括 button、cards、switches 等控件都会相应的改变它们的默认样式。

1.颜色

颜色在前端开发中真的是无处不在了,Color 可以帮助我们快速地构建颜色模型。

你可以泡着吃:

val red = Color(0xffff0000)

可以扭着吃:

val blue = Color(red = 0f, green = 0f, blue = 1f)

欸,你还可以干吃:

val black = Color.Black

只要你喜欢,你甚至可以空翻360度加转体一周半的时候吃:

// 我不会空翻,也不会转体,期待你的表现,加油!

Compose 提供了 Colors数来创建成套的浅色或深色:

val Purple200 = Color(0xFFBB86FC)
val Purple500 = Color(0xFF6200EE)
val Purple700 = Color(0xFF3700B3)
val Teal200 = Color(0xFF03DAC5)

private val DarkColorPalette = darkColors(
primary = Purple200,
primaryVariant = Purple700,
secondary = Teal200,
onPrimary = Color.Green
)

private val LightColorPalette = lightColors(
primary = Purple500,
primaryVariant Customize= Purple700,
secondary = Teal200,
onPrimary = Color.Green

/* Other default colors to override
background = Color.White,
surface = Color.White,
onPrimary = Color.White,
onSecondary = Color.Black,
onBackground = Color.Black,
onSurface = Color.Black,
*/
)

然后,就可以传递给 MaterialTheme 使用喽:

@Composable
fun TestComposeTheme(darkTheme: Boolean = isSystemInDarkTheme(), content: @Composable() () -> Unit) {
val colors = if (darkTheme) {
DarkColorPalette
} else {
LightColorPalette
}

MaterialTheme(
colors = colors,
typography = Typography,
shapes = Shapes,
content = content
)
}

怎么样,还自动适配深色模式。

而且,我们也可以随时随地获取到主题色:

Text(
text = “Hello theming”,
color = MaterialTheme.colors.primary
)

表面颜色和内容颜色又是另一个概念了,许多组件都接受一对颜色和「内容颜色」:

Surface(
color: Color = MaterialTheme.colors.surface,
contentColor: Color = contentColorFor(color),

TopAppBar(
backgroundColor: Color = MaterialTheme.colors.primarySurface,
contentColor: Color = contentColorFor(backgroundColor),

这样一来,您不仅可以设置可组合项的颜色,而且还能为包含在可组合项中的内容提供默认颜色。默认情况下,许多可组合项都使用这种内容颜色。例如,Text 的颜色基于其父项的内容颜色,而 Icon :「俺也一样」,它可以使用该颜色来设置其色调。

contentColorFor() 方法可以为任何主题颜色检索适当的“on”颜色。例如,如果您设置 primary 背景,就会将 onPrimary 设置内容颜色。如果您设置非主题背景颜色,还应指定合理的内容颜色。使用 LocalContentColor 可检索与当前背景形成对比的当前内容颜色。

我们以上面自定义的 Theme 来试验,使用它作为我们的主题:

@Preview
@Composable
fun TestColor() {
TestComposeTheme {
Button(onClick = {}) {
Text(
“hello world”
)
}
}

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip204888 (备注Android)
img

推荐学习资料

  • Android进阶学习全套手册

  • Android对标阿里P7学习视频

  • BAT TMD大厂Android高频面试题

一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
img
5949582)]

推荐学习资料

  • Android进阶学习全套手册

    [外链图片转存中…(img-o0699jM0-1712795949583)]

  • Android对标阿里P7学习视频

    [外链图片转存中…(img-fNWkIGpn-1712795949583)]

  • BAT TMD大厂Android高频面试题

[外链图片转存中…(img-1mkqVVBj-1712795949583)]

一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
[外链图片转存中…(img-4Mni6VLK-1712795949583)]

  • 11
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值