首页 > 解决方案 > Android Jetpack Compose:如何在“盒子”中缩放图像?

问题描述

我将在一个框内构建一个可缩放的图像视图,就像第一个屏幕截图一样。但是当我放大图像时,它会开箱即用。有没有办法缩放图像,但保持大小?没有viewor fragmentbox似乎还不够。我期待图像变大,但仍然停留在红色框内,但放大后我得到了第二张截图。

放大之前 放大后

感谢 nglauber 和 Amirhosein,我得到了最终的解决方案,即在“框”(固定区域)内同时具有缩放和拖动功能,并将以下代码作为新屏幕截图,如下所示。

        val imageBitmap = imageResource(id = R.drawable.android)
        Image(
            modifier = Modifier
                .preferredSize(400.dp, 300.dp)
                .clip(RectangleShape)
                .zoomable(onZoomDelta = { scale.value *= it })
                .rawDragGestureFilter(
                    object : DragObserver {
                        override fun onDrag(dragDistance: Offset): Offset {
                            translate.value = translate.value.plus(dragDistance)
                            return super.onDrag(dragDistance)
                        }
                    })
                .graphicsLayer(
                    scaleX = scale.value,
                    scaleY = scale.value,
                    translationX = translate.value.x,
                    translationY = translate.value.y
                ),
            contentDescription = null,
            bitmap = imageBitmap
        )

在此处输入图像描述

标签: androidandroid-jetpack-compose

解决方案


这是我的解决方案...可能对某人有帮助...

@Composable
fun ZoomableImage() {
    val scale = remember { mutableStateOf(1f) }
    val rotationState = remember { mutableStateOf(1f) }
    Box(
        modifier = Modifier
            .clip(RectangleShape) // Clip the box content
            .fillMaxSize() // Give the size you want...
            .background(Color.Gray)
            .pointerInput(Unit) {
                detectTransformGestures { centroid, pan, zoom, rotation ->
                    scale.value *= zoom
                    rotationState.value += rotation
                }
            }
    ) {
        Image(
            modifier = Modifier
                .align(Alignment.Center) // keep the image centralized into the Box
                .graphicsLayer(
                    // adding some zoom limits (min 50%, max 200%)
                    scaleX = maxOf(.5f, minOf(3f, scale.value)),
                    scaleY = maxOf(.5f, minOf(3f, scale.value)),
                    rotationZ = rotationState.value
                ),
            contentDescription = null,
            painter = painterResource(R.drawable.dog)
        )
    }
}

推荐阅读