英文:
Absolutely position an element inside a Column in Jetpack Compose
问题
以下是翻译好的部分:
我正在尝试创建一个日历的日视图,就像这样(只看单个日期列):
这是我的方法:
- 绘制一个
LazyColumn
以呈现小时 - 绘制事件块并绝对定位它们
不幸的是,我无法使其运行,并且在这个主题上也找不到太多信息。我设法将事件块绝对定位到正确的位置,但只有使用Column
,事件块本身会占据Column
开头的空间,这使它看起来像是在顶部使用了很多边距。
这是我的代码和结果:
val CALENDAR_HOUR_HEIGHT = 200.dp;
@Composable
fun CreateScreen() {
Box {
Column(
modifier = Modifier.verticalScroll(
rememberScrollState(),
)
) {
Box(
Modifier
// 示例,将块移动到2小时
.absoluteOffset(y = CALENDAR_HOUR_HEIGHT * 2)
.fillMaxWidth()
.height(200.dp)
.background(
color = MaterialTheme.colorScheme.primary,
)
)
// 绘制24小时线
repeat(24) {
Box(
Modifier
.fillMaxWidth()
.height(CALENDAR_HOUR_HEIGHT)
.border(
width = 1.dp,
color = MaterialTheme.colorScheme.onSurface,
shape = getBottomLineShape(3.dp.value),
)
)
}
}
}
}
fun getBottomLineShape(bottomLineThickness: Float) : Shape {
return GenericShape { size, _ ->
// 1) 左下角
moveTo(0f, size.height)
// 2) 右下角
lineTo(size.width, size.height)
// 3) 右上角
lineTo(size.width, size.height - bottomLineThickness)
// 4) 左上角
lineTo(0f, size.height - bottomLineThickness)
}
}
这是它的外观,注意顶部的大“边距”,这是事件块占用的空间:
英文:
I'm trying to create a calendar day view, like this (only take a look at a single day column):
Here's my approach:
- Draw a
LazyColumn
that renders the hours - Draw the event blocks and position them absolutely
Unfortunately I can't get this to run and couldn't find much information on this topic either. I managed to position the event block absolutely to the correct spot, but only with Column
and the event block itself takes space up at the beginning of the Column
, which makes it look like it uses a lot of margin at the top.
Here's my code and the result:
val CALENDAR_HOUR_HEIGHT = 200.dp;
@Composable
fun CreateScreen() {
Box {
Column(
modifier = Modifier.verticalScroll(
rememberScrollState(),
)
) {
Box(
Modifier
// Example, move block to 2 hours
.absoluteOffset(y = CALENDAR_HOUR_HEIGHT * 2)
.fillMaxWidth()
.height(200.dp)
.background(
color = MaterialTheme.colorScheme.primary,
)
)
// Draw 24 hours lines
repeat(24) {
Box(
Modifier
.fillMaxWidth()
.height(CALENDAR_HOUR_HEIGHT)
.border(
width = 1.dp,
color = MaterialTheme.colorScheme.onSurface,
shape = getBottomLineShape(3.dp.value),
)
)
}
}
}
}
fun getBottomLineShape(bottomLineThickness: Float) : Shape {
return GenericShape { size, _ ->
// 1) Bottom-left corner
moveTo(0f, size.height)
// 2) Bottom-right corner
lineTo(size.width, size.height)
// 3) Top-right corner
lineTo(size.width, size.height - bottomLineThickness)
// 4) Top-left corner
lineTo(0f, size.height - bottomLineThickness)
}
}
Here's what it looks like, notice the big "margin" at the top, this is the event block taking up space:
答案1
得分: 1
我认为你可能需要一种自定义布局。也许这可以帮助?
https://danielrampelt.com/blog/jetpack-compose-custom-schedule-layout-part-1/
Android开发者还有一些关于绘图和布局的很好的视频。这是我喜欢的一个:
https://youtu.be/1yiuxWK74vI,还可以查看:https://github.com/android/compose-samples/tree/main/JetLagged
英文:
I think that you'll probably need some sort of custom layout. Maybe this will help?
https://danielrampelt.com/blog/jetpack-compose-custom-schedule-layout-part-1/
Android Developers also has some really good vids on drawing & layouts. Here's one I like:
https://youtu.be/1yiuxWK74vI, and also check out: https://github.com/android/compose-samples/tree/main/JetLagged
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论