Hi I want to have a zoomable image in a horizontal pager. I already implemented transform gestures and double tap but now, I can't scroll my pager with scrolling over the image. I guess panning and scrolling mixes each other. Can you help me about that ?
- I tried detecting horizontal drag gesture but it only prevents horizontal panning, at least i could manage only this part.
This is my Zoomable Image Composable:
@Composable
fun DoubleTapZoom(
) {
var zoomed by remember { mutableStateOf(false) }
var transforming by remember { mutableStateOf(false) }
var offset by remember { mutableStateOf(Offset.Zero) }
var zoomFloat by remember { mutableStateOf(1f) }
var angle by remember { mutableStateOf(0f) }
Image(
painter = painterResource(id = R.drawable.ic_launcher_foreground),
contentDescription = null,
modifier = Modifier
.size(500.dp)
.background(Color.Red)
.pointerInput(Unit) {
detectTapGestures(
onDoubleTap = { tapOffset ->
offset = if (zoomed) Offset.Zero else
calculateOffsetFromClick(size, tapOffset)
zoomed = !zoomed
}
)
}
.pointerInput(Unit) {
detectTransformGestures { centroid, pan, gestureZoom, gestureRotate ->
transforming = true
val oldScale = zoomFloat
val newScale = zoomFloat * gestureZoom
offset = (offset + centroid / oldScale).rotateBy(gestureRotate) -
(centroid / newScale + pan / oldScale)
zoomFloat = newScale
angle += gestureRotate
transforming = false
}
}
.graphicsLayer {
scaleX = zoomFloat
scaleY = zoomFloat
translationX = -offset.x * zoomFloat
translationY = -offset.y * zoomFloat
rotationZ = angle
transformOrigin = TransformOrigin(0f, 0f)
}
)
}
And here is the my usage in horizontal pager:
@OptIn(ExperimentalFoundationApi::class)
@Composable
fun HorizontalPagerWithZoomableContent() {
val pagerState = rememberPagerState()
HorizontalPager(
state = pagerState,
modifier = Modifier
.border(4.dp, Color.Red, RoundedCornerShape(36.dp))
.clip(RoundedCornerShape(36.dp)),
pageCount = 4,
) { pageIndex ->
Box (modifier = Modifier.fillMaxSize(), contentAlignment = Alignment.Center){
DoubleTapZoom()
}
}
}