<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          Go Gio 實(shí)戰(zhàn):煮蛋計(jì)時(shí)器的實(shí)現(xiàn) 02— 如何控制窗口

          共 2818字,需瀏覽 6分鐘

           ·

          2021-10-28 19:18

          上篇文章介紹了空窗口的實(shí)現(xiàn)。今天看看如何控制窗口,比如標(biāo)題、大小等。

          01 目標(biāo)

          本節(jié)的目標(biāo)是設(shè)置窗口標(biāo)題并控制窗口的大小。效果如下:

          控制標(biāo)題和窗口大小

          02 代碼

          基于上一節(jié)的代碼補(bǔ)充,因?yàn)槭录h(huán)部分可能 panic,這里在上節(jié)最后部分提到的代碼基礎(chǔ)上補(bǔ)充。

          package?main

          import?(
          ?"gioui.org/app"
          ?"gioui.org/io/system"
          ?"gioui.org/layout"
          ?"gioui.org/op"
          )

          func?main()?{
          ?go?func()?{
          ????w?:=?app.NewWindow(
          ??????app.Title("Egg?timer"),?//?設(shè)置標(biāo)題
          ??????app.Size(unit.Dp(400),?unit.Dp(600)),?//?控制大小
          ????)

          ????var?ops?op.Ops
          ??for?e?:=?range?w.Events()?{
          ???switch?e?:=?e.(type)?{
          ???case?system.FrameEvent:
          ????gtx?:=?layout.NewContext(&ops,?e)
          ????e.Frame(gtx.Ops)
          ???}
          ??}
          ??}()
          ??app.Main()
          }

          03 代碼詳解

          gioui.org/unit 實(shí)現(xiàn)了與設(shè)備無(wú)關(guān)的單位和值。文檔描述了各種單位:(做過(guò) Android 等開(kāi)發(fā)的應(yīng)該很熟悉)

          類型描述
          dp設(shè)備獨(dú)立像素 - 獨(dú)立于底層設(shè)備。
          sp縮放像素 - 用于文本大小
          px像素 - 用于實(shí)際設(shè)備的精度

          一般來(lái)說(shuō),dp是最常用的。它可以做到盡可能保持設(shè)備獨(dú)立性。所以,以上代碼,我們?cè)诳刂拼翱诖笮r(shí),使用了這個(gè)單位。

          上一節(jié),app.NewWindows() 我們沒(méi)有傳遞任何參數(shù),現(xiàn)在傳遞了。這表明,該函數(shù)接收可選參數(shù):

          func?NewWindow(options?...Option)?*Window

          這是 Go 中常用的一種模式:通過(guò)一個(gè)類型去控制另一個(gè)類型的不同表現(xiàn),很多庫(kù)都有類似的做法,比如 Go 的爬蟲(chóng)庫(kù) go-colly。

          就 Gio 而言,Option 實(shí)際上是一個(gè)函數(shù)類型:

          type?Option?func(unit.Metric,?*Config)

          然后,Gio 提供了各種函數(shù),返回一個(gè) Option 的實(shí)例,這些實(shí)例直接可以作為參數(shù)傳遞給 app.NewWindow 函數(shù)。

          以下是返回 Option 的相關(guān)函數(shù):

          func?CustomRenderer(custom?bool)?Option
          func?MaxSize(w,?h?unit.Value)?Option
          func?MinSize(w,?h?unit.Value)?Option
          func?NavigationColor(color?color.NRGBA)?Option
          func?Size(w,?h?unit.Value)?Option
          func?StatusColor(color?color.NRGBA)?Option
          func?Title(t?string)?Option

          從名稱可以大概知曉干什么用的。

          了解了上面的知識(shí)點(diǎn),現(xiàn)在稍微解釋下設(shè)置窗口標(biāo)題和大小的相關(guān)代碼:

          1)app.Size(x, y) 設(shè)置窗口大小,其中 x、y 的類型是 unit.Value,它是一個(gè)結(jié)構(gòu)體,函數(shù) unit.Dp 返回一個(gè) unit.Value

          //?Value?is?a?value?with?a?unit.
          type?Value?struct?{
          ?V?float32
          ?U?Unit
          }

          //?Dp?returns?the?Value?for?v?device?independent?pixels.
          func?Dp(v?float32)?Value

          2)用戶通過(guò)鼠標(biāo)可以自由調(diào)整窗口的大小。如果你喜歡,可以限制窗口的最大、最小尺寸(上面獲得 Option 類型的函數(shù)有),這樣用戶就不能隨意拖放他想的大小。

          我們還可以通過(guò) NavigationColor 和 StatusColor 控制導(dǎo)航和狀態(tài)欄的顏色(Android 開(kāi)發(fā)可能有用)。

          3)其他選項(xiàng)

          除了上面列出的 Option,還有兩個(gè)實(shí)現(xiàn)方式不太一樣的 Option:

          控制屏幕方向,主要用于手機(jī),比如橫屏、豎屏:

          type?Orientation?uint8
          const?(
          ?//?AnyOrientation?allows?the?window?to?be?freely?orientated.
          ?AnyOrientation?Orientation?=?iota
          ?//?LandscapeOrientation?constrains?the?window?to?landscape?orientations.
          ?LandscapeOrientation
          ?//?PortraitOrientation?constrains?the?window?to?portrait?orientations.
          ?PortraitOrientation
          )
          func?(o?Orientation)?Option()?Option

          使用時(shí)類似這樣:

          app.NewWindow(LandscapeOrientation.Option())

          控制全屏顯示:

          type?WindowMode?uint8
          const?(
          ?//?Windowed?is?the?normal?window?mode?with?OS?specific?window?decorations.
          ?Windowed?WindowMode?=?iota
          ?//?Fullscreen?is?the?full?screen?window?mode.
          ?Fullscreen
          )
          func?(m?WindowMode)?Option()?Option

          使用時(shí)類似這樣:

          app.NewWindow(Fullscreen.Option())

          04 小結(jié)

          本節(jié)介紹了如何控制窗口相關(guān)屬性。大家可以各個(gè)屬性都試試,看看效果。




          往期推薦


          我是 polarisxu,北大碩士畢業(yè),曾在 360 等知名互聯(lián)網(wǎng)公司工作,10多年技術(shù)研發(fā)與架構(gòu)經(jīng)驗(yàn)!2012 年接觸 Go 語(yǔ)言并創(chuàng)建了 Go 語(yǔ)言中文網(wǎng)!著有《Go語(yǔ)言編程之旅》、開(kāi)源圖書(shū)《Go語(yǔ)言標(biāo)準(zhǔn)庫(kù)》等。


          堅(jiān)持輸出技術(shù)(包括 Go、Rust 等技術(shù))、職場(chǎng)心得和創(chuàng)業(yè)感悟!歡迎關(guān)注「polarisxu」一起成長(zhǎng)!也歡迎加我微信好友交流:gopherstudio


          瀏覽 59
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  中日精品 | 操逼吃瓜网 | 家庭乱伦欧美性爱一区二区三区。 | 欧美三级国产精品 | 国产精品麻豆果冻莉莉 |