1
1
package dev.aaa1115910.bv.mobile.component.home.dynamic
2
2
3
+ import android.content.res.Configuration
3
4
import androidx.compose.foundation.background
4
5
import androidx.compose.foundation.layout.Arrangement
5
6
import androidx.compose.foundation.layout.Box
@@ -65,39 +66,58 @@ fun DynamicItem(
65
66
dynamicItem : DynamicItem ,
66
67
previewerState : ImagePreviewerState = rememberPreviewerState(pageCount = { 0 }),
67
68
onShowPreviewer : (newPictures: List <String >, afterSetPictures: () -> Unit ) -> Unit = { _, _ -> },
68
- onClick : () -> Unit = {}
69
+ onClick : (DynamicItem ) -> Unit = {}
69
70
) {
71
+ val paddingSize = 12 .dp
72
+
70
73
Surface (
71
74
modifier = modifier,
72
- onClick = onClick
75
+ onClick = { onClick(dynamicItem) }
73
76
) {
74
77
Column (
75
- modifier = Modifier .padding(12 .dp ),
78
+ modifier = Modifier .padding(vertical = paddingSize ),
76
79
verticalArrangement = Arrangement .spacedBy(8 .dp),
77
80
) {
78
81
DynamicHeader (
82
+ modifier = Modifier .padding(horizontal = paddingSize),
79
83
author = dynamicItem.author
80
84
)
81
85
when (dynamicItem.type) {
82
86
DynamicType .Av -> DynamicVideoContent (
87
+ modifier = Modifier .padding(horizontal = paddingSize),
83
88
video = dynamicItem.video!!
84
89
)
85
90
86
- DynamicType .UgcSeason -> TODO ()
87
- DynamicType .Forward -> TODO ()
88
- DynamicType .Word -> DynamicWord (
89
- word = dynamicItem.word!!
90
- )
91
-
92
91
DynamicType .Draw -> DynamicDraw (
92
+ modifier = Modifier .padding(horizontal = paddingSize),
93
93
draw = dynamicItem.draw!! ,
94
94
previewerState = previewerState,
95
95
onShowPreviewer = onShowPreviewer
96
96
)
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
+ )
97
116
}
98
117
99
118
DynamicFooter (
100
- footer = dynamicItem.footer,
119
+ modifier = Modifier .padding(horizontal = paddingSize),
120
+ footer = dynamicItem.footer!! ,
101
121
isLike = false ,
102
122
onShare = {
103
123
// TODO 动态分享按钮
@@ -122,13 +142,14 @@ fun DynamicVideoContent(
122
142
video : DynamicItem .DynamicVideoModule
123
143
) {
124
144
Column (
145
+ modifier = modifier,
125
146
verticalArrangement = Arrangement .spacedBy(8 .dp)
126
147
) {
127
148
if (video.text.isNotBlank()) {
128
149
Text (text = video.text)
129
150
}
130
151
Card (
131
- modifier = modifier
152
+ modifier = Modifier
132
153
.fillMaxWidth()
133
154
.aspectRatio(1.6f )
134
155
) {
@@ -269,7 +290,45 @@ fun DynamicHeader(
269
290
Icon (imageVector = Icons .Default .MoreVert , contentDescription = " Menu" )
270
291
}
271
292
}
293
+ }
272
294
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
+ }
273
332
}
274
333
275
334
@Composable
@@ -497,6 +556,115 @@ fun DynamicWord(
497
556
)
498
557
}
499
558
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
+
500
668
@Preview
501
669
@Composable
502
670
private fun DynamicHeaderPreview () {
@@ -509,13 +677,25 @@ private fun DynamicHeaderPreview() {
509
677
}
510
678
}
511
679
680
+ @Preview
681
+ @Composable
682
+ private fun DynamicForwardHeaderPreview () {
683
+ BVMobileTheme {
684
+ Surface {
685
+ DynamicForwardHeader (
686
+ author = emptyDynamicVideoData.author
687
+ )
688
+ }
689
+ }
690
+ }
691
+
512
692
@Preview
513
693
@Composable
514
694
private fun DynamicFooterPreview () {
515
695
BVMobileTheme {
516
696
Surface {
517
697
DynamicFooter (
518
- footer = emptyDynamicVideoData.footer
698
+ footer = exampleFooterData
519
699
)
520
700
}
521
701
}
@@ -570,6 +750,24 @@ private val emptyDynamicDrawData = DynamicItem(
570
750
footer = exampleFooterData
571
751
)
572
752
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
+
573
771
@Preview
574
772
@Composable
575
773
private fun DynamicVideoItemPreview () {
@@ -608,6 +806,33 @@ private fun DynamicDrawItemPreview(@PreviewParameter(DynamicDrawItemProvider::cl
608
806
}
609
807
}
610
808
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
+
611
836
@Preview
612
837
@Composable
613
838
private fun DynamicItemListPreview () {
0 commit comments