17鸥咖、鴻蒙/布局/柵格布局 (GridRow/GridCol)

概述

柵格布局是一種通用的輔助定位工具符喝,對(duì)移動(dòng)設(shè)備的界面設(shè)計(jì)有較好的借鑒作用。主要優(yōu)勢(shì)包括:

  1. 提供可循的規(guī)律:柵格布局可以為布局提供規(guī)律性的結(jié)構(gòu)爵赵,解決多尺寸多設(shè)備的動(dòng)態(tài)布局問(wèn)題吝秕。通過(guò)將頁(yè)面劃分為等寬的列數(shù)和行數(shù),可以方便地對(duì)頁(yè)面元素進(jìn)行定位和排版空幻。

  2. 統(tǒng)一的定位標(biāo)注:柵格布局可以為系統(tǒng)提供一種統(tǒng)一的定位標(biāo)注,保證不同設(shè)備上各個(gè)模塊的布局一致性容客。這可以減少設(shè)計(jì)和開(kāi)發(fā)的復(fù)雜度秕铛,提高工作效率。

  3. 靈活的間距調(diào)整方法:柵格布局可以提供一種靈活的間距調(diào)整方法缩挑,滿足特殊場(chǎng)景布局調(diào)整的需求但两。通過(guò)調(diào)整列與列之間和行與行之間的間距,可以控制整個(gè)頁(yè)面的排版效果供置。

  4. 自動(dòng)換行和自適應(yīng):柵格布局可以完成一對(duì)多布局的自動(dòng)換行和自適應(yīng)谨湘。當(dāng)頁(yè)面元素的數(shù)量超出了一行或一列的容量時(shí),他們會(huì)自動(dòng)換到下一行或下一列芥丧,并且在不同的設(shè)備上自適應(yīng)排版紧阔,使得頁(yè)面布局更加靈活和適應(yīng)性強(qiáng)。

GridRow為柵格容器組件续担,需與柵格子組件GridCol在柵格布局場(chǎng)景中聯(lián)合使用擅耽。

柵格容器GridRow

柵格系統(tǒng)斷點(diǎn)

柵格系統(tǒng)以設(shè)備的水平寬度(屏幕密度像素值,單位vp)作為斷點(diǎn)依據(jù)物遇,定義設(shè)備的寬度類型乖仇,形成了一套斷點(diǎn)規(guī)則。開(kāi)發(fā)者可根據(jù)需求在不同的斷點(diǎn)區(qū)間實(shí)現(xiàn)不同的頁(yè)面布局效果询兴。

柵格系統(tǒng)默認(rèn)斷點(diǎn)將設(shè)備寬度分為xs乃沙、sm、md诗舰、lg四類警儒,尺寸范圍如下:


GridRow.png

在GridRow柵格組件中,允許開(kāi)發(fā)者使用breakpoints自定義修改斷點(diǎn)的取值范圍始衅,最多支持6個(gè)斷點(diǎn)冷蚂,除了默認(rèn)的四個(gè)斷點(diǎn)外缭保,還可以啟用xl,xxl兩個(gè)斷點(diǎn)蝙茶,支持六種不同尺寸(xs, sm, md, lg, xl, xxl)設(shè)備的布局設(shè)置着茸。

GridRow.png
  • 針對(duì)斷點(diǎn)位置,開(kāi)發(fā)者根據(jù)實(shí)際使用場(chǎng)景群凶,通過(guò)一個(gè)單調(diào)遞增數(shù)組設(shè)置昂芜。由于breakpoints最多支持六個(gè)斷點(diǎn),單調(diào)遞增數(shù)組長(zhǎng)度最大為5蹄衷。
breakpoints: {value: ['100vp', '200vp']}

表示啟用xs忧额、sm、md共3個(gè)斷點(diǎn)愧口,小于100vp為xs睦番,100vp-200vp為sm,大于200vp為md耍属。

breakpoints: {value: ['320vp', '520vp', '840vp', '1080vp']}
  • 柵格系統(tǒng)通過(guò)監(jiān)聽(tīng)窗口或容器的尺寸變化進(jìn)行斷點(diǎn)托嚣,通過(guò)reference設(shè)置斷點(diǎn)切換參考物。 考慮到應(yīng)用可能以非全屏窗口的形式顯示厚骗,以應(yīng)用窗口寬度為參照物更為通用示启。
    例如,使用柵格的默認(rèn)列數(shù)12列领舰,通過(guò)斷點(diǎn)設(shè)置將應(yīng)用寬度分成六個(gè)區(qū)間夫嗓,在各區(qū)間中,每個(gè)柵格子元素占用的列數(shù)均不同冲秽。
GridRow({
      breakpoints: {
        value: ['200vp', '300vp', '400vp', '500vp', '600vp'],
        reference: BreakpointsReference.WindowSize
      }
    }){
      GridCol({
        span: {
          xs: 2, // 在最小寬度類型設(shè)備上舍咖,柵格子組件占據(jù)的柵格容器2列。
          sm: 3, // 在小寬度類型設(shè)備上劳跃,柵格子組件占據(jù)的柵格容器3列谎仲。
          md: 4, // 在中等寬度類型設(shè)備上,柵格子組件占據(jù)的柵格容器4列刨仑。
          lg: 6, // 在大寬度類型設(shè)備上郑诺,柵格子組件占據(jù)的柵格容器6列。
          xl: 8, // 在特大寬度類型設(shè)備上杉武,柵格子組件占據(jù)的柵格容器8列辙诞。
          xxl: 12 // 在超大寬度類型設(shè)備上,柵格子組件占據(jù)的柵格容器12列轻抱。
        }
      }){
        Row(){
          Text('新聞')
        }.backgroundColor(Color.Red).width(100).height(100)
      }
      GridCol({
          span: {
            xs: 2, // 在最小寬度類型設(shè)備上飞涂,柵格子組件占據(jù)的柵格容器2列。
            sm: 3, // 在小寬度類型設(shè)備上,柵格子組件占據(jù)的柵格容器3列较店。
            md: 4, // 在中等寬度類型設(shè)備上士八,柵格子組件占據(jù)的柵格容器4列。
            lg: 6, // 在大寬度類型設(shè)備上梁呈,柵格子組件占據(jù)的柵格容器6列婚度。
            xl: 8, // 在特大寬度類型設(shè)備上,柵格子組件占據(jù)的柵格容器8列官卡。
            xxl: 12 // 在超大寬度類型設(shè)備上蝗茁,柵格子組件占據(jù)的柵格容器12列。
          }
      }){
        Row(){
          Text('新聞')
        }.backgroundColor(Color.Red).width(100).height(100)
      }
      GridCol({
          span: {
            xs: 2, // 在最小寬度類型設(shè)備上寻咒,柵格子組件占據(jù)的柵格容器2列哮翘。
            sm: 3, // 在小寬度類型設(shè)備上,柵格子組件占據(jù)的柵格容器3列毛秘。
            md: 4, // 在中等寬度類型設(shè)備上饭寺,柵格子組件占據(jù)的柵格容器4列。
            lg: 6, // 在大寬度類型設(shè)備上叫挟,柵格子組件占據(jù)的柵格容器6列佩研。
            xl: 8, // 在特大寬度類型設(shè)備上,柵格子組件占據(jù)的柵格容器8列霞揉。
            xxl: 12 // 在超大寬度類型設(shè)備上,柵格子組件占據(jù)的柵格容器12列晰骑。
          }
      }){
        Row(){
          Text('新聞')
        }.backgroundColor(Color.Red).width(100).height(100)
      }
      GridCol({
        span: {
          xs: 2, // 在最小寬度類型設(shè)備上适秩,柵格子組件占據(jù)的柵格容器2列。
          sm: 3, // 在小寬度類型設(shè)備上硕舆,柵格子組件占據(jù)的柵格容器3列秽荞。
          md: 4, // 在中等寬度類型設(shè)備上,柵格子組件占據(jù)的柵格容器4列抚官。
          lg: 6, // 在大寬度類型設(shè)備上扬跋,柵格子組件占據(jù)的柵格容器6列。
          xl: 8, // 在特大寬度類型設(shè)備上凌节,柵格子組件占據(jù)的柵格容器8列钦听。
          xxl: 12 // 在超大寬度類型設(shè)備上,柵格子組件占據(jù)的柵格容器12列倍奢。
        }
      }){
        Row(){
          Text('新聞')
        }.backgroundColor(Color.Red).width(100).height(100)
      }
      GridCol({
        span: {
          xs: 2, // 在最小寬度類型設(shè)備上朴上,柵格子組件占據(jù)的柵格容器2列。
          sm: 3, // 在小寬度類型設(shè)備上卒煞,柵格子組件占據(jù)的柵格容器3列痪宰。
          md: 4, // 在中等寬度類型設(shè)備上,柵格子組件占據(jù)的柵格容器4列。
          lg: 6, // 在大寬度類型設(shè)備上乖订,柵格子組件占據(jù)的柵格容器6列。
          xl: 8, // 在特大寬度類型設(shè)備上具练,柵格子組件占據(jù)的柵格容器8列乍构。
          xxl: 12 // 在超大寬度類型設(shè)備上,柵格子組件占據(jù)的柵格容器12列靠粪。
        }
      }){
        Row(){
          Text('新聞')
        }.backgroundColor(Color.Red).width(100).height(100)
      }
      GridCol({
        span: {
          xs: 2, // 在最小寬度類型設(shè)備上蜡吧,柵格子組件占據(jù)的柵格容器2列。
          sm: 3, // 在小寬度類型設(shè)備上占键,柵格子組件占據(jù)的柵格容器3列昔善。
          md: 4, // 在中等寬度類型設(shè)備上,柵格子組件占據(jù)的柵格容器4列畔乙。
          lg: 6, // 在大寬度類型設(shè)備上君仆,柵格子組件占據(jù)的柵格容器6列。
          xl: 8, // 在特大寬度類型設(shè)備上牲距,柵格子組件占據(jù)的柵格容器8列返咱。
          xxl: 12 // 在超大寬度類型設(shè)備上,柵格子組件占據(jù)的柵格容器12列牍鞠。
        }
      }){
        Row(){
          Text('新聞')
        }.backgroundColor(Color.Red).width(100).height(100)
      }
}

布局的總列數(shù)

GridRow中通過(guò)columns設(shè)置柵格布局的總列數(shù)咖摹。

  • columns默認(rèn)值為12,即在未設(shè)置columns時(shí)难述,任何斷點(diǎn)下萤晴,柵格布局被分成12列。
@State bgColor: Color[] = [
    Color.Red,
    Color.Yellow,
    Color.Gray,
    Color.Green,
    Color.Black,
    Color.Blue,
    Color.Pink,
    Color.Orange,
    Color.Pink,
    Color.Brown,
    Color.Gray,
    Color.Black,
];
...
GridRow(){
      ForEach(this.bgColor, (item: Color, index: number)=>{
        GridCol(){
          Row(){
            Text(index.toString()).textAlign(TextAlign.Center)
          }.width(100).height(100).backgroundColor(item)
        }
      })
}
  • 當(dāng)columns為自定義值胁后,柵格布局在任何尺寸設(shè)備下都被分為columns列店读。下面分別設(shè)置柵格布局列數(shù)為4,子元素默認(rèn)占一列攀芯,效果如下:
GridRow({ columns: 4 }){
      ForEach(this.bgColor, (item: Color, index: number)=>{
        GridCol(){
          Row(){
            Text(index.toString()).textAlign(TextAlign.Center)
          }.width(100).height(100).backgroundColor(item)
        }
      })
}
  • 當(dāng)columns類型為GridRowColumnOption時(shí)屯断,支持下面六種不同尺寸(xs, sm, md, lg, xl, xxl)設(shè)備的總列數(shù)設(shè)置,各個(gè)尺寸下數(shù)值可不同侣诺。
 GridRow({ columns: { sm: 2, md: 4, lg: 8 }, breakpoints: { value: ['200vp', '300vp', '400vp', '500vp', '600vp'] } }){
        ForEach(this.bgColor, (item: Color, index: number)=>{
          GridCol(){
            Row(){
              Text(index.toString()).textAlign(TextAlign.Center)
                .width('100%')
            }.width('100%').height(100).backgroundColor(item)
          }
        })
}

若只設(shè)置sm, md的柵格總列數(shù)殖演,則較小的尺寸使用默認(rèn)columns值12,較大的尺寸使用前一個(gè)尺寸的columns紧武。這里只設(shè)置sm: 2, md: 4, lg: 8剃氧,則較小尺寸的xs:12,較大尺寸的參照md的設(shè)置阻星,lg:8, xl:8, xxl:8

排列方向

柵格布局中朋鞍,可以通過(guò)設(shè)置GridRow的direction屬性來(lái)指定柵格子組件在柵格容器中的排列方向已添。該屬性可以設(shè)置為GridRowDirection.Row(從左往右排列)或GridRowDirection.RowReverse(從右往左排列),以滿足不同的布局需求滥酥。通過(guò)合理的direction屬性設(shè)置更舞,可以使得頁(yè)面布局更加靈活和符合設(shè)計(jì)要求。

  • 子組件默認(rèn)從左往右排列坎吻。
GridRow({ direction: GridRowDirection.Row }){}
  • 子組件從右往左排列缆蝉。
GridRow({ direction: GridRowDirection.RowReverse }){}

子組件間距

GridRow中通過(guò)gutter屬性設(shè)置子元素在水平和垂直方向的間距。

  • 當(dāng)gutter類型為number時(shí)瘦真,同時(shí)設(shè)置柵格子組件間水平和垂直方向邊距且相等刊头。下例中,設(shè)置子組件水平與垂直方向距離相鄰元素的間距為10诸尽。
 GridRow({ gutter: 10 }){}
  • 當(dāng)gutter類型為GutterOption時(shí)原杂,單獨(dú)設(shè)置柵格子組件水平垂直邊距,x屬性為水平方向間距您机,y為垂直方向間距穿肄。
GridRow({ gutter: { x: 20, y: 50 } }){}

子組件GridCol

GridCol組件作為GridRow組件的子組件,通過(guò)給GridCol傳參或者設(shè)置屬性兩種方式际看,設(shè)置span(占用列數(shù))咸产,offset(偏移列數(shù)),order(元素序號(hào))的值仲闽。

  • 設(shè)置span脑溢。
GridCol({ span: 2 }){}
GridCol({ span: { xs: 1, sm: 2, md: 3, lg: 4 } }){}
GridCol(){}.span(2)
  • 設(shè)置offset。
GridCol({ offset: 2 }){}
GridCol({ offset: { xs: 2, sm: 2, md: 2, lg: 2 } }){}
  • 設(shè)置order赖欣。
GridCol({ order: 2 }){}
GridCol({ order: { xs: 1, sm: 2, md: 3, lg: 4 } }){}
GridCol(){}.order(2)

span

子組件占柵格布局的列數(shù)焚志,決定了子組件的寬度,默認(rèn)為1畏鼓。

  • 當(dāng)類型為number時(shí),子組件在所有尺寸設(shè)備下占用的列數(shù)相同壶谒。
// 一行2個(gè)
GridCol({ span: 2 })
  • 當(dāng)類型為GridColColumnOption時(shí)云矫,支持六種不同尺寸(xs, sm, md, lg, xl, xxl)設(shè)備中子組件所占列數(shù)設(shè)置,各個(gè)尺寸下數(shù)值可不同汗菜。
 GridCol({
            span: { xs: 1, sm: 2, md: 3, lg: 4 }
})

offset

柵格子組件相對(duì)于前一個(gè)子組件的偏移列數(shù)让禀,默認(rèn)為0。

  • 當(dāng)類型為number時(shí)陨界,子組件偏移相同列數(shù)
 GridCol({
  offset: 1
})
  • 當(dāng)類型為GridColColumnOption時(shí)巡揍,支持六種不同尺寸(xs, sm, md, lg, xl, xxl)設(shè)備中子組件所占列數(shù)設(shè)置,各個(gè)尺寸下數(shù)值可不同。
GridCol({ offset: { xs: 1, sm: 2, md: 3, lg: 4 } })

order

柵格子組件的序號(hào)菌瘪,決定子組件排列次序腮敌。當(dāng)子組件不設(shè)置order或者設(shè)置相同的order, 子組件按照代碼順序展示阱当。當(dāng)子組件設(shè)置不同的order時(shí),order較小的組件在前糜工,較大的在后弊添。

當(dāng)子組件部分設(shè)置order,部分不設(shè)置order時(shí)捌木,未設(shè)置order的子組件依次排序靠前油坝,設(shè)置了order的子組件按照數(shù)值從小到大排列。

  • 當(dāng)類型為number時(shí)刨裆,子組件在任何尺寸下排序次序一致澈圈。
GridRow({
      breakpoints: {
        value: ['200vp', '300vp', '400vp', '500vp', '600vp'],
        reference: BreakpointsReference.WindowSize
      }
    }){
      GridCol({
        order: 3
      }){
        Row(){
          Text('新聞1')
        }.backgroundColor(Color.Red).width('100%').height(100)
      }
      GridCol({
        order: 2
      }){
        Row(){
          Text('新聞2')
        }.backgroundColor(Color.Red).width('100%').height(100)
      }
      GridCol({

      }){
        Row(){
          Text('新聞3')
        }.backgroundColor(Color.Red).width('100%').height(100)
      }

}
  • 當(dāng)類型為GridColColumnOption時(shí),支持六種不同尺寸(xs, sm, md, lg, xl, xxl)設(shè)備中子組件排序次序設(shè)置帆啃。在xs設(shè)備中瞬女,子組件排列順序?yàn)?234;sm為2341链瓦,md為3412拆魏,lg為2431。
GridCol({ order: { xs:1, sm:5, md:3, lg:7}})

綜上所述慈俯,柵格組件提供了豐富的自定義能力渤刃,功能異常靈活和強(qiáng)大。只需要明確柵格在不同斷點(diǎn)下的Columns贴膘、Margin卖子、Gutter及span等參數(shù),即可確定最終布局刑峡,無(wú)需關(guān)心具體的設(shè)備類型及設(shè)備狀態(tài)(如橫豎屏)等洋闽。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
禁止轉(zhuǎn)載,如需轉(zhuǎn)載請(qǐng)通過(guò)簡(jiǎn)信或評(píng)論聯(lián)系作者突梦。
  • 序言:七十年代末诫舅,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子宫患,更是在濱河造成了極大的恐慌刊懈,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,376評(píng)論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件娃闲,死亡現(xiàn)場(chǎng)離奇詭異虚汛,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)皇帮,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,126評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門(mén)卷哩,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人属拾,你說(shuō)我怎么就攤上這事将谊±淙埽” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,966評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵瓢娜,是天一觀的道長(zhǎng)挂洛。 經(jīng)常有香客問(wèn)我,道長(zhǎng)眠砾,這世上最難降的妖魔是什么虏劲? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,432評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮褒颈,結(jié)果婚禮上柒巫,老公的妹妹穿的比我還像新娘。我一直安慰自己谷丸,他們只是感情好堡掏,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,519評(píng)論 6 385
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著刨疼,像睡著了一般泉唁。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上揩慕,一...
    開(kāi)封第一講書(shū)人閱讀 49,792評(píng)論 1 290
  • 那天亭畜,我揣著相機(jī)與錄音,去河邊找鬼迎卤。 笑死拴鸵,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的蜗搔。 我是一名探鬼主播劲藐,決...
    沈念sama閱讀 38,933評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼樟凄!你這毒婦竟也來(lái)了聘芜?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,701評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤缝龄,失蹤者是張志新(化名)和其女友劉穎厉膀,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體二拐,經(jīng)...
    沈念sama閱讀 44,143評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,488評(píng)論 2 327
  • 正文 我和宋清朗相戀三年凳兵,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了百新。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,626評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡庐扫,死狀恐怖饭望,靈堂內(nèi)的尸體忽然破棺而出仗哨,到底是詐尸還是另有隱情,我是刑警寧澤铅辞,帶...
    沈念sama閱讀 34,292評(píng)論 4 329
  • 正文 年R本政府宣布厌漂,位于F島的核電站,受9級(jí)特大地震影響斟珊,放射性物質(zhì)發(fā)生泄漏苇倡。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,896評(píng)論 3 313
  • 文/蒙蒙 一囤踩、第九天 我趴在偏房一處隱蔽的房頂上張望旨椒。 院中可真熱鬧,春花似錦堵漱、人聲如沸综慎。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,742評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)示惊。三九已至,卻和暖如春愉镰,著一層夾襖步出監(jiān)牢的瞬間米罚,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,977評(píng)論 1 265
  • 我被黑心中介騙來(lái)泰國(guó)打工岛杀, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留阔拳,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,324評(píng)論 2 360
  • 正文 我出身青樓类嗤,卻偏偏與公主長(zhǎng)得像糊肠,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子遗锣,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,494評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容