feat: add interactive swipe-down fade to media viewer
This commit is contained in:
@@ -2470,12 +2470,14 @@ private fun ChatMediaViewerOverlay(
|
||||
items.size
|
||||
}
|
||||
var showTopBar by remember { mutableStateOf(true) }
|
||||
var dismissProgress by remember { mutableStateOf(0f) }
|
||||
val backgroundAlpha = (0.94f - (dismissProgress.coerceIn(0f, 1f) * 0.55f)).coerceIn(0.35f, 0.94f)
|
||||
|
||||
Surface(
|
||||
modifier = Modifier
|
||||
.fillMaxSize()
|
||||
.background(MaterialTheme.colorScheme.scrim.copy(alpha = 0.82f)),
|
||||
color = Color.Black.copy(alpha = 0.94f),
|
||||
.background(MaterialTheme.colorScheme.scrim.copy(alpha = (0.82f - dismissProgress * 0.5f).coerceIn(0.18f, 0.82f))),
|
||||
color = Color.Black.copy(alpha = backgroundAlpha),
|
||||
) {
|
||||
Column(
|
||||
modifier = Modifier.fillMaxSize(),
|
||||
@@ -2515,12 +2517,14 @@ private fun ChatMediaViewerOverlay(
|
||||
imageUrl = item.url,
|
||||
onDismiss = onDismiss,
|
||||
onToggleChrome = { showTopBar = !showTopBar },
|
||||
onDismissProgressChanged = { dismissProgress = it },
|
||||
)
|
||||
ChatViewerMediaType.Video -> VideoViewerPage(
|
||||
videoUrl = item.url,
|
||||
isCurrentPage = pagerState.currentPage == page,
|
||||
onDismiss = onDismiss,
|
||||
onToggleChrome = { showTopBar = !showTopBar },
|
||||
onDismissProgressChanged = { dismissProgress = it },
|
||||
)
|
||||
}
|
||||
}
|
||||
@@ -2559,6 +2563,7 @@ private fun ChatMediaViewerOverlay(
|
||||
}
|
||||
|
||||
LaunchedEffect(pagerState.currentPage) {
|
||||
dismissProgress = 0f
|
||||
onPageChanged(pagerState.currentPage)
|
||||
}
|
||||
}
|
||||
@@ -2568,6 +2573,7 @@ private fun ZoomableImageViewerPage(
|
||||
imageUrl: String,
|
||||
onDismiss: () -> Unit,
|
||||
onToggleChrome: () -> Unit,
|
||||
onDismissProgressChanged: (Float) -> Unit,
|
||||
) {
|
||||
var scale by remember(imageUrl) { mutableStateOf(1f) }
|
||||
var offset by remember(imageUrl) { mutableStateOf(Offset.Zero) }
|
||||
@@ -2609,16 +2615,19 @@ private fun ZoomableImageViewerPage(
|
||||
if (!canDismiss) return@detectVerticalDragGestures
|
||||
change.consume()
|
||||
dismissOffsetY += dragAmount
|
||||
onDismissProgressChanged((kotlin.math.abs(dismissOffsetY) / 280f).coerceIn(0f, 1f))
|
||||
},
|
||||
onDragEnd = {
|
||||
if (kotlin.math.abs(dismissOffsetY) > 180f) {
|
||||
onDismiss()
|
||||
} else {
|
||||
dismissOffsetY = 0f
|
||||
onDismissProgressChanged(0f)
|
||||
}
|
||||
},
|
||||
onDragCancel = {
|
||||
dismissOffsetY = 0f
|
||||
onDismissProgressChanged(0f)
|
||||
},
|
||||
)
|
||||
}
|
||||
@@ -2661,6 +2670,7 @@ private fun VideoViewerPage(
|
||||
isCurrentPage: Boolean,
|
||||
onDismiss: () -> Unit,
|
||||
onToggleChrome: () -> Unit,
|
||||
onDismissProgressChanged: (Float) -> Unit,
|
||||
) {
|
||||
val playerState = rememberManagedMediaPlayerState(
|
||||
url = videoUrl,
|
||||
@@ -2683,16 +2693,19 @@ private fun VideoViewerPage(
|
||||
onVerticalDrag = { change, dragAmount ->
|
||||
change.consume()
|
||||
dismissOffsetY += dragAmount
|
||||
onDismissProgressChanged((kotlin.math.abs(dismissOffsetY) / 280f).coerceIn(0f, 1f))
|
||||
},
|
||||
onDragEnd = {
|
||||
if (kotlin.math.abs(dismissOffsetY) > 180f) {
|
||||
onDismiss()
|
||||
} else {
|
||||
dismissOffsetY = 0f
|
||||
onDismissProgressChanged(0f)
|
||||
}
|
||||
},
|
||||
onDragCancel = {
|
||||
dismissOffsetY = 0f
|
||||
onDismissProgressChanged(0f)
|
||||
},
|
||||
)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user