android - 如何在 Jetpack Compose 中限制图像平移到框的边缘?

标签 android android-jetpack-compose android-jetpack-compose-gesture

如何在 Compose 中限制图像平移到框的边缘?

我使用 pointerInput(Unit) { detectorTransformGestures { centroid, pan, Zoom,rotation -> }} 来控制缩放和平移。

当使用 if (scale.value == 1f) 0f else panOffsetX 将图像最小化到 1f 时,我正在解决此平移问题。我想对放大的图像执行相同的操作 (1f < scale <= 3f)

Box(
    modifier = Modifier
        .clip(RectangleShape)
        .fillMaxWidth()
        .background(Color.Gray)
        .pointerInput(Unit) {
            detectTransformGestures { centroid, pan, zoom, rotation ->
                val constraintZoom = when {
                    scale.value > 3f -> 3f
                    scale.value < 1f -> 1f
                    else -> (scale.value * zoom)
                }
                scale.value = constraintZoom
                panOffset += pan
                panOffsetX += pan.x
                panOffsetY += pan.y
                centroidOffset = centroid
                rotationState.value += rotation
            }
        }
) {
    Image(
        modifier = Modifier
            .align(Alignment.Center)
            .graphicsLayer(
                scaleX = maxOf(1f, minOf(3f, scale.value)),
                scaleY = maxOf(1f, minOf(3f, scale.value)),
                translationX = if (scale.value == 1f) 0f else panOffsetX,
                translationY = if (scale.value == 1f) 0f else panOffsetY,
            ),
        contentDescription = null,
        painter = painterResource(R.drawable.my_sample_image)
    )
}

最佳答案

技巧是使用您的可组合大小和缩放级别来限制它

val maxX = (size.width * (zoom - 1) / 2f)
val maxY = (size.height * (zoom - 1) / 2f)

offset = newOffset
offset = Offset(
    newOffset.x.coerceIn(-maxX, maxX),
    newOffset.y.coerceIn(-maxY, maxY)

全面实现

var zoom by remember { mutableStateOf(1f) }
var offset by remember { mutableStateOf(Offset.Zero) }
var size by remember { mutableStateOf(IntSize.Zero) }

修饰符

  val imageModifier = Modifier
        .fillMaxSize()
        .aspectRatio(4 / 3f)
        .clipToBounds()
        .pointerInput(Unit) {
            detectTransformGestures(
                onGesture = { _, gesturePan, gestureZoom, _ ->
                    
                    zoom = (zoom * gestureZoom).coerceIn(1f, 3f)
                    val newOffset = offset + gesturePan.times(zoom)
                    
                    val maxX = (size.width * (zoom - 1) / 2f)
                    val maxY = (size.height * (zoom - 1) / 2f)

                    offset = Offset(
                        newOffset.x.coerceIn(-maxX, maxX),
                        newOffset.y.coerceIn(-maxY, maxY)
                    )
                }
            )
        }
        .onSizeChanged {
            size = it
        }
        .graphicsLayer {
            translationX = offset.x
            translationY = offset.y
            scaleX = zoom
            scaleY = zoom
        }

关于android - 如何在 Jetpack Compose 中限制图像平移到框的边缘?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71810485/

相关文章:

android - ComposeView 抢走了 AndroidTV 内容的焦点

android - 如何在使用 PointerInput 修改器时添加点击时的波纹效果

android - 是否可以附加诸如 onClick 之类的事件处理程序,拖动到 Canvas 可组合项中绘制的内容或使用 drawBehind 修饰符?

android - Android 上的通知管理器问题

java - 如何解析嵌套 JSON 结果中的动态 JSON 键?

php - 如何在 php 中将 Android 签名数据分成单独的字符串

android - 如何在 Jetpack Compose 中创建垂直无限轮播?

android - Jetpack Compose 中的可扩展文本

android - 检测 Jetpack Compose 上的滑动方向

android - Android 中未发送调用