如何知道当前应用于 Compose(或 View)Canvas 的当前平移、旋转和缩放?

问题描述 投票:0回答:1

假设我的撰写屏幕上有以下画布:

Canvas(modifier = Modifier.fillMaxSize()) {
    withTransform(
        {
            transform(matrix = SOME_TRANSFORMATION_MATRIX_HERE)
        }
    ) {
        withTransform(
            {
                transform(matrix = SOME_OTHER_TRANSFORMATION_MATRIX_HERE)
            }
        ) {
            // How to know the current canvas'
            //  - translation;
            //  - rotation, and;
            //  - scale?
        }
    }
}

是否可以通过

DrawScope
知道这些变换?如果可以的话,怎样才能做到呢?

android android-jetpack-compose android-view android-canvas android-jetpack-compose-canvas
1个回答
1
投票

要在 Jetpack Compose 中访问转换矩阵及其组件,您通常需要实现自己的转换逻辑并维护可组合函数中的状态。

以下是如何在 Compose 中维护和访问转换状态的修订示例:

@Composable
fun MyCanvas() {
    var translationX by remember { mutableStateOf(0f) }
    var translationY by remember { mutableStateOf(0f) }
    var rotationDegrees by remember { mutableStateOf(0f) }
    var scaleX by remember { mutableStateOf(1f) }
    var scaleY by remember { mutableStateOf(1f) }

    Canvas(modifier = Modifier.fillMaxSize()) {
        withTransform({
            // Apply transformations here
            translate(left = translationX, top = translationY)
            rotate(degrees = rotationDegrees)
            scale(scaleX, scaleY)
        }) {
            // Drawing code

            // Update transformation values as needed
            translationX = 100f
            translationY = 50f
            rotationDegrees = 45f
            scaleX = 1.5f
            scaleY = 1.5f

            // Now, you can access the current transformation values
            val currentTranslationX = translationX
            val currentTranslationY = translationY
            val currentRotationDegrees = rotationDegrees
            val currentScaleX = scaleX
            val currentScaleY = scaleY
        }
    }
}

在这种方法中,我们将转换属性维护为可变状态变量,当您想要更新它们时,可以在 Composable 函数中执行此操作。这将允许您将转换应用于

Canvas
并访问其当前值。

Jetpack Compose 不提供对

Canvas
DrawScope
的转换状态的直接访问,因此您需要自己处理状态。

© www.soinside.com 2019 - 2024. All rights reserved.