App和Windows,Fyne笔记第2篇
目录
这是我的Fyne学习笔记系列第2篇。
App
在Fyne里,许多关键的类型是接口定义的,有些特定功能X有两个方法,SetX是设置,X是获取。
App类型本身是一个包含多个方法的接口。
除了上一篇已经写过的NewWindow来创建窗口,还有这些与整个程序相关的功能的方法:
打开浏览器
a := app.New() //fyne.io/fyne/v2/app
u, _ := url.Parse("https://to-link.com")
a.OpenURL(u)
可以将指定链接在系统默认浏览器打开。
应用程序图标
例如Windows的任务栏,Android的桌面对每个程序都有一个应用程序图标。
app对此提供X/SetX风格的API来获取/设置。
方法签名是
Icon() Resource
SetIcon(Resource)
Resource也是一个接口,有两个方法获取资源名和资源内容([]byte)。
事件循环
Run方法启动UI渲染等的事件循环,Quit方法结束事件循环并正常关闭所有Window退出。
注意Quit在移动设备会终止事件循环,从前使得页面无响应,但不会退出。
系统相关
发送通知
a.SendNotification(fyne.NewNotification("title", "content"))
可以发出一个系统通知,在windows是右下角小卡片的Toast通知,在安卓是悬浮通知和状态栏通知。
剪切板
a.Clipboard().Content() // string type
可以获取系统剪切板的内容
Clipboard返回值也是一个X/SetX风格方法的接口,所以也可以设置剪切板内容。
文件操作
a.Storage()
返回一个支持对系统文件进行打开,读写,创建,删除等操作的接口。不过在电脑go std的os包也够用,似乎这个接口在移动设置更有用。
用户配置
Preferences方法返回一个接口,可以将自定义用户配置以键值对的json格式,存在系统用户目录里。
生命周期
Lifecycle方法返回一个接口,可以设置前后台切换与启动停止四种情况发生时的hook。
例如
a.Lifecycle().SetOnStopped(func() {
a.SendNotification(fyne.NewNotification("通知", "程序关闭"))
time.Sleep(3 * time.Second)
})
可以实现程序在退出前通知用户的效果。
还是一些方法不太实用,不做笔记。
Window
标题
Title也是一个X/SetX风格的方法,可以设置和获取通常窗口标题,Windows系统通常在左上角显示。
全屏
FullScreen也是一个X/SetX风格的方法,可以设置是否全屏并获取当前状态。
注意:在安卓窗口默认全屏。
大小
固定大小
FixedSize也是一个X/SetX风格的方法,可以设置和获取是否允许用户调整窗口大小。
调整大小
Resize方法可以调整窗口大小。
示例
w := a.NewWindow("Hello World")
w.Resize(fyne.NewSize(100,100))
布局
居中
CenterOnScreen可以将窗口放在屏幕正中间。
内边距
Padded也是一个X/SetX风格的方法,设置和获取窗口是否设置内边距,以防止组件与窗口边缘接触
SetMaster
这个方法指示当该窗口关闭时,App退出。
MainMenu
这也是一个X/SetX风格的方法,可以设置获取类似Vs Code那种屏幕顶部的,文件,编辑等顶级菜单。
完整示例
package main
import (
"fmt"
"fyne.io/fyne/v2"
"fyne.io/fyne/v2/app"
"fyne.io/fyne/v2/container"
"fyne.io/fyne/v2/widget"
)
func main() {
// 1. 创建Fyne应用实例和窗口
myApp := app.New()
myWindow := myApp.NewWindow("Fyne Top Level Menu 示例")
myWindow.Resize(fyne.NewSize(400, 300))
// 2. 构造「文件」顶层菜单的菜单项
// 新建:Label+Action回调
itemNew := fyne.NewMenuItem("新建", func() {
fmt.Println("点击了【文件】→【新建】")
})
// 保存:Label+Action回调
itemSave := fyne.NewMenuItem("保存", func() {
fmt.Println("点击了【文件】→【保存】")
})
// 退出:Label+Action回调(关闭应用)
itemQuit := fyne.NewMenuItem("退出", func() {
myApp.Quit()
})
// 构造「文件」顶层菜单:fyne.NewMenu(菜单名称, 菜单项1, 菜单项2, ...)
menuFile := fyne.NewMenu("文件", itemNew, itemSave, itemQuit)
// 3. 构造「编辑」顶层菜单的菜单项
itemCopy := fyne.NewMenuItem("复制", func() {
fmt.Println("点击了【编辑】→【复制】")
})
itemPaste := fyne.NewMenuItem("粘贴", func() {
fmt.Println("点击了【编辑】→【粘贴】")
})
// 构造「编辑」顶层菜单
menuEdit := fyne.NewMenu("编辑", itemCopy, itemPaste)
// 4. 构造根菜单(主菜单)并设置为应用的顶层菜单
// fyne.NewMainMenu(顶层菜单1, 顶层菜单2, ...):专门用于创建顶层菜单的根容器
mainMenu := fyne.NewMainMenu(menuFile, menuEdit)
// 5. 设置窗口内容并运行
content := container.NewVBox(widget.NewLabel("Fyne顶层菜单示例:点击窗口顶部的菜单试试!"))
myWindow.SetContent(content)
myWindow.SetMainMenu(mainMenu)
myWindow.ShowAndRun()
}
通过
if desk, ok := a.(desktop.App); ok { // "fyne.io/fyne/v2/driver/desktop"
desk.SetSystemTrayMenu(menuFile)
}
还可以设置系统托盘菜单,仅限桌面操作系统。
关闭hook
SetOnClosed和SetCloseIntercept设置hook在窗口已关闭与窗口被点击右上角X后时运行。
SetCloseIntercept使用这个方法,如果想单独关闭窗口,必须自行调用Window.Close方法。
显示操作
Show、Hide、Close、ShowAndRun四个方法就像字面意思那样改变窗口的显示情况。
Content也是一个X/SetX风格的方法,处理显示的内容。
Canvas提供绘图的画布上下文,可以利用它为窗口设置按键处理程序等。