各主流的編程語言都有其特有的 UI 庫,Go 語言也不甘落后。如果你不習慣用 Dart 或 JAVAscript 來開發跨平台的 GUI 應用,不妨來看看 Fyne,這個背靠強大易用的Go語言的UI工具庫,兼具性能和開發效率,在桌面和移動端都能構建用戶友好的應用。
Go語言UI庫
簡介
Fyne 是 fyne-io 組織在 Github 上開源的 Go 語言 UI 工具包,項目位於 https://github.com/fyne-io/fyne,目前版本為 v1.3.2。
Fyne 提供了簡單的方式來開發美觀、輕量和用戶友好的原生應用,擁有大量性能高且方便使用的控件和布局。Fyne 專注於設計和可用性,控件能夠充分滿足用戶對於交互的期待,並為開發者提供清晰的功能和接口。Fyne 易於安裝,無須為各種復雜的依賴煩惱。而 Go 語言作為一個日漸流行的服務端語言,其較低的學習門檻和優秀的性能,使得 Fyne 具有更大的推廣空間。目前,Fyne 已經擁有大量的使用案例,廣受歡迎。
Fyne庫 - 為桌面和移動端構建美觀應用
安裝
Fyne 使用 Go 語言開發,需要 Go 1.12 或以上,使用 go get 安裝:
go get fyne.io/fyne
同時,你還需要一個 C語言編譯器來編譯平台相關的圖形驅動。對於 windows 平台,Cygwin、TDM-GCC 和 MSYS2(MingW-w64)都可以使用。在 linux 平台,則需安裝對應平台的圖形驅動,如在 Ubuntu / Debian 中可以使用命令
sudo apt-get install golang gcc libgl1-mesa-dev xorg-dev
想要開發 Android 應用,則需要安裝 Android SDK 和 Android NDK。而想要挨罰 macOS 或 IOS 應用,則需要 Xcode 進行開發。
示例
Fyne 提供了使用函數。或是使用結構體這兩套不同的接口風格,可以根據個人的編碼喜好選擇。我們來看 Fyne 的 Hello World 例子:
package main
import (
"fyne.io/fyne/App"
"fyne.io/fyne/widget"
)
func main() {
a := app.New()
w := a.NewWindow("Hello")
hello := widget.NewLabel("Hello Fyne!")
w.SetContent(widget.NewVBox(
hello,
widget.NewButton("Hi!", func() {
hello.SetText("Welcome :)")
}),
))
w.ShowAndRun()
}
代碼十分簡潔明了。首先,通過 app.New() 創建一個應用實例,並新建一個標題為 Hello 的窗口。然后,使用 widget.NewLabel 來創建一個便簽,並在窗口設置 垂直方向排列的vbox 布局,首先放置標簽,然后再放置一個新建的按鈕。按鈕注冊了一個點擊事件的回調函數,在點擊按鈕時會把標簽的文本更改為 Welcome。最后,運行並顯示窗口。
直接運行代碼:
go run hello.go
就會出現一個新的窗口,並顯示帶有一個標簽和一個按鈕的界面:
Fyne的Hello例子
默認的主題是暗色調風格的,如果想要配置為明亮色調的主題,可以設置環境變量
FYNE_THEME=light
就能得到一個明亮色調主題的界面:
Fyne明亮色調例子
在上面的代碼中,我們可以看到,控件的創建都是使用 New 之類的函數實現。Fyne 也提供了使用結構體的方式進行控件的創建,
package main
import (
"fyne.io/fyne"
"fyne.io/fyne/app"
"fyne.io/fyne/widget"
)
func main() {
a := app.New()
w := a.NewWindow("Hello")
w.SetContent(&widget.Box{Children: []fyne.CanvasObject{
&widget.Label{Text: "Hello Fyne!"},
&widget.Button{Text: "Quit", OnTapped: func() {
a.Quit()
}},
}})
w.ShowAndRun()
}
在一些情況下,結構體方式的風格可能更為清晰,可自行選擇。
Fyne 控件豐富,包括基本的按鈕、輸入框、表單、圖標、進度條、選擇框等。
package main
import (
"log"
"fyne.io/fyne/app"
"fyne.io/fyne/widget"
)
func main() {
myApp := app.New()
myWindow := myApp.NewWindow("Form Widget")
entry := widget.NewEntry()
textArea := widget.NewMultiLineEntry()
form := &widget.Form{
Items: []*widget.FormItem{
{"Entry", entry}},
OnSubmit: func() {
log.Println("Form submitted:", entry.Text)
log.Println("multiline:", textArea.Text)
myWindow.Close()
},
}
form.Append("Text", textArea)
myWindow.SetContent(form)
myWindow.ShowAndRun()
}
Fyne表單
Fyne 使用布局來控制控件的排列方式,包括 HBox(水平方向單行排列)、VBox(垂直方向單列排列)、Center(居中)、Grid(網格)、GridWrap(自適應的網格)、Border(各邊外的剩余空間)和 Max(最大填充)。
Grid布局
Fyne 的窗口控制十分方便,充分利用了 Go 語言的協程特性,完成了窗口的異步渲染和控制:
package main
import (
"time"
"fyne.io/fyne"
"fyne.io/fyne/app"
"fyne.io/fyne/widget"
)
func main() {
myApp := app.New()
myWindow := myApp.NewWindow("Hello")
myWindow.SetContent(widget.NewLabel("Hello"))
go showAnother(myApp)
myWindow.ShowAndRun()
}
func showAnother(a fyne.App) {
time.Sleep(time.Second * 5)
win := a.NewWindow("Shown later")
win.SetContent(widget.NewLabel("5 seconds later"))
win.Resize(fyne.NewSize(200, 200))
win.Show()
time.Sleep(time.Second * 2)
win.Hide()
}
在本例中,我們在一個窗口中新建了另一個窗口並進行渲染顯示,同時展示了包括控制大小、隱藏關閉等功能。
Fyne 還支持畫布功能,可以在畫布上進行自由渲染,實現更為復雜的圖形應用:
package main
import (
"fyne.io/fyne"
"fyne.io/fyne/app"
"fyne.io/fyne/canvas"
"fyne.io/fyne/theme"
"image/color"
"time"
)
func main() {
myApp := app.New()
myWindow := myApp.NewWindow("Canvas")
myCanvas := myWindow.Canvas()
text := canvas.NewText("Text", color.White)
text.TextStyle.Bold = true
myCanvas.SetContent(text)
go changeContent(myCanvas)
myWindow.Resize(fyne.NewSize(100, 100))
myWindow.ShowAndRun()
}
func changeContent(c fyne.Canvas) {
time.Sleep(time.Second * 2)
c.SetContent(canvas.NewRectangle(color.Black))
time.Sleep(time.Second * 2)
c.SetContent(canvas.NewLine(color.Gray{0x66}))
time.Sleep(time.Second * 2)
circle := canvas.NewCircle(color.White)
circle.StrokeWidth = 4
circle.StrokeColor = color.RGBA{0xff, 0x33, 0x33, 0xff}
c.SetContent(circle)
time.Sleep(time.Second * 2)
c.SetContent(canvas.NewImageFromResource(theme.FyneLogo()))
}
Fyne應用例子
更多
Fyne 的打包構建十分簡單,安裝 Fyne 配套的命令行工具
go get fyne.io/fyne/cmd/fyne
對應桌面端的應用,在確定好目標平台后就可以直接打包:
fyne package -os darwin -icon myapp.png
fyne package -os linux -icon myapp.png
fyne package -os windows -icon myapp.png
上述命令分別對應 macOS、Linux 和 Windows平台的構建,而 myapp.png 是應用的圖標文件。對於 macOS 平台,生成 app 應用文件;對於 Linux 平台,生成一個 tag.gz 文件,解包后可以放到 use/local/ 中使用;對於 Windows 平台,直接生成 exe 文件,可以直接運行。
而對於移動端平台,同樣十分簡單。在配置好了相應的環境后,運行
fyne package -os android -appID com.example.myapp -icon mobileIcon.png
fyne package -os ios - appID com.example.myapp -icon mobileIcon.png
則可以分別構建出 Android 平台的 apk 文件和 iOS 平台的 app 文件。
Fyne特性
總結
Fyne 作為一個 UI 工具包,依靠 Go 語言的優秀性能,尤其是 goroutine 協程的異步特性,實現了高性能、易開發的圖形界面應用。Fyne 的使用和設計十分現代化,通過簡單的命令行就能實現跨平台的開發和構建,安裝方便,平台兼容性好。
Fyne 並未基於現有的 UI 庫進行開發,而是直接使用不同平台的圖形驅動實現,完成了對跨平台 UI 的抽象,底層代碼值得研究。同時,Fyne 仍處於活躍開發階段,不少功能仍待實現,有興趣的開發者可持續關注項目。
