Zoom funktioniert in Android -Jetpack nicht ordnungsgemäß. Das Bild befindet sich in einem horizontalen Pager. Wenn das Bild im Container bewegt wird, funktioniert der horizontale Pager auf natürliche Weise nicht mehr funktioniert, aber wenn der Benutzer das Bild nicht an seiner ursprünglichen Position zurückschnappt, um den Viewpager erneut zum Laufen zu bringen. < /P>
HorizontalPager(state, modifier = Modifier.fillMaxSize(),
verticalAlignment = Alignment.CenterVertically) { page->
ImageViewer(images = storeImages.value, page=page, pagerState= state, scope=scope)
}
@OptIn(ExperimentalGlideComposeApi::class)
@Composable
fun ImageViewer(images: List, page: Int, pagerState: PagerState, scope: CoroutineScope) {
var imageSize by remember { mutableStateOf(IntSize.Zero) }
var scale by remember { mutableStateOf(1f) }
var offset by remember { mutableStateOf(Offset.Zero) }
Log.d("scale", "ImageViewer: $scale")
Log.d("offset", "ImageViewer: ${offset.x}, ${offset.y}")
Box(
modifier = Modifier
.fillMaxSize()
.verticalScroll(rememberScrollState())
) {
Column(modifier = Modifier
.fillMaxSize()
.align(alignment = Alignment.Center)) {
GlideImage(
contentScale = ContentScale.FillWidth,
model = images[page],
contentDescription = "Zoomable Image",
modifier = Modifier
.fillMaxSize()
.onGloballyPositioned { coordinates ->
imageSize = coordinates.size // Capture the image size
}
.pointerInput(Unit) {
detectTransformGestures() { centroid, pan, zoom, _ ->
val newScale = (scale * zoom).coerceIn(1f, 5f) // Limit zoom scale
val newOffset = offset + pan
// Adjust offset based on scale changes
val adjustedOffset = if (scale != newScale) {
// Calculate the difference in size due to scaling
val sizeDifference = (newScale / scale - 1f)
// Calculate the focal point within the *scaled* image
val scaledFocalPoint = (centroid + offset)
// Calculate the offset needed to keep the focal point stationary
val focalPointOffset = scaledFocalPoint * sizeDifference
newOffset - focalPointOffset
} else {
newOffset
}
scale = newScale
offset = adjustedOffset
}
}
.pointerInput(Unit) { // New pointerInput for horizontal swipe
detectHorizontalDragGestures { change, dragAmount ->
if (scale == 1f) { // Only trigger pager swipe when not zoomed
val currentPosition = pagerState.currentPage
if (dragAmount < 0) { // Left swipe (right to left)
if (currentPosition < images.size - 1) {
scope.launch {
pagerState.animateScrollToPage(currentPosition + 1)
}
}
} else { // Right swipe (left to right)
if (currentPosition > 0) {
scope.launch {
pagerState.animateScrollToPage(currentPosition - 1)
}
}
}
}
}
}
.graphicsLayer(
scaleX = scale,
scaleY = scale,
translationX = offset.x,
translationY = offset.y
)
)
}
}
}
< /code>
Ich habe versucht, einen Multi -Touch -Zoom aus Stackoverflow Post Android Developers Doc zu replizieren. /> Ich habe versucht zu überprüfen, ob das Bild zu 1F zurückkehrt. Auch das funktioniert jedoch nicht, wenn Bilddimensionen den neuen Zustand ändern, nachdem Geste veröffentlicht wurde. /P>
In Jetpack Compose kann Zoom nicht geschafft werden ⇐ Android
-
- Similar Topics
- Replies
- Views
- Last post
Mobile version