创建一个自定义主题
应用程序能够加载自定义主题,这些主题可以对标准主题应用小的更改,或者提供完全独特的外观。主题需要实现fyne.theme接口的功能,其定义如下:
go
type Theme interface {
Color(ThemeColorName, ThemeVariant) color.Color
Font(TextStyle) Resource
Icon(ThemeIconName) Resource
Size(ThemeSizeName) float32
}
为了应用主题更改,我们将首先定义一个实现此接口的新类型
定义你的主题
我们首先定义一个新类型作为我们的主题,一个简单的空结构将做到:
go
type myTheme struct {}
断言我们实现了一个接口,这样编译错误就更接近于定义类型,这是一个好主意。
go
var _ fyne.Theme = (*myTheme)(nil)
此时,您可能会看到编译错误,因为我们仍然需要实现方法,我们从颜色开始。
自定义颜色
Theme界面中定义的Color函数要求我们定义一种命名颜色,并为用户所需的变体提供提示(例如Theme.VariantLight或Theme.ViantDark)。在我们的主题中,我们将返回一种自定义背景颜色-使用不同的明暗值。
go
func (m myTheme) Color(name fyne.ThemeColorName, variant fyne.ThemeVariant) color.Color {
if name == theme.ColorNameBackground {
if variant == theme.VariantLight {
return color.White
}
return color.Black
}
return theme.DefaultTheme().Color(name, variant)
}
您将看到这里的最后一行引用了主题.DefaultTheme()来查找标准值。这允许我们提供自定义值,但当我们不想提供自己的值时,又回到标准主题。
当然,颜色比资源更简单,我们将其用于自定义图标。
重写默认图标
图标(和字体)使用fyne.Resource作为值,而不是简单的类型,如int(表示大小)或color.color表示颜色。我们可以使用fyne.NewStaticResource构建自己的资源,也可以传递使用资源嵌入创建的值
go
func (m myTheme) Icon(name fyne.ThemeIconName) fyne.Resource {
if name == theme.IconNameHome {
fyne.NewStaticResource("myHome", homeBytes)
}
return theme.DefaultTheme().Icon(name)
}
如上所述,如果不想提供特定的覆盖,我们将返回默认主题图标。
加载主题
在我们加载主题之前,您还需要实现Size和Font方法。如果您愿意使用默认值,可以只使用这些空实现。
go
func (m myTheme) Font(style fyne.TextStyle) fyne.Resource {
return theme.DefaultTheme().Font(style)
}
func (m myTheme) Size(name fyne.ThemeSizeName) float32 {
return theme.DefaultTheme().Size(name)
}
要设置应用程序的主题,您需要添加以下代码行:
go
app.Settings().SetTheme(&myTheme{})
通过这些更改,您可以应用自己的风格,进行小调整或提供完全自定义的应用程序!