秋来冬风的博客

自定义主题,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()
}

评论区

评论加载中

Tags:
Categories: