我正在为基于Compose for Desktop的应用程序开发UI布局
它包含几个复选框。
但是Compose for Desktop中没有将视图彼此对齐的功能。
在Android中,我们可以使用Constraint Layout
进行视图对齐,这非常简单。
但是如何为桌面合成呢?
这是我需要在桌面合成中设计的布局
下面是我在Main.kt
文件中编写的代码:但输出却大不相同。
由于没有针对桌面布局对齐和大小调整合成的官方文档/视频,请您提供指导。
@Composable
@Preview
fun App() {
MaterialTheme(
) {
BoxWithConstraints {
TwoColumnsLayout()
}
}
}
@Composable
fun TwoColumnsLayout() {
Row(Modifier.fillMaxSize()) {
Box(modifier = Modifier.fillMaxWidth(0.4f), contentAlignment = Alignment.Center) {
LeftPaneContent()
Divider(
color = Color.Blue,
modifier = Modifier
.fillMaxHeight()
.width(1.dp)
)
}
RightPaneContent()
}
}
@Composable
fun LeftPaneContent() {
Column(
Modifier.fillMaxSize(),
verticalArrangement = Arrangement.Center,
horizontalAlignment = Alignment.CenterHorizontally
) {
Text(text = "Left Pane First Text Box")
Text(text = "Left Pane Second Text Box")
Column {
Text(text = "Left Pane Radio button Box ", modifier = Modifier.padding(start = 8.dp))
val options = listOf("Option 1", "Option 2", "Option 3", "Option 4", "Option 5")
}
Text(text = "Left Pane bottom Text Box")
}
}
@Composable
fun RightPaneContent() {
Box(modifier = Modifier.fillMaxSize(), contentAlignment = Alignment.Center) {
Column(
Modifier.fillMaxSize(),
verticalArrangement = Arrangement.Center,
horizontalAlignment = Alignment.CenterHorizontally
) {
Text(text = "Right Pane First Text Box")
Text(text = "Right Pane Second Text Box")
Text(text = "Right Pane Third Text Box")
}
}
}
fun main() = application {
Window(
onCloseRequest = ::exitApplication,
state = WindowState(size = DpSize(1440.dp, 768.dp))
) {
App()
}
}
我不需要完整的代码。
我只是需要帮助的意见,根据上述设计的位置,对齐和大小。
我无法创建如上图所示的UI布局,也没有关于为桌面UI布局合成的文档。
2条答案
按热度按时间egmofgnx1#
ConstraintLayout
是你在相当罕见的情况下需要的,在大多数情况下,合成布局就足够了。您可以查看Compose Layout documentation,我认为它包含了丰富的类似布局示例-至少是其中的一部分。
你的代码中有很多错误,但是一般的方法是正确的,通过一些练习,你会发现使用它比使用
ConstraintLayout
更有趣。TwoColumnsLayout
-不太清楚为什么你决定把左边的内容和分隔符放在Box
中-它会把它们一个放在另一个上面。只要删除Box
并留下内容。Modifier.fillMaxWidth(0.4f)
可以直接移到LeftPaneContent
中-添加fillMaxHeight
并删除fillMaxSize
。或者,您可以创建一个Modifier
参数,以便可以从TwoColumnsLayout
控制它。Modifier.weight(1f)
仅用于Row
/Column
中的一个子视图,因此它占用了其他视图布局后的所有可用空间-更多信息请参见this answer。LeftPaneContent
-根据您的设计,如果您希望前两个文本大小相同,可能需要将它们放入Row
中-将Modifier.weight(1f)
添加到每个文本中。RightPaneContent
-与第3点相同:您可能需要将第二个和第三个视图放在Row
中。具有单个子视图的Box
是多余的,可以删除。App
内部的BoxWithConstraints
也不使用,可以删除。也可以根据需要使用
Spacer
在视图和Modifier.padding
之间添加间距。使用modifier作为最后一个参数也是一个好的做法-在这种情况下,当你需要添加/重新排序modifier时,你不必处理尾部逗号。这应该更接近您的预期布局:
ezykj2lf2#
不管第一个答案是什么,自2023年2月起,您不能在合成桌面中使用约束布局,请参见https://github.com/JetBrains/compose-jb/issues/353