首頁>技術>

各主流的程式語言都有其特有的 UI 庫,Go 語言也不甘落後。如果你不習慣用 Dart 或 Javascript 來開發跨平臺的 GUI 應用,不妨來看看 Fyne,這個背靠強大易用的Go語言的UI工具庫,兼具效能和開發效率,在桌面和移動端都能構建使用者友好的應用。

簡介

Fyne 是 fyne-io 組織在 Github 上開源的 Go 語言 UI 工具包,專案位於 https://github.com/fyne-io/fyne,目前版本為 v1.3.2。

Fyne 提供了簡單的方式來開發美觀、輕量和使用者友好的原生應用,擁有大量效能高且方便使用的控制元件和佈局。Fyne 專注於設計和可用性,控制元件能夠充分滿足使用者對於互動的期待,併為開發者提供清晰的功能和介面。Fyne 易於安裝,無須為各種複雜的依賴煩惱。而 Go 語言作為一個日漸流行的服務端語言,其較低的學習門檻和優秀的效能,使得 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 mainimport ( "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。最後,執行並顯示視窗。

直接執行程式碼:

預設的主題是暗色調風格的,如果想要配置為明亮色調的主題,可以設定環境變數

FYNE_THEME=light

就能得到一個明亮色調主題的介面:

在上面的程式碼中,我們可以看到,控制元件的建立都是使用 New 之類的函式實現。Fyne 也提供了使用結構體的方式進行控制元件的建立,

package mainimport (\t"fyne.io/fyne"\t"fyne.io/fyne/app"\t"fyne.io/fyne/widget")func main() {\ta := app.New()\tw := a.NewWindow("Hello")\tw.SetContent(&widget.Box{Children: []fyne.CanvasObject{\t\t&widget.Label{Text: "Hello Fyne!"},\t\t&widget.Button{Text: "Quit", OnTapped: func() {\t\t\ta.Quit()\t\t}},\t}})\tw.ShowAndRun()}

在一些情況下,結構體方式的風格可能更為清晰,可自行選擇。

Fyne 使用佈局來控制控制元件的排列方式,包括 HBox(水平方向單行排列)、VBox(垂直方向單列排列)、Center(居中)、Grid(網格)、GridWrap(自適應的網格)、Border(各邊外的剩餘空間)和 Max(最大填充)。

Fyne 的視窗控制十分方便,充分利用了 Go 語言的協程特性,完成了視窗的非同步渲染和控制:

package mainimport (\t"time"\t"fyne.io/fyne"\t"fyne.io/fyne/app"\t"fyne.io/fyne/widget")func main() {\tmyApp := app.New()\tmyWindow := myApp.NewWindow("Hello")\tmyWindow.SetContent(widget.NewLabel("Hello"))\tgo showAnother(myApp)\tmyWindow.ShowAndRun()}func showAnother(a fyne.App) {\ttime.Sleep(time.Second * 5)\twin := a.NewWindow("Shown later")\twin.SetContent(widget.NewLabel("5 seconds later"))\twin.Resize(fyne.NewSize(200, 200))\twin.Show()\ttime.Sleep(time.Second * 2)\twin.Hide()}

在本例中,我們在一個視窗中新建了另一個視窗並進行渲染顯示,同時展示了包括控制大小、隱藏關閉等功能。

Fyne 還支援畫布功能,可以在畫布上進行自由渲染,實現更為複雜的圖形應用:

package mainimport ( "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.pngfyne package -os linux -icon myapp.pngfyne 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.pngfyne package -os ios - appID com.example.myapp -icon mobileIcon.png

則可以分別構建出 Android 平臺的 apk 檔案和 iOS 平臺的 app 檔案。

總結

Fyne 作為一個 UI 工具包,依靠 Go 語言的優秀效能,尤其是 goroutine 協程的非同步特性,實現了高效能、易開發的圖形介面應用。Fyne 的使用和設計十分現代化,通過簡單的命令列就能實現跨平臺的開發和構建,安裝方便,平臺相容性好。

Fyne 並未基於現有的 UI 庫進行開發,而是直接使用不同平臺的圖形驅動實現,完成了對跨平臺 UI 的抽象,底層程式碼值得研究。同時,Fyne 仍處於活躍開發階段,不少功能仍待實現,有興趣的開發者可持續關注專案。

最新評論
  • 1 #

    就問能輸入中文嗎? L和W下都需要

  • 2 #

    如果沒有介面設計工具 一般人不怎麼考慮 複雜頁面很難畫的 別提用程式碼來實現了 畢竟個人開發精力有限 除非團隊吧

  • 3 #

    跟開發安卓一樣的搞法,不好用,如果是通過拖拽,然後再通過程式碼繫結,開發效率會更好,也更好的便於設計

  • 4 #

    太為難go了,桌面開發delphi不香嗎?

  • 5 #

    Go 用web做本地介面不香麼

  • BSA-TRITC(10mg/ml) TRITC-BSA 牛血清白蛋白改性標記羅丹明
  • Vue 3:全域性 API 被取消了?