Compose 放大缩小拖拽

51 阅读1分钟
@Composable
fun ImageBrowserItem(path: String) {
    var scale by remember { mutableStateOf(1f) }
    var offset by remember { mutableStateOf(Offset.Zero) }

    var state = rememberTransformableState { zoomChange, panChange, rotationChange ->
        scale *= zoomChange
        scale = scale.coerceIn(1f, 5f)
        offset += panChange
    }

    Surface(
        modifier = Modifier.fillMaxSize(),
        color = Color.Black
    ) {
        AsyncImage(
            model = path,
            contentDescription = "",
            contentScale = ContentScale.Fit,
            modifier = Modifier
                .transformable(state = state)
                .graphicsLayer(
                    scaleX = scale,
                    scaleY = scale,
                    translationX = offset.x,
                    translationY = offset.y
                )
                .pointerInput(Unit) {
                    detectTapGestures(
                        onDoubleTap = {
                            scale = if (scale <= 1f) 2f else 1f
                            offset = Offset.Zero
                        }
                    )

                    detectDragGestures(
                        onDragStart = { offset = Offset.Zero },
                        onDrag = { change, _ -> offset += change.positionChange() }
                    )
                }
        )
    }
}