在撰写桌面中,我们有 Dialog 和 AlertDialog。
如果使用Dialog,它没有父级,默认对齐屏幕中心。为了将其与窗口中心对齐,我们可以计算窗口和对话框中心点偏移之间的差异,并且需要为对话框开始位置添加偏移量:
fun getOffset(wState: WindowState, dState: DialogState): DpOffset {
val winCenterPoint = DpOffset(
wState.position.x + wState.size.width / 2,
wState.position.y + wState.size.height / 2
)
val dlgCenterPoint = DpOffset(
dState.position.x + dState.size.width / 2,
dState.position.y + dState.size.height /2
)
return winCenterPoint - dlgCenterPoint
}
但是这里有一个问题:如果未指定窗口或对话框大小,我们将无法计算偏移量。此外,如果窗口/对话框位于屏幕中央 - state.position 将返回 Alignment 而不是 Offset。
如果使用 AlertDialog,它会以父边界为中心。当我将自定义可组合对话框设置为按钮参数时,此抛出异常:
AlertDialog 基于 Popup 底层,但是当我为 Popup 设置相同的可组合项时,它不会崩溃,认为这是在窗口内测量的问题。
如果有人有更好的方法将对话框对齐到窗口中心,请分享您的知识。
您可以尝试将窗口居中,对话框应该居中,
val windowState = rememberWindowState(position = WindowPosition(Alignment.Center))
Window(onCloseRequest = ::exitApplication, state = windowState) {}