Skip to content

Commit 9749706

Browse files
committed
支持显示转发/直播动态
1 parent 0418611 commit 9749706

File tree

3 files changed

+454
-48
lines changed

3 files changed

+454
-48
lines changed

app/src/main/kotlin/dev/aaa1115910/bv/mobile/component/home/dynamic/DynamicItem.kt

Lines changed: 237 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package dev.aaa1115910.bv.mobile.component.home.dynamic
22

3+
import android.content.res.Configuration
34
import androidx.compose.foundation.background
45
import androidx.compose.foundation.layout.Arrangement
56
import androidx.compose.foundation.layout.Box
@@ -65,39 +66,58 @@ fun DynamicItem(
6566
dynamicItem: DynamicItem,
6667
previewerState: ImagePreviewerState = rememberPreviewerState(pageCount = { 0 }),
6768
onShowPreviewer: (newPictures: List<String>, afterSetPictures: () -> Unit) -> Unit = { _, _ -> },
68-
onClick: () -> Unit = {}
69+
onClick: (DynamicItem) -> Unit = {}
6970
) {
71+
val paddingSize = 12.dp
72+
7073
Surface(
7174
modifier = modifier,
72-
onClick = onClick
75+
onClick = { onClick(dynamicItem) }
7376
) {
7477
Column(
75-
modifier = Modifier.padding(12.dp),
78+
modifier = Modifier.padding(vertical = paddingSize),
7679
verticalArrangement = Arrangement.spacedBy(8.dp),
7780
) {
7881
DynamicHeader(
82+
modifier = Modifier.padding(horizontal = paddingSize),
7983
author = dynamicItem.author
8084
)
8185
when (dynamicItem.type) {
8286
DynamicType.Av -> DynamicVideoContent(
87+
modifier = Modifier.padding(horizontal = paddingSize),
8388
video = dynamicItem.video!!
8489
)
8590

86-
DynamicType.UgcSeason -> TODO()
87-
DynamicType.Forward -> TODO()
88-
DynamicType.Word -> DynamicWord(
89-
word = dynamicItem.word!!
90-
)
91-
9291
DynamicType.Draw -> DynamicDraw(
92+
modifier = Modifier.padding(horizontal = paddingSize),
9393
draw = dynamicItem.draw!!,
9494
previewerState = previewerState,
9595
onShowPreviewer = onShowPreviewer
9696
)
97+
98+
DynamicType.Forward -> DynamicForward(
99+
dynamicItem = dynamicItem.orig!!,
100+
previewerState = previewerState,
101+
onShowPreviewer = onShowPreviewer,
102+
onClick = { onClick(dynamicItem.orig!!) }
103+
)
104+
105+
DynamicType.LiveRcmd -> DynamicLiveRcmd(
106+
modifier = Modifier.padding(horizontal = paddingSize),
107+
liveRcmd = dynamicItem.liveRcmd!!
108+
)
109+
110+
DynamicType.UgcSeason -> TODO()
111+
112+
DynamicType.Word -> DynamicWord(
113+
modifier = Modifier.padding(horizontal = paddingSize),
114+
word = dynamicItem.word!!
115+
)
97116
}
98117

99118
DynamicFooter(
100-
footer = dynamicItem.footer,
119+
modifier = Modifier.padding(horizontal = paddingSize),
120+
footer = dynamicItem.footer!!,
101121
isLike = false,
102122
onShare = {
103123
//TODO 动态分享按钮
@@ -122,13 +142,14 @@ fun DynamicVideoContent(
122142
video: DynamicItem.DynamicVideoModule
123143
) {
124144
Column(
145+
modifier = modifier,
125146
verticalArrangement = Arrangement.spacedBy(8.dp)
126147
) {
127148
if (video.text.isNotBlank()) {
128149
Text(text = video.text)
129150
}
130151
Card(
131-
modifier = modifier
152+
modifier = Modifier
132153
.fillMaxWidth()
133154
.aspectRatio(1.6f)
134155
) {
@@ -269,7 +290,45 @@ fun DynamicHeader(
269290
Icon(imageVector = Icons.Default.MoreVert, contentDescription = "Menu")
270291
}
271292
}
293+
}
272294

295+
@Composable
296+
fun DynamicForwardHeader(
297+
modifier: Modifier = Modifier,
298+
author: DynamicItem.DynamicAuthorModule
299+
) {
300+
Box(
301+
modifier = modifier
302+
.height(24.dp)
303+
.fillMaxWidth()
304+
) {
305+
Row(
306+
modifier = Modifier
307+
.align(Alignment.CenterStart)
308+
.fillMaxWidth(),
309+
horizontalArrangement = Arrangement.spacedBy(8.dp),
310+
verticalAlignment = Alignment.CenterVertically
311+
) {
312+
UserAvatar(
313+
avatar = author.avatar,
314+
size = 20.dp
315+
)
316+
317+
Text(
318+
text = author.author,
319+
maxLines = 1,
320+
fontSize = 14.sp,
321+
lineHeight = 14.sp
322+
)
323+
Text(
324+
text = author.pubTime + " ${author.pubAction}",
325+
maxLines = 1,
326+
color = MaterialTheme.colorScheme.onSurface.copy(0.8f),
327+
fontSize = 14.sp,
328+
lineHeight = 14.sp
329+
)
330+
}
331+
}
273332
}
274333

275334
@Composable
@@ -497,6 +556,115 @@ fun DynamicWord(
497556
)
498557
}
499558

559+
@Composable
560+
fun DynamicForward(
561+
modifier: Modifier = Modifier,
562+
dynamicItem: DynamicItem,
563+
previewerState: ImagePreviewerState,
564+
onShowPreviewer: (newPictures: List<String>, afterSetPictures: () -> Unit) -> Unit,
565+
onClick: () -> Unit
566+
) {
567+
Surface(
568+
modifier = modifier,
569+
color = MaterialTheme.colorScheme.surfaceContainer,
570+
onClick = onClick
571+
) {
572+
Box(
573+
modifier = Modifier.padding(horizontal = 12.dp, vertical = 6.dp),
574+
) {
575+
Column(
576+
verticalArrangement = Arrangement.spacedBy(8.dp)
577+
) {
578+
DynamicForwardHeader(
579+
author = dynamicItem.author
580+
)
581+
when (dynamicItem.type) {
582+
DynamicType.Av -> DynamicVideoContent(
583+
video = dynamicItem.video!!
584+
)
585+
586+
DynamicType.Draw -> DynamicDraw(
587+
draw = dynamicItem.draw!!,
588+
previewerState = previewerState,
589+
onShowPreviewer = onShowPreviewer
590+
)
591+
592+
DynamicType.Forward -> {}
593+
594+
DynamicType.LiveRcmd -> DynamicLiveRcmd(
595+
liveRcmd = dynamicItem.liveRcmd!!
596+
)
597+
598+
DynamicType.UgcSeason -> TODO()
599+
600+
DynamicType.Word -> DynamicWord(
601+
word = dynamicItem.word!!
602+
)
603+
}
604+
}
605+
}
606+
}
607+
}
608+
609+
@Composable
610+
fun DynamicLiveRcmd(
611+
modifier: Modifier = Modifier,
612+
liveRcmd: DynamicItem.DynamicLiveRcmdModule
613+
) {
614+
Column(
615+
modifier = modifier,
616+
verticalArrangement = Arrangement.spacedBy(8.dp)
617+
) {
618+
Card(
619+
modifier = Modifier
620+
.fillMaxWidth()
621+
.aspectRatio(1.6f)
622+
) {
623+
Box(
624+
contentAlignment = Alignment.BottomCenter
625+
) {
626+
AsyncImage(
627+
modifier = Modifier
628+
.fillMaxWidth()
629+
.aspectRatio(1.6f)
630+
.clip(MaterialTheme.shapes.large),
631+
model = liveRcmd.cover.resizedImageUrl(ImageSize.SmallVideoCardCover),
632+
contentDescription = null,
633+
contentScale = ContentScale.FillBounds
634+
)
635+
Box(
636+
modifier = Modifier
637+
.fillMaxWidth()
638+
.height(48.dp)
639+
.background(
640+
Brush.verticalGradient(
641+
colors = listOf(
642+
Color.Transparent,
643+
Color.Black.copy(alpha = 0.3f)
644+
)
645+
)
646+
)
647+
)
648+
Row(
649+
modifier = Modifier
650+
.fillMaxWidth()
651+
.padding(12.dp, 8.dp),
652+
verticalAlignment = Alignment.CenterVertically,
653+
horizontalArrangement = Arrangement.SpaceBetween
654+
) {
655+
656+
Text(
657+
text = "${liveRcmd.roomId}",
658+
style = MaterialTheme.typography.bodySmall,
659+
color = Color.White
660+
)
661+
}
662+
}
663+
}
664+
Text(text = liveRcmd.title)
665+
}
666+
}
667+
500668
@Preview
501669
@Composable
502670
private fun DynamicHeaderPreview() {
@@ -509,13 +677,25 @@ private fun DynamicHeaderPreview() {
509677
}
510678
}
511679

680+
@Preview
681+
@Composable
682+
private fun DynamicForwardHeaderPreview() {
683+
BVMobileTheme {
684+
Surface {
685+
DynamicForwardHeader(
686+
author = emptyDynamicVideoData.author
687+
)
688+
}
689+
}
690+
}
691+
512692
@Preview
513693
@Composable
514694
private fun DynamicFooterPreview() {
515695
BVMobileTheme {
516696
Surface {
517697
DynamicFooter(
518-
footer = emptyDynamicVideoData.footer
698+
footer = exampleFooterData
519699
)
520700
}
521701
}
@@ -570,6 +750,24 @@ private val emptyDynamicDrawData = DynamicItem(
570750
footer = exampleFooterData
571751
)
572752

753+
private val exampleDynamicForwardData = DynamicItem(
754+
type = DynamicType.Forward,
755+
author = exampleAuthorData,
756+
orig = emptyDynamicVideoData,
757+
footer = exampleFooterData
758+
)
759+
760+
private val exampleDynamicLiveRcmdData = DynamicItem(
761+
type = DynamicType.LiveRcmd,
762+
author = exampleAuthorData,
763+
liveRcmd = DynamicItem.DynamicLiveRcmdModule(
764+
cover = "",
765+
title = "title",
766+
roomId = 3
767+
),
768+
footer = exampleFooterData
769+
)
770+
573771
@Preview
574772
@Composable
575773
private fun DynamicVideoItemPreview() {
@@ -608,6 +806,33 @@ private fun DynamicDrawItemPreview(@PreviewParameter(DynamicDrawItemProvider::cl
608806
}
609807
}
610808

809+
@Preview
810+
@Preview(uiMode = Configuration.UI_MODE_NIGHT_YES)
811+
@Composable
812+
private fun DynamicForwardItemPreview() {
813+
BVMobileTheme {
814+
Surface {
815+
DynamicItem(
816+
modifier = Modifier.padding(vertical = 8.dp),
817+
dynamicItem = exampleDynamicForwardData
818+
)
819+
}
820+
}
821+
}
822+
823+
@Preview
824+
@Composable
825+
private fun DynamicLiveRcmdItemPreview() {
826+
BVMobileTheme {
827+
Surface {
828+
DynamicItem(
829+
modifier = Modifier.padding(vertical = 8.dp),
830+
dynamicItem = exampleDynamicLiveRcmdData
831+
)
832+
}
833+
}
834+
}
835+
611836
@Preview
612837
@Composable
613838
private fun DynamicItemListPreview() {

0 commit comments

Comments
 (0)