在 Jetpack Compose 中设置平移限制

Set limits for pan in jetpack compose

我在尝试使用 Jetpack Compose 实现平移手势时遇到了困难。我的要求是平移手势,不要将加载的图像移出其原始边界。这可能吗?

@Composable
fun ZoomableImage() {
    val bitmapBytes = viewModel.page.observeAsState()
    val bitmap = bitmapBytes.value?.let {
        BitmapFactory.decodeByteArray(
            bitmapBytes.value, 0,
            it.size
        )
    }
    if (bitmap != null) {

        var scale by remember { mutableStateOf(1f) }
        var offsetX by remember { mutableStateOf(0f) }
        var offsetY by remember { mutableStateOf(0f) }

        Image(
            modifier = Modifier
                .scale(maxOf(1f, scale))
                .absoluteOffset {
                    IntOffset(offsetX.roundToInt(), offsetY.roundToInt())
                }
                .pointerInput(Unit) {
                    detectTransformGestures(
                        onGesture = { _, pan, gestureZoom, _ ->
                            scale *= gestureZoom
                            offsetX += pan.x
                            offsetY += pan.y
                        }
                    )
                }
                .fillMaxSize(),
            bitmap = bitmap.asImageBitmap(),
            contentDescription = null
        )
    }
}

我找到了答案。如果有人和我有同样的问题,欢迎使用 https://github.com/Tlaster/Zoomable.

如果您需要底层代码,这两个 类 可以完成工作:

https://github.com/Tlaster/Zoomable/blob/master/zoomable/src/main/java/moe/tlaster/zoomable/Zoomable.kt

https://github.com/Tlaster/Zoomable/blob/master/zoomable/src/main/java/moe/tlaster/zoomable/ZoomableState.kt