Ich habe eine ähnliche Frage gestellt, die ungelöst ist. Ich frage noch einmal mit weiteren Informationen. In meiner Android -App gibt es eine Netzansicht, die aus Gitterartikeln besteht, die ein Video oder ein Bild sein können. Im Folgenden von 3 Elementen. Der erste und der 3. sind Videos. Die Ausrichtung des zweiten Videos ist Porträt, und sie überläuft den Rand seines übergeordneten Containers in das erste Video. nutzen. Ich stellte fest, dass es nur dann passiert, wenn sich zwei Exoplayer gegenseitig überlappen. Im folgenden Raster ist der 4. Element auch ein Porträtvideo. Das Element oben ist ein Bild und das Video, das es in seinem Container fein bleibt.
Ich habe eine ähnliche Frage gestellt, die ungelöst ist. Ich frage noch einmal mit weiteren Informationen. In meiner Android -App gibt es eine Netzansicht, die aus Gitterartikeln besteht, die ein Video oder ein Bild sein können. Im Folgenden von 3 Elementen. Der erste und der 3. sind Videos. Die Ausrichtung des zweiten Videos ist Porträt, und sie überläuft den Rand seines übergeordneten Containers in das erste Video. nutzen. Ich stellte fest, dass es nur dann passiert, wenn sich zwei Exoplayer gegenseitig überlappen. Im folgenden Raster ist der 4. Element auch ein Porträtvideo. Das Element oben ist ein Bild und das Video, das es in seinem Container fein bleibt.[code]@Composable fun MediaPreviewGrid( mediaItems: List, viewModel: TweetViewModel, onFullScreenVideo: ((String, MimeiId) -> Unit)? = null, // Callback for full-screen video ) { val tweet by viewModel.tweetState.collectAsState() val navController = LocalNavController.current val maxItems = when (mediaItems.size) { 1 -> 1 2, 3 -> mediaItems.size else -> 4 }
// Set up sequential playback for multiple videos val videoMids = remember { limitedMediaList.mapIndexedNotNull { index, item -> if (inferMediaTypeFromAttachment(item) == MediaType.Video) item.mid else null } }
@Composable fun MediaItemView( mediaItems: List, modifier: Modifier = Modifier, index: Int, numOfHiddenItems: Int = 0, // add a PLUS sign to indicate more items not shown autoPlay: Boolean = false, // autoplay first video item, index 0 inPreviewGrid: Boolean = true, // use real aspectRatio when not displaying in preview grid. viewModel: TweetViewModel, onFullScreenVideo: ((String, MimeiId) -> Unit)? = null // Callback for full-screen video ) { val tweet by viewModel.tweetState.collectAsState() val attachments = mediaItems.map { val inferredType = inferMediaTypeFromAttachment(it) val mediaUrl = getMediaUrl(it.mid, tweet.author?.baseUrl.orEmpty()).toString() MediaItem(mediaUrl, inferredType) } val attachment = attachments[index] val navController = LocalNavController.current
Box( modifier = modifier .background(Color.Gray.copy(alpha = 0.1f)) .clipToBounds(), contentAlignment = Alignment.Center ) { when (attachment.type) { MediaType.Image -> { // Use a Box with clickable modifier to handle image clicks Box( modifier = modifier .clipToBounds() .clickable { goto(index) } ) { ImageViewer( attachment.url, modifier = Modifier.fillMaxSize(), enableLongPress = false // Disable long press to allow clickable to work ) } } MediaType.Video -> { VideoPreview( url = attachment.url, modifier = modifier, index = index, autoPlay = autoPlay, inPreviewGrid = inPreviewGrid, aspectRatio = mediaItems[index].aspectRatio, callback = { goto(index) }, videoMid = mediaItems[index].mid ) } MediaType.Audio -> { val backgroundModifier = if (index % 2 != 0) { // Check if index is odd modifier.background(Color.Black.copy(alpha = 0.05f)) // Slightly darker background } else { modifier } Box( modifier = backgroundModifier .clipToBounds() .clickable { goto(index) } ) { AudioPreview(mediaItems, index, Modifier.fillMaxSize(), tweet) } } else -> { // add link to download other file type BlobLink(mediaItems[index], attachment.url, modifier) } } if (numOfHiddenItems > 0) { /** * Show a PLUS sign and number to indicate more items not shown * */ Box( modifier = Modifier .matchParentSize() .background(Color(0x40FFFFFF)), // Lighter shaded background contentAlignment = Alignment.Center ) { Row(modifier = Modifier.align(Alignment.Center)) { Icon( imageVector = Icons.Outlined.Add, contentDescription = null, tint = Color.White, modifier = Modifier .size(50.dp) .alpha(0.8f) ) Text( text = numOfHiddenItems.toString(), color = Color.White, fontSize = 50.sp, // Adjust this value as needed textAlign = TextAlign.Center, modifier = Modifier .alpha(0.8f) ) } } } } } < /code> @Composable fun VideoPreview( url: String, modifier: Modifier, index: Int, autoPlay: Boolean = false, inPreviewGrid: Boolean = true, aspectRatio: Float?, callback: (Int) -> Unit, videoMid: MimeiId? = null ) { val context = LocalContext.current var isVideoVisible by remember { mutableStateOf(false) } var isMuted by remember { mutableStateOf(preferenceHelper.getSpeakerMute()) } var isLoading by remember { mutableStateOf(videoMid?.let { !VideoManager.isVideoPreloaded(it) } ?: true) }
Eine solche Situation:
1 Hintergrundschicht, 4 Bilder, die sich in dieser Hintergrundschicht gegenseitig ersetzen sollten - in einem Zeitintervall (4 Sek.) Mit einem weichen Übergang (1,5) Sec) und...
Ich habe eine XAML -Datei mit 2 Grundschaltflächen: Button_1 und button_2
Das Problem ist, dass die erste Taste reagiert, aber Button_2 ist nicht. Button_1 ist nicht mehr.
Irgendeine Idee, was ich...
Ich habe eine XAML -Datei mit 2 Grundschaltflächen: Button_1 und button_2
Das Problem ist, dass die erste Taste reagiert, aber Button_2 ist nicht. Button_1 ist nicht mehr.
Irgendeine Idee, was ich...
Verwenden von Bootstrap erstelle ich 6 Thumbnails in einem Bildschirm, in dem jede einzelne Zeile nur maximale 3 Thumbnail s enthält. Alles ist in Ordnung, aber wenn Browser die Größe der Größe...
Verwenden von Bootstrap erstelle ich 6 Thumbnails in einem Bildschirm, in dem jede einzelne Zeile nur maximale 3 Thumbnail s enthält. Alles ist in Ordnung, aber wenn Browser die Größe der Größe...