是否可以“缩放” Jetpack组成的任何小部件的宽度和高度?

时间:2020-09-27 21:03:13

标签: android android-jetpack android-jetpack-compose

我有一个Stack小部件,其中包含一个Box和一个Image。 随着状态的变化,我想按状态具有的任何值来缩放Box小部件,例如按2x。

我找不到有关在Modifier或Box属性上缩放窗口小部件的任何信息,因此我决定通过使用对我来说不理想的“ Modifier.size”来控制大小,从而对状态变化做出反应。

那么是否支持缩放小部件?还是我应该手动使用size属性?

-谢谢

attemptLogin

2 个答案:

答案 0 :(得分:2)

撰写1.0.0-alpha08

随着时间的流逝,有一个新的撰写版本,其中renames'drawLayer'到'graphicsLayer'并添加了一个新的scale修饰符(在下面使用'graphicsLayer')。

因此可组合的外观如下:

@Composable
fun Pointer(scale: Float, modifier: Modifier = Modifier) {
    Box(modifier) {
        Box(
            modifier = Modifier
                .matchParentSize()
                .scale(scale)
                .background(Color.Cyan, CircleShape)
        )
        Image(
            imageVector = Icons.Filled.Done,
            modifier = Modifier
                .align(Alignment.Center)
        )
    }
}

撰写1.0.0-alpha07(原始答案)

我相信您可以使用drawLayer修饰符来达到所需的行为。例如,一个简单的可组合对象,在其上方显示了一个可缩放的圆圈和一个不可缩放的图标:

@Composable
fun Pointer(scale: Float, modifier: Modifier = Modifier) {
    Box(modifier) {
        Box(
            modifier = Modifier
                .matchParentSize()
                .drawLayer(scaleX = scale, scaleY = scale)
                .background(Color.Cyan, CircleShape)
        )
        Image(
            asset = Icons.Filled.Done,
            modifier = Modifier
                .align(Alignment.Center)
        )
    }
}

和用法:

Pointer(
    scale = 1f,
    modifier = Modifier
        .background(Color.Magenta)
        .padding(25.dp)
        .preferredSize(50.dp)
        .align(Alignment.CenterHorizontally)
)

When scale = 1f

When scale = 2f

答案 1 :(得分:1)

我不想在乎盒子的大小,也不想明确保留它的引用

那将是一个问题。在Compose中,像Box()这样的小部件是无状态函数。您无法询问Box()的大小,而是需要使用合适的Box() 告诉 Modifier的大小。

“代码有多大”通常是固定值或规则,由代码(例如Modifier.size(200.dp))设置。只要该状态是State,您就应该能够使大小取决于您跟踪自己的状态,因此,当State发生变化时,Compose知道进行重新组合(再次调用函数) 。如果您走这条路线,那么缩放就需要检查当前的State值,应用缩放因子,并将结果用于新的State值。