扩展组件 #
标准Fyne小部件提供最小的功能和定制,以支持大多数用例。在某些时候,可能需要具有更高级的功能。与其让开发人员构建自己的小部件,还可以扩展现有的小部件。
例如,我们将扩展图标小部件以支持被点击。为此,我们声明了一个新的结构,它嵌入了widget.Icon类型。我们创建了一个构造函数,它调用重要的ExtendeBaseWidget函数。
go
import (
"fyne.io/fyne/v2"
"fyne.io/fyne/v2/widget"
)
type tappableIcon struct {
widget.Icon
}
func newTappableIcon(res fyne.Resource) *tappableIcon {
icon := &tappableIcon{}
icon.ExtendBaseWidget(icon)
icon.SetResource(res)
return icon
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
WARNING
注意:像widget.NewIcon这样的小部件构造函数不能用于扩展,因为它已经调用了ExtendeBaseWidget。
然后我们添加新的函数来实现fyne.Tapable接口,添加这些函数后,每次用户点击我们的新图标时都会调用新的Tapped函数。所需的接口有两个函数,Tapped(*PointEvent)和TappedSecondary(*PointEvents),因此我们将添加这两个函数。
go
import "log"
func (t *tappableIcon) Tapped(_ *fyne.PointEvent) {
log.Println("I have been tapped")
}
func (t *tappableIcon) TappedSecondary(_ *fyne.PointEvent) {
}
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
我们可以使用一个简单的应用程序测试这个新的小部件,如下所示。
go
import (
"fyne.io/fyne/v2/app"
"fyne.io/fyne/v2/theme"
)
func main() {
a := app.New()
w := a.NewWindow("Tappable")
w.SetContent(newTappableIcon(theme.FyneLogo()))
w.ShowAndRun()
}
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12