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瀑布流布局

相关推荐
子兮曰1 天前
jev-ultrafast 深度解析:7 秒订机票的浏览器 Agent 是如何炼成的
前端·后端·agent
子兮曰1 天前
Jev 爆发一周:7 秒 Agent 背后的 System One 生态与三场争议
前端·后端·ai编程
前端小万1 天前
写公众号赚了 3000 块后,我做了一款叫 "一键成稿" 的软件
前端·微信小程序
爱勇宝1 天前
ZCode 开源 24 小时:一份没有历史的账本,回答不了"有没有偷代码"
前端·后端·chatglm (智谱)
三十而立洋1 天前
Cookie 详解:从产生到安全,一次讲透
前端·javascript
卡布鲁1 天前
把一个 Vite + Vue3 应用塞进 qiankun (React + Umi3) 主站:十个坑的复盘
前端·javascript·react.js
汉堡大王95272 天前
Jev:不是聊天机器人, 而是一个智能 if 语句
前端·人工智能·后端
梦想很大很大2 天前
从运行事实到回归证据:Workrun 的 Telemetry 与 Evaluation 实践
前端·人工智能·后端
计算机魔术师2 天前
Meta Muse agent 接入 Shopify 的 Shop Pay 实现代理式购物
前端
沙蒿同学2 天前
我用 Go 搭了一条 AI Agent 流水线:从 1 张商品图到一整套淘宝详情页
前端·javascript·后端