Fyne - Go語言的跨平台UI工具包


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

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 - Go語言的跨平台UI工具包

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 - Go語言的跨平台UI工具包

Fyne的Hello例子

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

FYNE_THEME=light

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

Fyne - Go語言的跨平台UI工具包

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 - Go語言的跨平台UI工具包

Fyne表單

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

Fyne - Go語言的跨平台UI工具包

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 - Go語言的跨平台UI工具包

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 - Go語言的跨平台UI工具包

Fyne特性

總結

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

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



Tags: Fyne    點擊:(744)  評論:(0)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM