go - 如何在 Gioui(Golang)中绘制具有相同大小(正方形)元素的网格?
问题描述
我已经使用 Gioui 一段时间了,我真的很喜欢它!我一直在尝试绘制一个由大小相同的正方形组成的网格。这是我一直在使用的代码:
C = layout.Context D = layout.Dimensions
func DisplayGrid(gtx C) D {
var rows []layout.FlexChild
for i := 0; i < gridRows; i++ {
rows = append(rows,
layout.Flexed(gridRowWeight, func(gtx C) D {
return drawRow(gtx)
}),
)
}
return layout.Inset{
Top: unit.Dp(0),
Left: unit.Dp(8),
Right: unit.Dp(8),
Bottom: unit.Dp(8),
}.Layout(gtx, func(gtx C) D {
return layout.Flex{Axis: layout.Vertical, Alignment: layout.Alignment(layout.Center)}.Layout(gtx, rows...)
})
}
func drawRow(gtx C) D {
var columns []layout.FlexChild
for i := 0; i < gridColumns; i++ {
columns = append(columns,
layout.Flexed(gridColumnWeight, func(gtx C) D {
return layout.UniformInset(unit.Dp(2)).Layout(gtx, func(gtx C) D {
return colorBox(gtx, gtx.Constraints.Max, cellColor)
})
}),
)
}
return layout.Flex{Axis: layout.Horizontal}.Layout(gtx, columns...)
}
func colorBox(gtx C, size image.Point, color color.NRGBA) D {
defer op.Save(gtx.Ops).Load()
var newSize image.Point
if size.X < size.Y {
newSize = image.Point{
X: size.X,
Y: size.X,
}
} else {
newSize = image.Point{
X: size.Y,
Y: size.Y,
}
}
clip.Rect{Max: newSize}.Add(gtx.Ops)
paint.ColorOp{Color: color}.Add(gtx.Ops)
paint.PaintOp{}.Add(gtx.Ops)
return layout.Dimensions{Size: newSize}
}
我让所有 flex 元素成为正方形的方法是抓住layout.Constraints.Max
flex 元素的大小并将其设置为两个维度中 X 和 Y 中的最小值。这最终看起来像这样:
这不是我想要的,我希望所有方块都具有相同的大小。如果我在 Y 维度上稍微缩放窗口,我会得到以下结果,这与我的设想更接近,除了底行:
有没有人对我如何实现每个元素都具有相同大小和正方形的网格布局有任何提示?
解决方案
推荐阅读
- html - 如何修复“使用 CSS Clip-Path 悬停时 div 的背景问题”
- amazon-dynamodb - 如果项目在本地 dynamodb 中超过 1350+,则无法正确插入
- javascript - Nodejs无法减去数字
- python - 使用 x,y 坐标从 Pandas 数据框中删除数据并插入到另一个数据框中
- redux - redux 复杂对象不会触发更新
- terraform - Terraform - 模块之间的依赖关系
- javascript - 在 django 模板 forloop 中使用时在 javascript 中选择按钮
- r - 是否可以在 geom_text 中添加希腊字母索引?
- javascript - Meteor JS 在 findOne 函数中返回未定义的对象
- javascript - 如何在 UI5 中使用 JSON 模型属性作为 OData v4 列表绑定的路径