Jetpack Compose Basic

Compose 简介

Jetpack Compose 是用于构建 Android 界面的新工具包

Compose 使用更少的代码、强大的工具和直观的 Kotlin 功能,可以帮助您简化并加快 Android 界面开发。借助 Compose,您可以通过定义一组函数来构建界面,这些函数称为可组合函数,它们会接受数据并发出界面元素。

Compose 函数

带有 @Composable 注解的 Kotlin 函数是 Compose 函数 在 Compose 中,可组合函数是界面的基本构建块。 可组合函数特点:

  • 描述界面中的某一部分。
  • 不会返回任何内容
  • 接受一些输入并生成屏幕上显示的内容。
  • 可能会发出多个界面元素。
kotlin 复制代码
@Composable
private fun Greeting(name: String) {
   Text(text = "Hello $name!")
}
  • 此函数不会返回任何内容。用于发出界面的可组合函数无需返回任何内容,因为它们描述所需的屏幕状态,而不是构造界面元素。换言之,可组合函数只描述界面而不构造或创建界面,因此没有要返回的内容。

Compose 函数命名规范

  • 必须是名词:DoneButton()
  • 不能是动词或动词短语:DrawTextField()
  • 不能是名词性介词:TextFieldWithLink()
  • 不能是形容词:Bright()
  • 不能是副词:Outside()
  • 名词可以添加描述性形容词作为前缀:RoundIcon()

详见 Compose 函数命名规范

Compose UI 组件

Column & Row

如需在 Row 中设置子元素的位置,请设置 horizontalArrangementverticalAlignment 实参。

对于 Column,请设置 verticalArrangementhorizontalAlignment 实参。

记忆技巧:

Row : horizontalArrangement 指定水平摆放位置;

verticalAlignment 指定竖直位置,比如竖直居中

Column verticalArrangement

Column 的大小大于其子元素大小的总和时,可以指定 verticalArrangement 来定义 Column 中的子元素的排列方式。下图显示了不同的垂直排列方式:

同样地,当 Row 的大小大于其子元素大小的总和时,可以指定 horizontalArrangement 来定义 Row 中的子元素的排列方式。下图显示了不同的水平排列方式:

Text 水平位置

kotlin 复制代码
@Composable
fun GameStatus(modifier: Modifier = Modifier) {
    Row(
        modifier = modifier
            .fillMaxWidth()
            .padding(16.dp)
            .size(48.dp),
    ) {
        Text(
            modifier = Modifier
                .fillMaxWidth()
                // 在行末尾
                .wrapContentWidth(Alignment.End),
            text = stringResource(R.string.score, 0),
            fontSize = 18.sp,
        )
    }
}

LazyVerticalGrid 竖直网格

kotlin 复制代码
@Composable
fun TopicGrid(modifier: Modifier = Modifier) {
    LazyVerticalGrid(
        // 两列
        columns = GridCells.Fixed(2),
        // 竖直间隔 8dp
        verticalArrangement = Arrangement.spacedBy(8.dp),
        // 水平间隔 8dp
        horizontalArrangement = Arrangement.spacedBy(8.dp),
        // grid 四边边距 8dp
        modifier = modifier.padding(8.dp)
    ) {
        items(DataSource.topics) { topic ->
            TopicCard(topic)
        }
    }
}

Icon vs. Image

圆形图片

RoundedCornerShape

kotlin 复制代码
@Composable
fun DogIcon(@DrawableRes dogIcon: Int, modifier: Modifier = Modifier) {
    Image(
        modifier = modifier
            .size(64.dp)
            .padding(8.dp)
            // 圆形 
            .clip(RoundedCornerShape(percent = 50)),
        painter = painterResource(dogIcon),
        // 剪裁
        contentScale = ContentScale.Crop,
        contentDescription = null
    )
}

TIPS:

kotlin 复制代码
@Composable
fun DiceWithButtonAndImage(modifier: Modifier = Modifier) {
}

既然有默认值,为什么还要传递 Modifier 实参。原因在于可组合项可能会进行重组,这实质上意味着 @Composable 方法中的代码块会再次执行。**如果在代码块中创建了 Modifier 对象,系统可能会重新创建该对象,并且这种方式效率不高。

仅可在 RowScopeColumnScope 中使用的 weight 修饰符,不然会出现无法导包的情况;

API 列表

  • Layout

    • Card
    • Box
    • LazyVerticalGrid
    • LazyHorizontalGrid
    • Column
    • Row
    • BoxWithConstraints
    • FlowRow
    • FlowColumn
  • Button

    • FilledIconToggleButton
    • IconToggleButton
    • TextButton
  • Text

    • Text
  • Progress

    • CircularProgressIndicator
  • 框架

    • HorizontalPager libs:com.google.accompanist:accompanist-pager
    • Scaffold
  • 其他

    • SelectionContainer

文档参考:

horizontalArrangement 取值

Jetpack Compose FlowColumn与FlowRow瀑布流布局

相关推荐
崔庆才丨静觅7 小时前
hCaptcha 验证码图像识别 API 对接教程
前端
passerby60618 小时前
完成前端时间处理的另一块版图
前端·github·web components
掘了8 小时前
「2025 年终总结」在所有失去的人中,我最怀念我自己
前端·后端·年终总结
崔庆才丨静觅8 小时前
实用免费的 Short URL 短链接 API 对接说明
前端
崔庆才丨静觅9 小时前
5分钟快速搭建 AI 平台并用它赚钱!
前端
崔庆才丨静觅9 小时前
比官方便宜一半以上!Midjourney API 申请及使用
前端
Moment9 小时前
富文本编辑器在 AI 时代为什么这么受欢迎
前端·javascript·后端
崔庆才丨静觅9 小时前
刷屏全网的“nano-banana”API接入指南!0.1元/张量产高清创意图,开发者必藏
前端
剪刀石头布啊9 小时前
jwt介绍
前端
爱敲代码的小鱼9 小时前
AJAX(异步交互的技术来实现从服务端中获取数据):
前端·javascript·ajax