NotePublic/Software/Development/Language/Go/Package/GioUI/GioUI_概览.md

3.8 KiB
Raw Blame History

GioUI 概览

GioUI 是一款支持多平台的 Go GUI 库,支持 Linux、macOS、Windows、Android、iOS、FreeBSD、OpenBSD 和 WebAssembly。

1. 安装

GioUI 的安装与其他 Go 包一样,只要在源码中引用,然后通过 go 命令即可自动下载:

源码中引用“gioui”后

go mod tidy

即可自动安装。

另外也可以到官方网站下载源码或获取帮助文档:

编译 Android 程序时需要用到 gogio 工具,需要通过如下命令安装:

go install gioui.org/cmd/gogio@latest

1.1. Android 开发环境配置

如果需要开发基于 GioUI 的 Android 程序,需要先搭建好 Android 开发环境:

  1. 安装 Android Studio 后通过 IDE 安装 Android SDK>31 ,配置 ANDROID_SDK_ROOT。ANDROID_SDK_ROOT 可在 Android Studio->More Actions->SDK Manager->Android SDK Location 中获取到;

    export ANDROID_SDK_ROOT=/home/rick/Android/Sdk
    
  2. 进入 Android Studio->More Actions->SDK Manager->SDK Tools 勾选 NDK我使用的是 25.1.893xxxx 版本);

  3. 当前使用的 GioUI commit id 为 dee53b36该版本仅支持 OpenJDK 1.8,与之对应的版本是 OpenJDK 8因此需要下载 openjdk-8u42-b03-windows-i586-14_jul_2022.zip 并进行安装(官网地址)。配置 JAVA_HOME 并将 %JAVA_HOME%\bin 添加到系统 PATH 中。

    sudo pacman -S jdk8-openjdk jre8-openjdk
    
  4. 配置好后通过命令行输入:

    java -version
    

    进行版本验证。

2. PC 示例

创建模块:

go mod init gio.test

main 包代码:

package main

import (
    "image/color"
    "log"
    "os"

    "gioui.org/app"
    "gioui.org/font/gofont"
    "gioui.org/io/system"
    "gioui.org/layout"
    "gioui.org/op"
    "gioui.org/text"
    "gioui.org/widget/material"
)

func main() {
    go func() {
        w := app.NewWindow()
        err := run(w)
        if err != nil {
            log.Fatal(err)
        }
        os.Exit(0)
    }()
    app.Main()
}

func run(w *app.Window) error {
    th := material.NewTheme(gofont.Collection())
    var ops op.Ops
    for {
        e := <-w.Events()
        switch e := e.(type) {
        case system.DestroyEvent:
            return e.Err
        case system.FrameEvent:
            gtx := layout.NewContext(&ops, e)

            title := material.H1(th, "Hello, Gio")
            maroon := color.NRGBA{R: 127, G: 0, B: 0, A: 255}
            title.Color = maroon
            title.Alignment = text.Middle
            title.Layout(gtx)

            e.Frame(gtx.Ops)
        }
    }
}

编译命令:

go mod tidy
go run .
# Windows 下运行时不弹出命令行窗口.
go build -ldflags "-s -w -H=windowsgui -extldflags=-static"

2.1. PC 示例说明

调用 app.NewWindow() 将创建新的窗体。调用 app.Main() 将阻塞至窗体退出。

通过 w.Events() 可以接收窗体事件消息。system.DestroyEvent 为窗体析构消息system.FrameEvent 为窗体绘制请求消息。

需要绘制的控件需要像压栈那样装入 Ops 的 Context最后调用 e.Frame(gtx.Ops) 绘制全部控件。

3. Android 示例

git clone https://git.sr.ht/~eliasnaur/gio-example
cd gio-example
gogio -target android <module name>[/sub-directory] [-token <github token>]
# 如
gogio -target android gioui.org/example/kitchen

将生成 APK 文件,可通过手机安装或使用如下命令:

adb install kitchen.apk

4. 外部参考资料

  1. GUI With Gio
  2. gio中文乱码解决方式