一文带你了解 Jetpack Compose UI 框架

  • 对于类似 Button 函数的这种,提供了 onClick 函数式接口供外部设置点击监听;

  • 对于类似 Text 函数这种,没有提供显式接口设置的,通过 Modifier 类设置点击监听;

Button 函数设置点击事件

@Composable

fun TextButton() {

Button(

onClick = {

Log.d(“Andoter”, this.javaClass.name)

Toast.makeText(this@MainActivity, “Button 点击”, Toast.LENGTH_SHORT).show()

}

) {

Text(text = “Hello Compose!”, color = Color.Red)

}

}

通过设置 onClick 函数即可实现点击实现,注意 Button 函数本身没有设置文本内容,需要通过 Text 函数设置显示文本内容。

Text 函数设置点击事件

@Composable

fun ClickedText() {

val modifier = Modifier.clickable(onClick = {

Log.d(“Andoter”, this.javaClass.name)

Toast.makeText(this@MainActivity, “Button 点击”, Toast.LENGTH_SHORT).show()

})

Text(text = “Hello Compose!”,modifier = modifier.padding(10.dp))

}

通过 Modifier.clickable 的方式实现设置点击事件。Modifier 类不仅能够设置点击事件,还能够设置控件的布局属性。

  • clickable() :设置点击监听

  • padding() :在元素周围留出空间

  • fillMaxWidth() :使可组合项填充其父项给它的最大宽度

  • preferredSize() :指定元素的首选宽度和高度

2.4 预览


Compose 框架中为 Compose 函数提供预览能力,通过给 Compose 函数添加 @Preview 注解即可进行预览。在实际的开发中,预览函数不要发布到线上,所以最佳做法是单独创建不会被应用调用的预览函数用于查看实际效果,专门的预览函数可以提高性能,并且有利于以后更轻松地设置多个预览。 preview

3. 布局

======

Jetpack Compose 中一切的元素都是围绕 Compose 函数展开,所以布局也是通过对应的内置 Compose 函数实现。

3.1 ColumnRow


二者的特点:

  • Column:使元素按照竖直方向排列;

  • Row:使元素按照水平方向排列;

  • Stack:将一个元素放在另一个元素上。

这里我们以 Column 函数作为示例。

@Preview

@Composable

fun MultiText() {

Text(text = “Hello Compose!”)

Text(“Ant 学习 Compose!”)

}

@Preview

@Composable

fun ColumnText() {

Column {

Text(text = “Hello Compose!”)

Text(“Ant 学习 Compose!”)

}

}

通过 Column 可将组件按照竖直方向排列,预览效果对比:

column

3.2 ScrollableRowScrollableColumn


使用 ScrollableRowScrollableColumn 可使 RowColumn 内的元素滚动。

@Composable

fun ProductList() {

ScrollableColumn(Modifier.fillMaxSize()) {

listOf(“Ant”, “Andoter”, “小伟”).forEach { value ->

ProductDetailView(value)

}

}

}

@Composable

fun ProductDetailView(text: String) {

val image = imageResource(id = R.drawable.header)

Column(modifier = Modifier.padding(16.dp)) {

val imageModifier = Modifier

.preferredHeight(180.dp)

.clip(shape = RoundedCornerShape(5.dp))

.fillMaxWidth()

.clickable(onClick = {

Log.d(“Ant”, “click”);

})

Image(image, modifier = imageModifier, contentScale = ContentScale.Crop)

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

Text(“Hello Compose!”)

}

}

scroll_column

4. Compose 界面结构

==================

通过上面的介绍,对 Compose 有了一个初步的认识,那么 Compose 函数如何绘制在屏幕上的呢?以什么样的形式展示的呢?我们使用 Layout Inspector 工具查看一个 Compose 页面。

layer

通过左侧的布局结构可以发现,Compose 框架中已经废弃原有的 View 体系中的控件(TextViewButtonImageView 等),而是使用 AndroidComposeView(继承 ViewGroup)、ViewLayerContainer(继承 ViewGroup)和 ViewLayer(继承 View) 控件实现,其中 ViewLayer 代表每个 View 控件视图。

查看 ViewLayer 的调用关系,可以得到视图的生成关系:LayerWrapperAndroidComposeView -> ViewLayerviewnode

5. Compose 对业务的影响

====================

Jetpack Compose 是一个适用于 Android 的新式声明性界面工具包,同时点击监听的设置方式也发生较大变化,那么对于我来说,最直观的业务影响是无法继续使用原有的插码技术进行点击事件的采集。这块需要进行调研适配。

上面提到设置点击的两种方式,本质上都是通过 Modifier 进行实现,来看下面的一个例子。

@Composable

fun ClickedText() {

val modifier = Modifier.clickable(onClick = {

Log.d(“Andoter”, this.javaClass.name)

Toast.makeText(this@MainActivity, “Button 点击”, Toast.LENGTH_SHORT).show()

})

Text(text = “Hello Compose!”, modifier = modifier.padding(10.dp))

}

通过 Modifier 给一个 Text 设置点击监听,在点击的时候弹出一个 Toast。反编译看看最后的实现。

/* access modifiers changed from: package-private */

@Metadata(mo23161bv = {1, 0, 3}, mo23164k = 3, mo23165mv = {1, 4, 0})

/* compiled from: MainActivity.kt */

public final class MainActivity$TextButton$1$1 extends Lambda implements Function0 {

private final /* synthetic */ MainActivity $this;

/* JADX INFO: super call moved to the top of the method (can break code semantics) */

MainActivity$TextButton$1$1(MainActivity mainActivity) {

super(0);

this.$this = mainActivity;

}

@Override // kotlin.jvm.functions.Function0

public final void invoke() {

Log.d(LiveLiterals M a i n A c t i v i t y K t . I N S T A N C E . m o 17059 x 27 d b 7 f d e ( ) , t h i s . MainActivityKt.INSTANCE.mo17059x27db7fde(), this. MainActivityKt.INSTANCE.mo17059x27db7fde(),this.this.getClass().getName());

Toast.makeText(this. t h i s , L i v e L i t e r a l s this, LiveLiterals this,LiveLiteralsMainActivityKt.INSTANCE.mo17064x88044b3e(), 0).show();

最后

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

深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助

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

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点!不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
转存中…(img-MfdkuJSl-1715807580263)]

[外链图片转存中…(img-eldQxYZs-1715807580264)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点!不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值