自定义主题,Fyne笔记第10篇
目录
在其它应用中,用户也许见过切换黑白主题等场景,本文以此为切入点介绍如何在Fyne自定义主题。
分析接口
首先我们先看看fyne如何定义主题的接口
type Theme interface {
Color(ThemeColorName, ThemeVariant) color.Color
Font(TextStyle) Resource
Icon(ThemeIconName) Resource
Size(ThemeSizeName) float32
}
简单来说就是看情况给对于的颜色,字体,图标和尺寸。
如何自定义
自定义的关键在于,fyne在下属的theme保提供了默认主题,所以我们只需要声明一个实现此接口的结构体,对于这些方法,除了如背景切换黑白等需要自定义的,其它返回默认主题的值即可。
可自定义的选项可以在https://pkg.go.dev/fyne.io/fyne/v2@v2.7.4/theme#pkg-constants查看。
例子
package main
import (
"image/color"
"fyne.io/fyne/v2"
"fyne.io/fyne/v2/app"
"fyne.io/fyne/v2/container"
"fyne.io/fyne/v2/theme"
"fyne.io/fyne/v2/widget"
)
type myTheme struct {
dark bool
}
// 严格按照你提供的 Theme 接口实现:返回 color.Color
func (t *myTheme) Color(name fyne.ThemeColorName, variant fyne.ThemeVariant) color.Color {
if name == theme.ColorNameBackground {
if t.dark {
// 纯黑
return color.RGBA{R: 0, G: 0, B: 0, A: 255}
}
// 纯白
return color.RGBA{R: 255, G: 255, B: 255, A: 255}
}
// 其他颜色沿用默认主题
return theme.DefaultTheme().Color(name, variant)
}
func (t *myTheme) Font(style fyne.TextStyle) fyne.Resource {
return theme.DefaultTheme().Font(style)
}
func (t *myTheme) Icon(name fyne.ThemeIconName) fyne.Resource {
return theme.DefaultTheme().Icon(name)
}
func (t *myTheme) Size(name fyne.ThemeSizeName) float32 {
return theme.DefaultTheme().Size(name)
}
func main() {
app := app.New()
// 初始化单个自定义主题
themeInst := &myTheme{dark: false}
app.Settings().SetTheme(themeInst)
win := app.NewWindow("自定义主题切换黑白")
win.Resize(fyne.NewSize(400, 300))
btn := widget.NewButton("切换背景", func() {
themeInst.dark = !themeInst.dark
})
win.SetContent(container.NewCenter(btn))
win.ShowAndRun()
}