admin管理员组文章数量:1530266
在3月份参加了一场Jetpack Compose挑战赛,由于工作原因,后面的三场都没来得及,前几天Jetpack Compose 1.0稳定版本也正式发布,新版的Android Studio也发布了,启动图标很新颖,样式也很时尚,最近也在学习一系列的compose课程,有兴趣的同学可以去看看.
好了,废话不多说,直接上代码:
1.主界面
class MainActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContent {
ComposeTutorialTheme {
Conversation(SampleData.conversationSample)
}
}
}
}
2.Message
data class Message(val author: String, val body: String)
@Composable
fun Conversation(messages: List<Message>) {
LazyColumn {
//消息列表
items(messages) { message ->
//卡片式消息列表
MessageCard(message)
}
}
}
3.MessageCard
@Composable
fun MessageCard(msg: Message) {
Row(modifier = Modifier.padding(all = 8.dp)) {
//设置图片
Image(
painter = painterResource(R.drawable.img),
contentDescription = null,
modifier = Modifier
.size(40.dp)
.clip(CircleShape)
.border(1.5.dp, MaterialTheme.colors.secondaryVariant, CircleShape)
)
//设置间距
Spacer(modifier = Modifier.width(8.dp))
// We keep track if the message is expanded or not in this
// variable 消息是否展开的动画
var isExpanded by remember { mutableStateOf(false) }
// We toggle the isExpanded variable when we click on this Column
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,
) {
Text(
text = msg.body,
modifier = Modifier.padding(all = 4.dp),
// If the message is expanded, we display all its content
// otherwise we only display the first line
maxLines = if (isExpanded) Int.MAX_VALUE else 1,
style = MaterialTheme.typography.body2
)
}
}
}
}
4.实体类:SampleData.
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?"
),
)
}
5.完整的MainActivity代码如下:
package com.example.composedemo3
import android.content.res.Configuration
import android.os.Bundle
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
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.Modifier
import androidx.compose.ui.draw.clip
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import com.example.composedemo3.ui.theme.ComposeTutorialTheme
class MainActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContent {
ComposeTutorialTheme {
Conversation(SampleData.conversationSample)
}
}
}
}
data class Message(val author: String, val body: String)
@Composable
fun Conversation(messages: List<Message>) {
LazyColumn {
//消息列表
items(messages) { message ->
//卡片式消息列表
MessageCard(message)
}
}
}
@Composable
fun MessageCard(msg: Message) {
Row(modifier = Modifier.padding(all = 8.dp)) {
//设置图片
Image(
painter = painterResource(R.drawable.img),
contentDescription = null,
modifier = Modifier
.size(40.dp)
.clip(CircleShape)
.border(1.5.dp, MaterialTheme.colors.secondaryVariant, CircleShape)
)
//设置间距
Spacer(modifier = Modifier.width(8.dp))
// We keep track if the message is expanded or not in this
// variable 消息是否展开的动画
var isExpanded by remember { mutableStateOf(false) }
// We toggle the isExpanded variable when we click on this Column
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,
) {
Text(
text = msg.body,
modifier = Modifier.padding(all = 4.dp),
// If the message is expanded, we display all its content
// otherwise we only display the first line
maxLines = if (isExpanded) Int.MAX_VALUE else 1,
style = MaterialTheme.typography.body2
)
}
}
}
}
@Preview(name = "Light Mode")
@Preview(
//ui适配的主题模式
uiMode = Configuration.UI_MODE_NIGHT_YES,
showBackground = true,
name = "Dark Mode"
)
@Composable
fun PreviewConversation() {
ComposeTutorialTheme {
Conversation(SampleData.conversationSample)
}
}
6.来我们看看预览的效果:
黑夜模式
白天模式
你会发现整个项目目录结构没有布局文件,而且代码加起来也就110行左右.
8.最后demo的源码地址如下:
https://gitee/jackning_admin/compse-demo3
9.大佬的视频地址如下:
https://www.youtube/channel/UCKNTZMRHPLXfqlbdOI7mCkg
大神Philipp Lackner的视频,讲得很有意思,小伙也很帅气,生动形象,此大佬的github也有很多例子和项目,非常炫酷有挑战性.
10.官网例子:
当然google官方的学习资料也很丰富,有8个学习demo,从ui、布局、状态、动画等等,一系列都有,同样是学习的好地方.
google官网学习地址如下:
https://developer.android/jetpack/compose/tutorial?hl=zh-cn
11.总结:
有兴趣的同学可以抢先尝试一下,学起来很有意思,不仅仅是写UI布局那么简单,各种新的用法和尝试,未来一定会慢慢发展起来,希望对你们有帮助,大家一起学习进步。当然不学习也没关系,这仅仅是个人爱好和学习方向。
版权声明:本文标题:Jetpack Compose实现简单聊天列表 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://m.elefans.com/xitong/1725458878a1024538.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论