Kotlin and Compose

概念

  • Compose是谷歌为了简化界面开发,而推出的一个工具包,核心原理是响应式编程
  • 需要使用Kotlin来编写代码
  • 声明式界面框架
  • 通过调用一系列函数来生成UI框架
  • 当数据更新的时候,通过重新调用函数以实现UI的增量刷新和重构

更新状态来更新UI

  • UI状态的更新导致其他UI状态的更新称之为UI重组
  • 使用@Composable注解将代码转换为UI,我们将其称之为组合函数
  • 可重用的垂直排列列表(好处:可以根据传入的数据来动态生成各种UI,也就是我们将通过数据来驱动UI的高效生成)

空视图展示将尤为简单和轻松

  • UI交互与数据更新双向驱动,将变得尤为简单
  • 如下代码所示:UI的选中或者不选中的状态根据answer的值来决定,选中之后,则反向驱动answer的值保存到list以便于完成数据更新
  • MutableState和rememberState实现

mutableStateOf表示让Compose去关注某个值,当值改变的时候去自动刷新UI,需要配合remember关键字使用,意思就是每次UI重组的时候不需要每次都去重新初始化该值,而是使用上次修改过的值

kotlin 复制代码
@Composable
fun Greeting(name: String, modifier: Modifier = Modifier) {

    // 记住该值 关注该值 用于后续该值变化过后执行UI重组  
    var expanded = remember { mutableStateOf(false) }

    Box(modifier = Modifier.padding(
        horizontal = 8.dp,
        vertical = 4.dp
    ).background(color = Color.Red)
    ) {
        Row(modifier = Modifier.padding(24.dp)){
            Column (modifier = Modifier
                .weight(1f)
            ){
                Text(
                    text = "Hello!",
                    color = Color.White,
                )
                Text(
                    text = "$name!",
                    color = Color.White,
                )
            }
            OutlinedButton(onClick = {
                expanded.value = !expanded.value
            },
                colors = ButtonDefaults.outlinedButtonColors(
                    containerColor = Color.White // 设置按钮的背景颜色为白色
                )
            ) {
                Text(text = if(expanded.value) "Show less" else "show more", color = Color.Cyan)
            }
        }

    }
}
  • 通过以上的方法即可实现各种组合的UI以及可动态更新的重用UI组件:我们称之为可组合UI函数

一行代码为文本添加渐变背景色、圆角、内边距

kotlin 复制代码
@Composable
fun Greeting(name: String, modifier: Modifier = Modifier) {
    Text(
        text = "Hello $name!",
        color = Color.White,
        modifier = modifier
//            .background(Color.Red, shape = RoundedCornerShape(10.dp))
            .background(
                brush = Brush.verticalGradient(
                colors = listOf(Color.Red, Color.Green) // 渐变色从红色到绿色
                ), shape = RoundedCornerShape(10.dp))
            .padding(16.dp)
    )
}
  • 代码提取和代码重构以增加代码的可读性

使用Column、Row、Box容器编写各种强大的UI组件

  • 在 Jetpack Compose 中,可组合函数可以接受一个 "modifier" 参数,用于对该组件进行各种属性和行为的修饰。
  • 修饰符可以改变组件的大小、颜色、形状、布局行为等多个方面
  • "Modifier.fillMaxSize ()" 是一个预定义的修饰符函数,它的作用是让当前组件填充其父布局的最大可用空间。

LazyColumn 和 LazyRow 相当于 Android View 中的 RecyclerView

  • 渲染一个1000元素的RV
kotlin 复制代码
import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.lazy.items
// ...

@Composable
private fun Greetings(
    modifier: Modifier = Modifier,
    names: List<String> = List(1000) { "$it" }
) {
    LazyColumn(modifier = modifier.padding(vertical = 4.dp)) {
        items(items = names) { name ->
            Greeting(name = name)
        }
    }
}
  • 请确保导入 androidx.compose.foundation.lazy.items,因为 Android Studio 默认会选择另一个 items 函数。

使用rememberSaveable代替remember以防止屏幕旋转之后视图的状态丢失导致UI被重置

使用animateDpAsState实现展开折叠动画

kotlin 复制代码
val extraPadding by animateDpAsState(if (expanded) 48.dp else 0.dp, label = "")

设置应用的样式和主题

相关推荐
拭心3 小时前
Google 提供的 Android 端上大模型组件:MediaPipe LLM 介绍
android
带电的小王6 小时前
WhisperKit: Android 端测试 Whisper -- Android手机(Qualcomm GPU)部署音频大模型
android·智能手机·whisper·qualcomm
梦想平凡6 小时前
PHP 微信棋牌开发全解析:高级教程
android·数据库·oracle
元争栈道6 小时前
webview和H5来实现的android短视频(短剧)音视频播放依赖控件
android·音视频
阿甘知识库7 小时前
宝塔面板跨服务器数据同步教程:双机备份零停机
android·运维·服务器·备份·同步·宝塔面板·建站
元争栈道8 小时前
webview+H5来实现的android短视频(短剧)音视频播放依赖控件资源
android·音视频
MuYe8 小时前
Android Hook - 动态加载so库
android
居居飒9 小时前
Android学习(四)-Kotlin编程语言-for循环
android·学习·kotlin
Henry_He12 小时前
桌面列表小部件不能点击的问题分析
android
工程师老罗12 小时前
Android笔试面试题AI答之Android基础(1)
android