import ...
data class ArtInfo(
val artId: Int,
val drawableRes: Int,
val title: String,
val author: String,
val year: Int,
)
class MainActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
enableEdgeToEdge()
setContent {
ComposeTheme {
Surface(
modifier = Modifier
.statusBarsPadding()
.navigationBarsPadding()
.fillMaxSize(),
color = MaterialTheme.colorScheme.onPrimary
) {
ArtSpaceApp()
}
}
}
}
}
@Composable
fun ArtSpaceApp(modifier: Modifier = Modifier) {
val arts = listOf(
...
)
var artState by remember {
mutableStateOf(arts[0])
}
fun navigateToNextArt() {
...
}
fun navigateToPreviousArt() {
...
}
Column(
modifier = modifier
.fillMaxSize()
.padding(horizontal = 24.dp),
verticalArrangement = Arrangement.SpaceBetween,
horizontalAlignment = Alignment.CenterHorizontally
) {
Spacer(modifier = Modifier.height(20.dp))
Art(imageResource = artState.drawableRes)
Spacer(modifier = Modifier.height(60.dp))
AboutArt(
title = artState.title,
author = artState.author,
year = artState.year
)
NavigationArts(
{ navigateToNextArt() },
{ navigateToPreviousArt() }
)
}
}
@Composable
fun Art(@DrawableRes imageResource: Int) {
Surface(
modifier = Modifier
.border(width = 32.dp, color = Color.White)
.shadow(elevation = 16.dp),
) {
Image(
painter = painterResource(id = imageResource),
contentDescription = null
)
}
}
@Composable
fun AboutArt(
modifier: Modifier = Modifier
.background(color = colorResource(id = R.color.background_about_art)),
title: String,
author: String,
year: Int,
) {
Surface(
modifier = modifier
.padding(16.dp)
) {
Column(
modifier = modifier
.fillMaxWidth()
) {
Text(
text = title,
fontSize = 24.sp,
fontWeight = FontWeight.W300,
)
Row {
Text(
text = author,
fontWeight = FontWeight.W800
)
Text(
text = " ($year)"
)
}
}
}
}
@Composable
fun NavigationArts(
navigateToNext: () -> Unit,
navigateToPrevious: () -> Unit,
) {
Row(
modifier = Modifier
.fillMaxWidth()
.padding(horizontal = 8.dp),
horizontalArrangement = Arrangement.SpaceBetween
) {
Button(onClick = ... }) {
Text(text = "Previous")
}
Button(onClick = ... }) {
Text(text = "Next")
}
}
}
问题是 Art(...) - 图像占据了所有垂直空间,没有为 AboutArt(...) - 图像描述和 NavigationArts(...) - 图像之间的导航按钮留下空间。


将 Art()、Spacer() 和 AboutArt() 包装在单独的 Column 容器中,以便导航按钮“钉”在屏幕底部。在Art()本身中,Surface容器必须包装在另一个容器中,否则modifier.shadow(elevation = 16.dp)阴影将不会显示。
我不会假装自己是最好的实现)
需要这样的放置
并且使签名始终可见,并使图片尺寸缩小 问题在于图片不知道可以承受多少高度。列不限制其大小。
Modifier.weight(1f)没有帮助,因为当应用于Surface它时,它会拉伸它的整个高度,如果应用于图片,导航将被压在标题上。您有太多嵌套块。我们删除不必要的东西
这是通过插槽的解决方案。
Spacer + padding如果您只能设置填充,那么组合就没有意义。还删除了不必要的嵌套Column->Column如果您需要显示小图片,那么标题可能太高,因此在 MyLayout 中您可以传递最小高度并执行以下操作
我将尝试使用 ConstraintLayout 进行相同的操作。如果有效,我会添加到答案中。