Skip to content
On this page

Canvas和Canvas画布对象

在Fyne中,画布是绘制应用程序的区域。每个窗口都有一个画布,您可以使用window.canvas()访问它,但通常您会在window上找到避免访问画布的函数。

可以在Fyne中绘制的一切都是CanvasObject的一种类型。这里的示例打开一个新窗口,然后通过设置窗口画布的内容来显示不同类型的基本图形元素。有许多方法可以定制每种类型的对象,如文本和圆圈示例所示。

除了使用Canvas.SetContent()更改显示的内容外,还可以更改当前可见的内容。例如,如果更改矩形的FillColour,则可以使用rect.refresh()请求刷新现有组件。

go
package main

import (
	"image/color"
	"time"

	"fyne.io/fyne/v2"
	"fyne.io/fyne/v2/app"
	"fyne.io/fyne/v2/canvas"
)

func main() {
	myApp := app.New()
	myWindow := myApp.NewWindow("Canvas")
	myCanvas := myWindow.Canvas()

	blue := color.NRGBA{R: 0, G: 0, B: 180, A: 255}
	rect := canvas.NewRectangle(blue)
	myCanvas.SetContent(rect)

	go func() {
		time.Sleep(time.Second)
		green := color.NRGBA{R: 0, G: 180, B: 0, A: 255}
		rect.FillColor = green
		rect.Refresh()
	}()

	myWindow.Resize(fyne.NewSize(100, 100))
	myWindow.ShowAndRun()
}

我们可以用相同的方式绘制许多不同的绘图元素,例如圆和文本。

go
func setContentToText(c fyne.Canvas) {
	green := color.NRGBA{R: 0, G: 180, B: 0, A: 255}
	text := canvas.NewText("Text", green)
	text.TextStyle.Bold = true
	c.SetContent(text)
}

func setContentToCircle(c fyne.Canvas) {
	red := color.NRGBA{R: 0xff, G: 0x33, B: 0x33, A: 0xff}
	circle := canvas.NewCircle(color.White)
	circle.StrokeWidth = 4
	circle.StrokeColor = red
	c.SetContent(circle)
}

组件

fyne.Widget是一种特殊类型的画布对象,具有与之相关联的交互元素。在Widget中,逻辑与其外观(也称为WidgetRenderer)不同。

小部件也是CanvasObject的类型,因此我们可以将窗口的内容设置为单个小部件。看看我们如何创建一个新的widget.Entry,并在本例中将其设置为窗口的内容。

go
package main

import (
	"fyne.io/fyne/v2/app"
	"fyne.io/fyne/v2/widget"
)

func main() {
	myApp := app.New()
	myWindow := myApp.NewWindow("Widget")

	myWindow.SetContent(widget.NewEntry())
	myWindow.ShowAndRun()
}