Go Gio 實戰:煮蛋計時器的實現 03— 按鈕

大家好,我是程序員幽鬼。

上篇文章介紹了空窗口的實現。今天看看如何控制窗口,比如標題、大小等。

01 目標

GUI 程序,按鈕是少不了的,對按鈕點擊事件的響應,是必須掌握的知識點。通過本文的學習,可以掌握 GUI 事件響應的編程方法。

本節效果如下:

圖片

A button

02 主要內容

本節將介紹許多新組件,不過不會太深入細節,而是專注於程序的整體結構。雖然只是增加按鈕,但需要導入不少相關新包,因此需要花點時間瞭解下。之後會看看如何聯合 operationswidgets 來製作一個按鈕。

最後,我們談到了 Material Design[1],這是一個完善的用戶界面框架(Google 出品的),也可以在 Gio 中使用。

03 需要用的到包

本節會導入如下包:

import (
  "gioui.org/app"
  "gioui.org/font/gofont"
  "gioui.org/io/system"
  "gioui.org/layout"
  "gioui.org/op"
  "gioui.org/unit"
  "gioui.org/widget"
  "gioui.org/widget/material"
)

對這些包做一個說明,其中 appunit 之前有介紹過,因此介紹其他的包。

  1. 具有狀態的實際小部件

  2. 小部件的繪製,完全無狀態

04 功能實現

看看本文開頭提到的按鈕功能如何實現,代碼如下:

func main() {
 go func() {
  // 創建一個新窗口
  w := app.NewWindow(
   app.Title("煮蛋計時器"),
   app.Size(unit.Dp(400), unit.Dp(600)),
  )

  // ops 表示 UI 上的操作
  var ops op.Ops

  // startButton 時候一個可點擊的小部件
  var startButton widget.Clickable

  // th 定義 material design(材料設計)的風格
  th := material.NewTheme(gofont.Collection())

  // 循環監聽窗口上的事件
  for e := range w.Events() {

   // 監聽事件的類型
   switch e := e.(type) {

   // 當應用程序需要重新渲染是發送該事件
   case system.FrameEvent:
    gtx := layout.NewContext(&ops, e)
    btn := material.Button(th, &startButton, "Start")
    btn.Layout(gtx)
    e.Frame(gtx.Ops)
   }
  }
 }()
 app.Main()
}

05 代碼詳解

主要關注這次新增的內容。

1)設置了三個新變量

2)事件循環代碼:

for e:= range w.Events()

是重點:

最後,記得實際動手運行看看。我們並沒有設置實際的按鈕點擊樣式,Gio 自動幫我們做了。

06 小結

本節雖然只是實現一個按鈕,但涉及到的知識點不少,關鍵代碼就幾行,但需要花些時間瞭解下相關 API 的用法,掌握使用 Gio 實現 GUI 的關鍵步驟和思路。

參考:https://jonegil.github.io/gui-with-gio/egg_timer/03_button.html。

參考資料

[1]

Material Design: https://material.io/

[2]

font/gofont: https://pkg.go.dev/gioui.org/font/gofont

[3]

io/system: https://pkg.go.dev/gioui.org/io/system

[4]

layout: https://pkg.go.dev/gioui.org/layout

[5]

Flexbox: https://pkg.go.dev/gioui.org/layout#Flex

[6]

Mozilla 上的介紹: https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Flexible_Box_Layout/Basic_Concepts_of_Flexbox

[7]

op: https://pkg.go.dev/gioui.org/op

[8]

宏: https://pkg.go.dev/gioui.org/op#MacroOp

[9]

widget: https://pkg.go.dev/gioui.org/widget

[10]

widget/material: https://pkg.go.dev/gioui.org/widget/material

[11]

gio-x: https://pkg.go.dev/gioui.org/x

[12]

更多材質組件: https://pkg.go.dev/gioui.org/x/component


歡迎關注「幽鬼」,像她一樣做團隊的核心。

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/qATfomFe2o9adBuf_fXtZw