如何使用 Jetpack Compose 使 LinearProgressIndicator 宽度动态化

Posted

技术标签:

【中文标题】如何使用 Jetpack Compose 使 LinearProgressIndicator 宽度动态化【英文标题】:How to Make LinearProgressIndicator Width Dynamic With Jetpack Compose 【发布时间】:2021-12-19 04:40:51 【问题描述】:

我正在尝试使用 Compose 进行以下布局:

我遇到的问题是我无法使 LinearProgressIndicator 的宽度与 Text 1 可组合的宽度相同。这是我目前的实现:

@Composable
fun ExampleCard(
    modifier: Modifier = Modifier
) 
    MaterialTheme 
        Surface(color = Color(0xFFFFFFFF)) 
            Card(
                elevation = 5.dp,
                modifier = Modifier
                    .fillMaxWidth()
                    .padding(10.dp)
            ) 
                Column(modifier = Modifier.padding(10.dp)) 
                    Text(
                        text = "Card Title",
                        fontWeight = FontWeight.Bold,
                        fontSize = 24.sp
                    )
                    Row 
                        Column(
                            modifier = Modifier
                                .width(IntrinsicSize.Min)
                                .padding(end = 5.dp)
                        ) 
                            Text("Text 1")
                            LinearProgressIndicator(
                                progress = 0.5f,
                                modifier = Modifier.fillMaxWidth()
                            )
                        
                        Text(
                            text = "Text 2",
                            modifier = Modifier.weight(1f)
                        )
                    
                
            
        
    

这是结果:

正如您所见,LinearProgressIndicator 需要尽可能多的宽度,从而使父 Column 比 Text 1 可组合更宽。这个想法是 LinearProgressIndicator 应该与 Text 1 一样宽,并且随着 Text 1 的扩展,LinearProgressIndicator 也应该如此。请注意,我正在使用内部函数,因为它似乎是解决此问题的方法,但它不起作用,这可能是由于 LinearProgressIndicator 默认具有固定宽度:

@Composable
fun LinearProgressIndicator(
    ...
    modifier: Modifier = Modifier,
    ...
) 
    Canvas(
        modifier
            .progressSemantics(progress)
            .size(LinearIndicatorWidth, LinearIndicatorHeight)
            .focusable()
    ) 
        ...
    


private val LinearIndicatorWidth = 240.dp

我想知道如何使 LinearProgressIndicator 的宽度动态来完成该布局,这看起来很简单,但显然我错过了一些东西。

【问题讨论】:

【参考方案1】:

即使是维护者也不确定这是一个好的解决方案:

TODO:android 中目前有 3 种固定宽度,这应该灵活吗? Material说这里的宽度应该是240dp。

我认为您应该 create an issue 让他们知道您对此类功能感兴趣。

与此同时,您可以通过以下方式绕过它:

SubcomposeLayout(Modifier.padding(end = 5.dp))  constraints ->
    val textPlaceable = subcompose("Text") 
        Text("Text 1")
    [0].measure(constraints)
    val progressIndicatorPlaceable = subcompose("ProgressIndicator") 
        LinearProgressIndicator(
            progress = 0.5f,
        )
    [0].measure(constraints.copy(maxWidth = textPlaceable.width))
    layout(
        width = textPlaceable.width,
        height = textPlaceable.height + progressIndicatorPlaceable.height,
    ) 
        textPlaceable.place(0, 0)
        progressIndicatorPlaceable.place(0, textPlaceable.height)
    

【讨论】:

我按照您的建议创建了一个issue,所以我们将看看它会产生什么结果。另外,我正在考虑使用 Layout 可组合,但现在我看到通过使用 SubcomposeLayout 我可以根据其他可组合的大小调整可组合的大小,这最适合我的情况。非常感谢。

以上是关于如何使用 Jetpack Compose 使 LinearProgressIndicator 宽度动态化的主要内容,如果未能解决你的问题,请参考以下文章

Jetpack Compose“onSurface”颜色不起作用

Jetpack Compose ScrollableTabRow 如何调整最小宽度

全网都在用的Jetpack Compose ,最新进展,不来了解一下?

如何将 CameraView 与 Jetpack Compose 一起使用?

如何判断 jetpack-compose 分页是不是有效?

一起看 I/O | Jetpack Compose 中的新特性