Skip to content
On this page

创建一个自定义主题

应用程序能够加载自定义主题,这些主题可以对标准主题应用小的更改,或者提供完全独特的外观。主题需要实现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{})

通过这些更改,您可以应用自己的风格,进行小调整或提供完全自定义的应用程序!