当前位置: 首页 > news >正文

【JetPack Compose】列表和动画

JetPack Compose学习笔记

B站视频地址:

一次搞定 Jetpack Compose,优先获得择偶权,更新中_哔哩哔哩_bilibili

对应视频选集 P6-P8

实际这些来自于官方的教程:

Android Compose 教程  |  Android 开发者  |  Android Developers

创建消息列表

只包含一条消息的聊天会略显孤单,因此请更改对话,使其包含多条消息。您需要创建一个可显示多条消息的 Conversation 函数。对于此用例,请使用 Compose 的 LazyColumn 和 LazyRow。这些可组合项只会呈现屏幕上显示的元素,因此,对于较长的列表,使用它们会非常高效。

在此代码段中,您可以看到 LazyColumn 包含一个 items 子项。它接受 List 作为参数,并且其 lambda 会收到我们命名为 message 的参数(可以随意为其命名),该参数是 Message 的实例。简而言之,系统会针对提供的 List 的每个项调用此 lambda。将此示例数据集导入您的项目,以便快速引导对话。

    @Composable
    fun Conversation(message: List<Message>){
        LazyColumn(){
            items(message){message ->
                MessageCard(message)
            }

        }
    }

在展开消息时显示动画效果

对话变得更加有趣了。是时候添加动画效果了!您将添加展开消息以显示更多内容的功能,同时为内容大小和背景颜色添加动画效果。为了存储此本地界面状态,您需要跟踪消息是否已展开。为了跟踪这种状态变化,您必须使用 remember 和 mutableStateOf 函数。

可组合函数可以使用 remember 将本地状态存储在内存中,并跟踪传递给 mutableStateOf 的值的变化。该值更新时,系统会自动重新绘制使用此状态的可组合项(及其子项)。这称为重组。

通过使用 Compose 的状态 API(如 remember 和 mutableStateOf),系统会在状态发生任何变化时自动更新界面。

 @Composable
    fun MessageCard(msg: Message){
        Row(modifier = Modifier.padding(all = 8.dp)) {
            Image(
                painter = painterResource(id = R.drawable.jetpack_compose),
                contentDescription = null,
                modifier = Modifier
                    .size(40.dp)
                    .clip(CircleShape)
                    .border(1.5.dp, MaterialTheme.colors.secondaryVariant, CircleShape))
            Spacer(modifier = Modifier.width(8.dp))
            var isExpanded by remember {
                mutableStateOf(false)
            }
            val surfaceColor by animateColorAsState(
                if(isExpanded) MaterialTheme.colors.primary else MaterialTheme.colors.surface
            )
            Column (modifier = Modifier.clickable { isExpanded = !isExpanded }){
                Text(
                    text = msg.author,
                    color = MaterialTheme.colors.secondaryVariant,
                    style = MaterialTheme.typography.subtitle2)
                Spacer(modifier = Modifier.height(4.dp))

                Surface(
                    shape = MaterialTheme.shapes.medium,
                    elevation = 1.dp,
                    color = surfaceColor,
                    modifier = Modifier.animateContentSize().padding(1.dp)
                ){
                    Text(
                        text = msg.body,
                        modifier = Modifier.padding(all = 4.dp),
                        maxLines = if(isExpanded) Int.MAX_VALUE else 1,
                    style = MaterialTheme.typography.body2)
                }
            }
        }

    }

备注:都是官方的demo,很好理解,着重理解一下@Composable 可组合可组合可组合

找不到SampleData.kt  它这样:

object SampleData {
    // Sample conversation data
    val conversationSample = listOf(
        Message(
            "Colleague",
            "Test...Test...Test..."
        ),
        Message(
            "Colleague",
            "List of Android versions:\n" +
                    "Android KitKat (API 19)\n" +
                    "Android Lollipop (API 21)\n" +
                    "Android Marshmallow (API 23)\n" +
                    "Android Nougat (API 24)\n" +
                    "Android Oreo (API 26)\n" +
                    "Android Pie (API 28)\n" +
                    "Android 10 (API 29)\n" +
                    "Android 11 (API 30)\n" +
                    "Android 12 (API 31)\n"
        ),
        Message(
            "Colleague",
            "I think Kotlin is my favorite programming language.\n" +
                    "It's so much fun!"
        ),
        Message(
            "Colleague",
            "Searching for alternatives to XML layouts..."
        ),
        Message(
            "Colleague",
            "Hey, take a look at Jetpack Compose, it's great!\n" +
                    "It's the Android's modern toolkit for building native UI." +
                    "It simplifies and accelerates UI development on Android." +
                    "Less code, powerful tools, and intuitive Kotlin APIs :)"
        ),
        Message(
            "Colleague",
            "It's available from API 21+ :)"
        ),
        Message(
            "Colleague",
            "Writing Kotlin for UI seems so natural, Compose where have you been all my life?"
        ),
        Message(
            "Colleague",
            "Android Studio next version's name is Arctic Fox"
        ),
        Message(
            "Colleague",
            "Android Studio Arctic Fox tooling for Compose is top notch ^_^"
        ),
        Message(
            "Colleague",
            "I didn't know you can now run the emulator directly from Android Studio"
        ),
        Message(
            "Colleague",
            "Compose Previews are great to check quickly how a composable layout looks like"
        ),
        Message(
            "Colleague",
            "Previews are also interactive after enabling the experimental setting"
        ),
        Message(
            "Colleague",
            "Have you tried writing build.gradle with KTS?"
        ),
    )
}

相关文章:

  • 计基于安卓 Android 微信小程序的孕妇产后康复系统app
  • 钉钉扫码登陆第三方网站
  • Python 自动化测试(三): pytest 参数化测试用例构建
  • Java通过Zxing生成和解析二维码
  • 如何在手机浏览器中打开安卓APP
  • Postgresql 解决pg掉电后无法重启的问题
  • Git下载安装vue-antd-admin教程
  • dubbo服务暴露流程
  • 人老了才明白,走到最后,身边能依靠的不是老伴,也不是子女
  • PySpark SQL模块官方文档
  • 独立三方数据源!数据宝国有大数据为金融机构及物流企业提供双向赋能
  • Vuehtml2pdf的使用
  • java计算机毕业设计图书馆管理系统源码+系统+数据库+lw文档+mybatis+运行部署
  • 南京国家农创聚功能性农业主导产业 国稻种芯百团计划行动
  • A. Balance the Bits (思维构造)
  • ES6指北【2】—— 箭头函数
  • android高仿小视频、应用锁、3种存储库、QQ小红点动画、仿支付宝图表等源码...
  • express.js的介绍及使用
  • mysql常用命令汇总
  • scala基础语法(二)
  • Theano - 导数
  • 浅析微信支付:申请退款、退款回调接口、查询退款
  • 微信小程序填坑清单
  • RDS-Mysql 物理备份恢复到本地数据库上
  • scrapy中间件源码分析及常用中间件大全
  • ​ 全球云科技基础设施:亚马逊云科技的海外服务器网络如何演进
  • # 日期待t_最值得等的SUV奥迪Q9:空间比MPV还大,或搭4.0T,香
  • #每天一道面试题# 什么是MySQL的回表查询
  • (ZT)出版业改革:该死的死,该生的生
  • (二十三)Flask之高频面试点
  • (附源码)ssm基于web技术的医务志愿者管理系统 毕业设计 100910
  • (附源码)计算机毕业设计ssm电影分享网站
  • (三)Pytorch快速搭建卷积神经网络模型实现手写数字识别(代码+详细注解)
  • (十六)串口UART
  • (学习日记)2024.03.12:UCOSIII第十四节:时基列表
  • (学习日记)2024.04.10:UCOSIII第三十八节:事件实验
  • .dat文件写入byte类型数组_用Python从Abaqus导出txt、dat数据
  • .net core 6 redis操作类
  • .net MVC中使用angularJs刷新页面数据列表
  • .NET 中使用 TaskCompletionSource 作为线程同步互斥或异步操作的事件
  • .NET/C# 获取一个正在运行的进程的命令行参数
  • .NetCore部署微服务(二)
  • .net分布式压力测试工具(Beetle.DT)
  • .NET构架之我见
  • /etc/sudoers (root权限管理)
  • ??如何把JavaScript脚本中的参数传到java代码段中
  • ??在JSP中,java和JavaScript如何交互?
  • @Autowired 与@Resource的区别
  • [ 数据结构 - C++] AVL树原理及实现
  • [Android]Tool-Systrace
  • [bzoj1901]: Zju2112 Dynamic Rankings
  • [CISCN2019 华北赛区 Day1 Web2]ikun
  • [HarekazeCTF2019]encode_and_encode 不会编程的崽
  • [HJ56 完全数计算]
  • [IE编程] WebBrowser控件的多页面浏览(Tabbed Browsing)开发接口