Golang/Fyne:如何检测窗口与画布的(重新)大小变化
Fyne图形应用Resize问题解决方案
Fyne完全适合开发曲线绘制这类图形应用,你的问题可以通过以下方式解决:
1. 捕获窗口/组件Resize事件
方法一:给NewWithoutLayout容器绑定尺寸变化回调
直接给你创建的无布局容器设置OnSizeChanged回调,就能捕获尺寸变化:
customContainer := container.NewWithoutLayout(yourDrawObjects...) customContainer.SetOnSizeChanged(func(newSize fyne.Size) { // 在这里处理尺寸变化逻辑,比如触发重绘 customContainer.Refresh() })
方法二:自定义Widget(更推荐)
实现自定义Widget可以更灵活地控制生命周期,重写Resize方法即可处理尺寸变化:
type SinWaveWidget struct { widget.BaseWidget } // 重写Resize方法,捕获尺寸变化 func (w *SinWaveWidget) Resize(size fyne.Size) { w.BaseWidget.Resize(size) // 更新绘制相关参数,比如曲线的范围、步长 w.Refresh() // 触发重绘 } // 实现CreateRenderer完成绘制逻辑 func (w *SinWaveWidget) CreateRenderer() fyne.WidgetRenderer { return &sinWaveRenderer{widget: w} } type sinWaveRenderer struct { widget *SinWaveWidget } func (r *sinWaveRenderer) Paint(canvas fyne.CanvasObject, g fyne.Canvas) { // 这里用r.widget.Size()获取当前实际尺寸,绘制正弦波 size := r.widget.Size() // 你的绘制逻辑... } // 实现Renderer的其他必要方法(Layout、Destroy、Objects)
2. 解决尺寸始终返回{1,1}的问题
出现这个问题是因为你调用Size()的时机不对:
- 初始化阶段组件还未完成布局,返回的是默认最小尺寸(1x1)。
- 正确的做法是在尺寸变化回调或自定义Widget的Resize/Refresh/Paint方法中调用
Size(),此时获取到的是布局后的实际尺寸。 - 另外,确保你的容器/Widget被添加到能自动填充窗口的布局中,比如用
container.NewMax(customContainer)包裹后设置为窗口内容,这样它会随窗口大小自动调整。
内容的提问来源于stack exchange,提问作者Ardjay
相关产品推荐
相关产品推荐

