Compose 的基础知识【07】-第一阶段完成

举报
坚果派 发表于 2022/05/28 13:44:37 2022/05/28
【摘要】 恭喜你,看到这里 你已经学会了 Compose 的基础知识,你创建了一个简单的信息屏幕,并且有效地显示了一个包含图片和文字的列表,按照 Material Design 的风格设计,包括一个深色主题和预览,以下都是你通过 100 行以内的代码来完成的。到目前为止你学到的内容定义一个 Composable 函数在你的 Composable 函数中添加不同的元素使用布局 Composable 来构...


恭喜你,看到这里 你已经学会了 Compose 的基础知识,你创建了一个简单的信息屏幕,并且有效地显示了一个包含图片和文字的列表,按照 Material Design 的风格设计,包括一个深色主题和预览,以下都是你通过 100 行以内的代码来完成的。

到目前为止你学到的内容

  • 定义一个 Composable 函数

  • 在你的 Composable 函数中添加不同的元素

  • 使用布局 Composable 来构建你的 UI 结构

  • 通过 modifiers 来扩展你的 Composables

  • 创建一个有效列表

  • 追踪状态,并且修改它

  • 在一个 Composable 上添加了用户互动

  • 在扩展信息的同时进行了动画处理

这篇文章的所有代码你可以在下面找到

​
​
package com.example.composestudy
​
import android.os.Bundle
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.compose.animation.animateColorAsState
import androidx.compose.animation.animateContentSize
import androidx.compose.foundation.Image
import androidx.compose.foundation.border
import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.*
import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.lazy.items
import androidx.compose.foundation.shape.CircleShape
import androidx.compose.material.MaterialTheme
import androidx.compose.material.Surface
import androidx.compose.material.Text
import androidx.compose.runtime.*
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
​
import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.clip
import androidx.compose.ui.graphics.Color
import com.example.composestudy.ui.theme.ComposestudyTheme
import java.nio.file.Files.size
​
class MainActivity : ComponentActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContent {
            ComposestudyTheme {
                Conversation(messages = MsgData.messages)
            }
        }
    }
}
object MsgData {
    private const val author = "大前端之旅"
    val messages = listOf(
        Message(author, "我们开始更新啦"),
        Message(author, "秋刀鱼会过期吗?"),
        Message(author, "下周就是端午了"),
        Message(author, "男人最好的状态是,25岁的时候能带着30岁的成熟去经营爱情,30岁的时候还带着18岁的不怕,去勇敢爱\uD83D\uDCAA"),
        Message(author, "Android之旅"),
​
        )
}
data class Message(val author: String, val body: String)
@Composable
fun MessageCard(msg: Message) {
​
    var isExpanded by remember { mutableStateOf(false) } // 创建一个能够检测卡片是否被展开的变量
    val surfaceColor by animateColorAsState(
        targetValue = if (isExpanded) Color(0xFFCCCCCC) else MaterialTheme.colors.surface
    )
​
    Surface(
        shape = MaterialTheme.shapes.medium,
        elevation = 5.dp,
        modifier = Modifier
            .padding(all = 8.dp)
            .clickable { // 添加一个新的 Modifier 扩展方法,可以让元素具有点击的效果
                isExpanded = !isExpanded // 编写点击的事件内容
            }
    ) {
        Row(
            modifier = Modifier.padding(all = 8.dp)
        ) {
            Image(
                painterResource(id = R.mipmap.ic_launcher),
                contentDescription = "profile picture",
                modifier = Modifier
                    .size(50.dp)
                    .clip(CircleShape)
                    .border(1.5.dp, MaterialTheme.colors.secondary, shape = CircleShape)
            )
            Spacer(Modifier.padding(horizontal = 8.dp))
            Column {
                Text(
                    text = msg.author,
                    color = MaterialTheme.colors.secondaryVariant,
                    style = MaterialTheme.typography.subtitle2
                )
                Spacer(Modifier.padding(vertical = 4.dp))
                Text(
                    text = msg.body,
                    style = MaterialTheme.typography.body2,
                    // 修改 maxLines 参数,在默认情况下,只显示一行文本内容
                    maxLines = if (isExpanded) Int.MAX_VALUE else 1,
                    // Composable 大小的动画效果
                    modifier = Modifier.animateContentSize(),
                            color = surfaceColor
                )
            }
        }
    }
}
@Composable
fun Conversation(messages: List<Message>) {
    LazyColumn {
        items(messages) { message ->
            MessageCard(msg = message)
        }
    }
}
​
​
​
@Preview(name = "Light Mode")
​
@Composable
fun PreviewMessageCard() {
    ComposestudyTheme {
        Conversation(messages = MsgData.messages)
    }
}

如果你想深入了解其中的一些步骤,请探索下面的资源。

基础 设计
Compose 编程思想 布局概述
状态管理 动画概述
生命周期 主题概述
负面影响 手势概述
架构分层 列表概述
语义
CompositionLocal
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。