fyne中的控件(widget)的位置有2种设置方式:
一是手动布局container.NewWithoutLayout()。
二是自动布局。
手动布局中的控件默认位置在所属布局的左上角,通过控件的Move方法,可以将控件放置在指定位置。
自动布局包括居中布局、垂直布局、水平布局、网格布局、最大布局等布局方式,自动布局中,控件的Move方法和Resize方法失效。
(一) 手动布局
package main
import (
"fyne.io/fyne/v2"
"fyne.io/fyne/v2/app"
"fyne.io/fyne/v2/container"
"fyne.io/fyne/v2/theme"
"fyne.io/fyne/v2/widget"
)
func main() {
a := app.NewWithID("fyne1")
w := a.NewWindow("fyne1")
w.SetIcon(theme.FyneLogo())
w.Resize(fyne.NewSize(1000, 700))
lbl1 := widget.NewLabel("lbl1")
// 默认lbl1在大小是文字大小加上padding,默认位置在所属布局的左上角
c := container.NewWithoutLayout(lbl1)
w.SetContent(c)
w.CenterOnScreen()
w.ShowAndRun()
}

package main
import (
"fyne.io/fyne/v2"
"fyne.io/fyne/v2/app"
"fyne.io/fyne/v2/container"
"fyne.io/fyne/v2/theme"
"fyne.io/fyne/v2/widget"
)
func main() {
a := app.NewWithID("fyne1")
w := a.NewWindow("fyne1")
w.SetIcon(theme.FyneLogo())
w.Resize(fyne.NewSize(1000, 700))
lbl1 := widget.NewLabel("lbl1")
lbl1.Move(fyne.NewPos(10,50))
lbl2 := widget.NewLabel("lbl2")
lbl2.Move(fyne.NewPos(10,100))
lbl3 := widget.NewLabel("lbl3")
lbl3.Move(fyne.NewPos(100,50))
lbl4 := widget.NewLabel("lbl4")
lbl4.Move(fyne.NewPos(100,100))
lbl5 := widget.NewLabel("lbl5")
lbl5.Move(fyne.NewPos(200,200))
c := container.NewWithoutLayout(lbl1,lbl2,lbl3,lbl4,lbl5)
w.SetContent(c)
w.CenterOnScreen()
w.ShowAndRun()
}

(二) 自动布局
1 居中布局
package main
import (
"fyne.io/fyne/v2"
"fyne.io/fyne/v2/app"
"fyne.io/fyne/v2/container"
"fyne.io/fyne/v2/theme"
"fyne.io/fyne/v2/widget"
)
func main() {
a := app.NewWithID("fyne1")
a.Settings().SetTheme(&theme1{})
w := a.NewWindow("fyne1")
w.SetIcon(theme.FyneLogo())
w.Resize(fyne.NewSize(1000, 700))
lbl1 := widget.NewLabel("Welcome to fyne! 欢迎学校fyne框架!")
w.SetContent(container.NewCenter(lbl1))
w.CenterOnScreen()
w.ShowAndRun()
}

2 水平布局
package main
import (
"fyne.io/fyne/v2"
"fyne.io/fyne/v2/app"
"fyne.io/fyne/v2/container"
"fyne.io/fyne/v2/theme"
"fyne.io/fyne/v2/widget"
)
func main() {
a := app.NewWithID("fyne1")
w := a.NewWindow("fyne1")
w.SetIcon(theme.FyneLogo())
w.Resize(fyne.NewSize(1000, 700))
lbl1 := widget.NewLabel("lbl1")
lbl1.Move(fyne.NewPos(10,50))
lbl2 := widget.NewLabel("lbl2")
lbl2.Move(fyne.NewPos(10,100))
lbl3 := widget.NewLabel("lbl3")
lbl3.Move(fyne.NewPos(100,50))
lbl4 := widget.NewLabel("lbl4")
lbl4.Move(fyne.NewPos(100,100))
lbl5 := widget.NewLabel("lbl5")
lbl5.Move(fyne.NewPos(200,200))
lbl1.Resize(fyne.NewSize(200,200))
// 控件的Move方法和Resize方法失效,从布局的左上角开始依次向右排列
c := container.NewHBox(lbl1,lbl2,lbl3,lbl4,lbl5)
w.SetContent(c)
w.CenterOnScreen()
w.ShowAndRun()
}

3 垂直布局
package main
import (
"fyne.io/fyne/v2"
"fyne.io/fyne/v2/app"
"fyne.io/fyne/v2/container"
"fyne.io/fyne/v2/theme"
"fyne.io/fyne/v2/widget"
)
func main() {
a := app.NewWithID("fyne1")
w := a.NewWindow("fyne1")
w.SetIcon(theme.FyneLogo())
w.Resize(fyne.NewSize(1000, 700))
lbl1 := widget.NewLabel("lbl1")
lbl2 := widget.NewLabel("lbl2")
lbl3 := widget.NewLabel("lbl3")
lbl4 := widget.NewLabel("lbl4")
lbl5 := widget.NewLabel("lbl5")
// 从容器的左上角开始依次向下排列
c := container.NewVBox(lbl1,lbl2,lbl3,lbl4,lbl5)
w.SetContent(c)
w.CenterOnScreen()
w.ShowAndRun()
}
