托盘图标
托盘图标显示在 macOS 菜单栏、Windows 通知区或 Linux 的 StatusNotifierItem 宿主中。把图像放进 resources/,并在启动后创建图标。它与打包的应用图标不是同一张图。
#创建托盘图标
把一张小 PNG 随应用一起打包,再从安装后的路径创建图标:
native.App.GetPaths(func(paths *native.AppPaths, err error) {
if err != nil || paths == nil {
return
}
icon := filepath.Join(paths.ResourceDir, "trayTemplate.png")
native.Tray.Create(native.TrayIconOptions{
Icon: native.TemplateImage(icon),
Tooltip: "My App",
Menu: []native.TrayMenuItem{
{Label: "Show window", Click: showWindow},
{Type: "separator"},
{Label: "Quit", Click: func() { native.App.Quit(false, nil) }},
},
}, func(tray *native.TrayIcon, err error) {
if err != nil {
return
}
tray.OnEvent(func(event native.TrayEvent) {
if event.Kind == "click" {
showWindow()
}
})
})
})Tray.Create 会分配 id。在该句柄上调用 tray.Update、tray.ShowMenu 或 tray.Destroy。native.Tray 支持 macOS、Windows 和 Linux。
22×22 的 PNG 适合作为 1× 源图。需要视网膜菜单栏图像时,再画一张 44×44 的 trayTemplate@2x.png。
#模板图像
在 macOS 上,模板图像是单色蒙版。AppKit 只使用 alpha 通道,按菜单栏的浅色、深色和高亮外观重新着色。
文件名的主干以 Template 结尾(后面可以跟 @2x 或 @3x)时,会被当作模板图像:
resources/trayTemplate.png
resources/trayTemplate@2x.pngtrayTemplate.png 和 statusTemplate@2x.png 会匹配。emailTemplateIcon.png 不会。
文件名不符合约定时,使用 native.TemplateImage(path) 或设置 ImageSource.Template;也可以把标志强制设为关闭:
disabled := false
native.Desktop.SetDockIcon(&native.ImageSource{Path: iconPath, Template: &disabled})同一个 ImageSource 字段也用于窗口图标、程序坞图标、关于面板图标和菜单项图标。其他平台会保留该标志并忽略它。
#菜单与事件
托盘菜单是原生上下文菜单。操作项会调用 Click。在 OnEvent 上监听 click、double-click、enter、move、leave、menu-item 和 scroll。
ShowMenu 在 macOS 和 Windows 上于光标位置打开菜单。Linux 宿主自行呈现菜单,并拒绝该调用。
#平台说明
| 平台 | 宿主 | 模板图像 | ShowMenu |
|---|---|---|---|
| macOS | 菜单栏额外图标 | 由 AppKit 重新着色 | 支持 |
| Windows | 通知区 | 忽略 | 支持 |
| Linux | StatusNotifierItem | 忽略 | 不支持 |
Desktop.GetSupport 会报告 TrayIcons 和 ProgrammableTrayPopup。最多保留 32 个托盘图标。
