我想获取 Jetpack Compose 中按钮(或其他元素)的高度。你知道如何获得吗?
我以以下可组合项为例:
@Composable
fun CustomCanvas(
) {
Box(
Modifier
.aspectRatio(1.33f)
.fillMaxWidth())
}
Run Code Online (Sandbox Code Playgroud)
我如何知道这个物体合成后的大小?
为什么我想知道:我正在尝试调整图像大小并将图像放置在画布上。这需要知道画布的大小。不,我不想对画布的大小进行硬编码。这个怎么做?
android android-jetpack-compose android-jetpack-compose-layout
在官方文档中可以看到有一个名为 SubcomposeLayout 的布局定义为
布局的模拟,允许在测量阶段对实际内容进行细分,例如使用测量期间计算的值作为子项组成的参数。
可能的用例:
您需要知道在组合过程中父级传递的约束,并且无法仅使用自定义 Layout 或 LayoutModifier 来解决您的用例。请参阅 androidx.compose.foundation.layout.BoxWithConstraints。
您希望在构建第二个子项时使用第一个子项的大小。
您想根据可用尺寸懒惰地组合您的项目。例如,您有一个包含 100 个项目的列表,您不必组合所有项目,而是只组合当前可见的项目(例如其中 5 个),并在组件滚动时组合下一个项目。
我用SubcomposeLayout关键字搜索了 Stackoverflow,但找不到任何相关内容,创建了这个示例代码,从官方文档中复制了大部分代码,以测试和了解它是如何工作的
@Composable
private fun SampleContent() {
Column(
modifier = Modifier
.fillMaxSize()
.verticalScroll(rememberScrollState())
) {
SubComponent(
mainContent = {
Text(
"MainContent",
modifier = Modifier
.background(Color(0xffF44336))
.height(60.dp),
color = Color.White
)
},
dependentContent = {
val size = it
println(" Dependent size: $size")
Column() {
Text(
"Dependent Content",
modifier = Modifier
.background(Color(0xff9C27B0)),
color = Color.White
)
}
}
)
}
} …Run Code Online (Sandbox Code Playgroud) 我有一个 LazyColumn,在其中我想显示一个包含两列的水平行,所以我尝试 LazyHorizontalGrid 来实现它。但我的应用程序崩溃了,但有例外 - IllegalArgumentException: LazyHorizontalGrid's height should be bound by parent。下面是我正在使用的代码,任何人都可以帮助修复它或通过任何其他方式我可以使一行有两列。
@Composable
fun HomeItem1() {
Surface(modifier = Modifier.nestedScroll(rememberViewInteropNestedScrollConnection())) {
LazyColumn {
//other contents
item {
LazyHorizontalGrid(
rows = GridCells.Fixed(3),
horizontalArrangement = Arrangement.spacedBy(16.dp),
verticalArrangement = Arrangement.spacedBy(16.dp)
) {
items(arrayList.size) {
Text(arrayList[it])
}
}
}
}
}
}
Run Code Online (Sandbox Code Playgroud) Android Jetpack Compose 包含width(),height()和size()布局修饰符以及requiredWidth(),requiredHeight()和requiredSize()。这两组修饰符有什么区别?我应该使用普通修饰符还是必需的修饰符?
android android-layout android-jetpack android-jetpack-compose
有没有一种有效的方法可以使自适应网格的项目高度等于运行时确定的宽度?基本上我想要方形的物品。
到目前为止我已经尝试过这个:
var size by remember { mutableStateOf(IntSize.Zero) }
Column( // item
...
.onSizeChanged {
size = it
}
.size(with(LocalDensity.current) {
size.width.toDp()
})
)
Run Code Online (Sandbox Code Playgroud)
但我是个新手,认为这可能是一项昂贵的操作。还有其他选择吗?