0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

鴻蒙OS開發(fā):【一次開發(fā),多端部署】(自適應(yīng)布局)

jf_46214456 ? 來源:jf_46214456 ? 作者:jf_46214456 ? 2024-05-25 16:36 ? 次閱讀

自適應(yīng)布局

針對常見的開發(fā)場景,方舟開發(fā)框架提煉了七種自適應(yīng)布局能力,這些布局可以獨立使用,也可多種布局疊加使用。

自適應(yīng)布局類別自適應(yīng)布局能力使用場景實現(xiàn)方式
自適應(yīng)拉伸[拉伸能力]容器組件尺寸發(fā)生變化時,增加或減小的空間全部分配給容器組件內(nèi) 指定區(qū)域 。[Flex布局]的flexGrow和flexShrink屬性
[均分能力]容器組件尺寸發(fā)生變化時,增加或減小的空間均勻分配給容器組件內(nèi) 所有空白區(qū)域 。[Row組件]、[Column組件]或[Flex組件]的justifyContent屬性設(shè)置為FlexAlign.SpaceEvenly
自適應(yīng)縮放[占比能力]子組件的寬或高 按照預(yù)設(shè)的比例 ,隨容器組件發(fā)生變化。基于通用屬性的兩種實現(xiàn)方式: - 將子組件的寬高設(shè)置為父組件寬高的百分比 - layoutWeight屬性
[縮放能力]子組件的寬高 按照預(yù)設(shè)的比例 ,隨容器組件發(fā)生變化,且變化過程中子組件的 寬高比不變 。[布局約束]的aspectRatio屬性
自適應(yīng)延伸[延伸能力]容器組件內(nèi)的子組件,按照其 在列表中的先后順序 ,隨容器組件尺寸變化顯示或隱藏。基于容器組件的兩種實現(xiàn)方式: - 通過[List組件]實現(xiàn) - 通過[Scroll組件]配合[Row組件]或[Column組件]實現(xiàn)
[隱藏能力]容器組件內(nèi)的子組件,按照其 預(yù)設(shè)的顯示優(yōu)先級 ,隨容器組件尺寸變化顯示或隱藏。 相同顯示優(yōu)先級的子組件同時顯示或隱藏 。[布局約束]的displayPriority屬性
自適應(yīng)折行[折行能力]容器組件尺寸發(fā)生變化時,如果布局方向尺寸不足以顯示完整內(nèi)容, 自動換行 。[Flex組件]的wrap屬性設(shè)置為FlexWrap.Wrap

下面我們依次介紹這幾種自適應(yīng)布局能力。

開發(fā)前請熟悉鴻蒙開發(fā)指導(dǎo)文檔 :[gitee.com/li-shizhen-skin/harmony-os/blob/master/README.md]點擊或者復(fù)制轉(zhuǎn)到。

拉伸能力

拉伸能力是指容器組件尺寸發(fā)生變化時,增加或減小的空間全部分配給容器組件內(nèi)指定區(qū)域。

拉伸能力通常通過[Flex布局]中的flexGrow和flexShrink屬性實現(xiàn),flexGrow和flexShink屬性常與flexBasis屬性搭配使用,故將這三個屬性放在一起介紹。

屬性類型默認(rèn)值描述
flexGrownumber0僅當(dāng)父容器寬度大于所有子組件寬度的總和時,該屬性生效。配置了此屬性的子組件,按照比例拉伸,分配父容器的多余空間。
flexShrinknumber1僅當(dāng)父容器寬度小于所有子組件寬度的總和時,該屬性生效。配置了此屬性的子組件,按照比例收縮,分配父容器的不足空間。
flexBasis'auto'[Length]'auto'

說明:

  • 開發(fā)者期望將父容器的剩余空間全部分配給某空白區(qū)域時,也可以通過[Blank組件]實現(xiàn)。注意僅當(dāng)父組件為RowColumnFlex組件時,Blank組件才會生效。
  • 類Web開發(fā)范式也是通過flex-grow和flex-shrink實現(xiàn)拉伸能力,同時也支持配置flex-basis,詳見[通用樣式]。
  • 類Web開發(fā)范式?jīng)]有提供blank組件,但可以通過div組件模擬blank組件的行為,如“
    ”。

示例1

本示例中的頁面由中間的內(nèi)容區(qū)(包含一張圖片)以及兩側(cè)的留白區(qū)組成,各區(qū)域的屬性配置如下。

  • 中間內(nèi)容區(qū)的寬度設(shè)置為400vp,同時將flexGrow屬性設(shè)置為1,flexShrink屬性設(shè)置為0。
  • 兩側(cè)留白區(qū)的寬度設(shè)置為150vp,同時將flexGrow屬性設(shè)置為0,flexShrink屬性設(shè)置為1。

由上可知,父容器的基準(zhǔn)尺寸是700vp(150vp+400vp+150vp)。

可以通過拖動底部的滑動條改變父容器的尺寸,查看布局變化。

  • 當(dāng)父容器的尺寸大于700vp時,父容器中多余的空間全部分配給中間內(nèi)容區(qū)。
  • 當(dāng)父容器的尺寸小于700vp時,左右兩側(cè)的留白區(qū)按照“1:1”的比例收縮(即平均分配父容器的不足空間)。

zh-cn_image_0000001335796258

@Entry
@Component
struct FlexibleCapabilitySample1 {
  @State containerWidth: number = 402

  // 底部滑塊,可以通過拖拽滑塊改變?nèi)萜鞒叽纭?/span>
  @Builder slider() {
    Slider({ value: this.containerWidth, min: 402, max: 1000, style: SliderStyle.OutSet })
      .blockColor(Color.White)
      .width('60%')
      .onChange((value: number) = > {
        this.containerWidth = value;
      })
      .position({ x: '20%', y: '80%' })
  }

  build() {
    Column() {
      Column() {
        Row() {
          // 通過flexGrow和flexShrink屬性,將多余的空間全部分配給圖片,將不足的控件全部分配給兩側(cè)空白區(qū)域。
          Row().width(150).height(400).backgroundColor('#FFFFFF')
            .flexGrow(0).flexShrink(1)
          Image($r("app.media.illustrator")).width(400).height(400)
            .objectFit(ImageFit.Contain)
            .backgroundColor("#66F1CCB8")
            .flexGrow(1).flexShrink(0)
          Row().width(150).height(400).backgroundColor('#FFFFFF')
            .flexGrow(0).flexShrink(1)
        }
        .width(this.containerWidth)
        .justifyContent(FlexAlign.Center)
        .alignItems(VerticalAlign.Center)
      }

      this.slider()
    }
    .width('100%')
    .height('100%')
    .backgroundColor('#F1F3F5')
    .justifyContent(FlexAlign.Center)
    .alignItems(HorizontalAlign.Center)
  }
}

示例2

文字和開關(guān)的尺寸固定,僅有中間空白區(qū)域(Blank組件)隨父容器尺寸變化而伸縮。

zh-cn_image_0000001335316714

@Entry
@Component
struct FlexibleCapabilitySample2 {
  @State rate: number = 0.8

  // 底部滑塊,可以通過拖拽滑塊改變?nèi)萜鞒叽?/span>
  @Builder slider() {
    Slider({ value: this.rate * 100, min: 30, max: 80, style: SliderStyle.OutSet })
      .blockColor(Color.White)
      .width('60%')
      .onChange((value: number) = > {
        this.rate = value / 100;
      })
      .position({ x: '20%', y: '80%' })
  }

  build() {
    Column() {
      Column() {
        Row() {
          Text('飛行模式')
            .fontSize(16)
            .width(135)
            .height(22)
            .fontWeight(FontWeight.Medium)
            .lineHeight(22)
          Blank()      // 通過Blank組件實現(xiàn)拉伸能力
          Toggle({ type: ToggleType.Switch })
            .width(36)
            .height(20)
        }
        .height(55)
        .borderRadius(12)
        .padding({ left: 13, right: 13 })
        .backgroundColor('#FFFFFF')
        .width(this.rate * 100 + '%')
      }

      this.slider()
    }
    .width('100%')
    .height('100%')
    .backgroundColor('#F1F3F5')
    .justifyContent(FlexAlign.Center)
    .alignItems(HorizontalAlign.Center)
  }
}

均分能力

均分能力是指容器組件尺寸發(fā)生變化時,增加或減小的空間均勻分配給容器組件內(nèi)所有空白區(qū)域。它常用于內(nèi)容數(shù)量固定、均分顯示的場景,比如工具欄、底部菜單欄等。

均分能力可以通過將[Row組件]、[Column組件]或[Flex組件]的justifyContent屬性設(shè)置為FlexAlign.SpaceEvenly實現(xiàn),即子元素在父容器主軸方向等間距布局,相鄰元素之間的間距、第一個元素與行首的間距、最后一個元素到行尾的間距都完全一樣。

說明:

  • 均分能力還可以通過其它方式實現(xiàn),如使用[Grid網(wǎng)格組件]或在每個組件間添加Blank組件等。
  • 類Web開發(fā)范式中,通過將[div組件]的justify-content屬性設(shè)置為space-evenly來實現(xiàn)均分布局。

示例:

父容器尺寸變化過程中,圖標(biāo)及文字的尺寸不變,圖標(biāo)間的間距及圖標(biāo)離左右邊緣的距離同時均等改變。

zh-cn_image_0000001335477142

@Entry
@Component
struct EquipartitionCapabilitySample {
  readonly list: number [] = [0, 1, 2, 3]
  @State rate: number = 0.6

  // 底部滑塊,可以通過拖拽滑塊改變?nèi)萜鞒叽?/span>
  @Builder slider() {
    Slider({ value: this.rate * 100, min: 30, max: 60, style: SliderStyle.OutSet })
      .blockColor(Color.White)
      .width('60%')
      .onChange((value: number) = > {
        this.rate = value / 100
      })
      .position({ x: '20%', y: '80%' })
  }

  build() {
    Column() {
      Column() {
        // 均勻分配父容器主軸方向的剩余空間
        Row() {
          ForEach(this.list, (item:number) = > {
            Column() {
              Image($r("app.media.startIcon")).width(48).height(48).margin({ top: 8 })
              Text('App name')
                .width(64)
                .height(30)
                .lineHeight(15)
                .fontSize(12)
                .textAlign(TextAlign.Center)
                .margin({ top: 8 })
                .padding({ bottom: 15 })
            }
            .width(80)
            .height(102)
            .flexShrink(1)
          })
        }
        .width('100%')
        .justifyContent(FlexAlign.SpaceEvenly)
        // 均勻分配父容器主軸方向的剩余空間
        Row() {
          ForEach(this.list, (item:number) = > {
            Column() {
              Image($r("app.media.startIcon")).width(48).height(48).margin({ top: 8 })
              Text('App name')
                .width(64)
                .height(30)
                .lineHeight(15)
                .fontSize(12)
                .textAlign(TextAlign.Center)
                .margin({ top: 8 })
                .padding({ bottom: 15 })
            }
            .width(80)
            .height(102)
            .flexShrink(1)
          })
        }
        .width('100%')
        .justifyContent(FlexAlign.SpaceEvenly)
      }
      .width(this.rate * 100 + '%')
      .height(222)
      .padding({ top: 16 })
      .backgroundColor('#FFFFFF')
      .borderRadius(16)

      this.slider()
    }
    .width('100%')
    .height('100%')
    .backgroundColor('#F1F3F5')
    .justifyContent(FlexAlign.Center)
    .alignItems(HorizontalAlign.Center)
  }
}

占比能力

占比能力是指子組件的寬高按照預(yù)設(shè)的比例,隨父容器組件發(fā)生變化。

占比能力通常有兩種實現(xiàn)方式:

  • 將子組件的寬高設(shè)置為父組件寬高的百分比,詳見[尺寸設(shè)置]及[長度類型]。
  • 通過layoutWeight屬性配置互為兄弟關(guān)系的組件在父容器主軸方向的布局權(quán)重,詳見[尺寸設(shè)置]。
    • 當(dāng)父容器尺寸確定時,其子組件按照開發(fā)者配置的權(quán)重比例分配父容器中主軸方向的空間。
    • 僅當(dāng)父容器是Row、Column或者Flex時,layoutWeight屬性才會生效。
    • 設(shè)置layoutWeight屬性后,組件本身的尺寸會失效。比如同時設(shè)置了.width('40%')和.layoutWeight(1),那么只有.layoutWeight(1)會生效。

layoutWeight存在使用限制,所以實際使用過程中大多通過將子組件寬高設(shè)置為父組件的百分比來實現(xiàn)占比能力。

說明:

  • 占比能力在實際開發(fā)中使用的非常廣泛,可以通過很多不同的方式實現(xiàn)占比能力,如還可以通過[Grid組件]的columnsTemplate屬性設(shè)置網(wǎng)格容器中列的數(shù)量及其寬度比例,或通過配置子組件在柵格(本章后文將詳細(xì)介紹柵格系統(tǒng))中占據(jù)不同的列數(shù)來實現(xiàn)占比能力。本小節(jié)僅介紹最基礎(chǔ)和常用的實現(xiàn)方式,局限性較大或比非常小眾的實現(xiàn)方式,本文不做展開介紹。
  • 類Web開發(fā)范式同樣支持以百分比的形式設(shè)置組件的寬高,詳見[通用樣式]中關(guān)于width和height的介紹以及[長度類型介紹]。
  • 與聲明式開發(fā)范式中的layoutWeight屬性類似,類Web開發(fā)范式提供了[flex-weight樣式]用于配置互為兄弟關(guān)系的組件在父容器主軸方向的布局權(quán)重。

示例:

簡單的播放控制欄,其中“上一首”、“播放/暫停”、“下一首”的layoutWeight屬性都設(shè)置為1,因此它們按照“1:1:1”的比例均分父容器主軸方向的空間。

將三個按鈕的.layoutWeight(1)分別替換為.width('33%')、.width('34%')、.width('33%'),也可以實現(xiàn)與當(dāng)前同樣的顯示效果。

zh-cn_image_0000001385757965

@Entry
@Component
struct ProportionCapabilitySample {
  @State rate: number = 0.5

  // 底部滑塊,可以通過拖拽滑塊改變?nèi)萜鞒叽?/span>
  @Builder slider() {
    Slider({ value: 100, min: 25, max: 50, style: SliderStyle.OutSet })
      .blockColor(Color.White)
      .width('60%')
      .height(50)
      .onChange((value: number) = > {
        this.rate = value / 100
      })
      .position({ x: '20%', y: '80%' })
  }

  build() {
    Column() {
      Column() {
        Row() {
          Column() {
            Image($r("app.media.down"))
              .width(48)
              .height(48)
          }
          .height(96)
          .layoutWeight(1)  // 設(shè)置子組件在父容器主軸方向的布局權(quán)重
          .justifyContent(FlexAlign.Center)
          .alignItems(HorizontalAlign.Center)

          Column() {
            Image($r("app.media.pause"))
              .width(48)
              .height(48)
          }
          .height(96)
          .layoutWeight(1)  // 設(shè)置子組件在父容器主軸方向的布局權(quán)重
          .backgroundColor('#66F1CCB8')
          .justifyContent(FlexAlign.Center)
          .alignItems(HorizontalAlign.Center)

          Column() {
            Image($r("app.media.next"))
              .width(48)
              .height(48)
          }
          .height(96)
          .layoutWeight(1)  // 設(shè)置子組件在父容器主軸方向的布局權(quán)重
          .justifyContent(FlexAlign.Center)
          .alignItems(HorizontalAlign.Center)
        }
        .width(this.rate * 100 + '%')
        .height(96)
        .borderRadius(16)
        .backgroundColor('#FFFFFF')
      }

      this.slider()
    }
    .width('100%')
    .height('100%')
    .backgroundColor('#F1F3F5')
    .justifyContent(FlexAlign.Center)
    .alignItems(HorizontalAlign.Center)
  }
}

縮放能力

縮放能力是指子組件的寬高按照預(yù)設(shè)的比例,隨容器組件發(fā)生變化,且變化過程中子組件的寬高比不變。

縮放能力通過使用百分比布局配合 固定寬高比 (aspectRatio屬性)實現(xiàn)當(dāng)容器尺寸發(fā)生變化時,內(nèi)容自適應(yīng)調(diào)整。

可以訪問[布局約束],了解aspectRatio屬性的詳細(xì)信息。

說明: 類Web開發(fā)范式同樣提供了[aspect-ratio樣式],用于固定組件的寬高比。

示例:

為方便查看效果,示例中特意給Column組件加了邊框??梢钥吹紺olumn組件隨著其Flex父組件尺寸變化而縮放的過程中,始終保持預(yù)設(shè)的寬高比,其中的圖片也始終正常顯示。

zh-cn_image_0000001335640862

@Entry
@Component
struct ScaleCapabilitySample {
  @State sliderWidth: number = 400
  @State sliderHeight: number = 400

  // 底部滑塊,可以通過拖拽滑塊改變?nèi)萜鞒叽?/span>
  @Builder slider() {
    
    Slider({ value: this.sliderHeight, min: 100, max: 400, style: SliderStyle.OutSet })
      .blockColor(Color.White)
      .width('60%')
      .height(50)
      .onChange((value: number) = > {
        this.sliderHeight = value
      })
      .position({ x: '20%', y: '80%' })
      Slider({ value: this.sliderWidth, min: 100, max: 400, style: SliderStyle.OutSet })
      .blockColor(Color.White)
      .width('60%')
      .height(50)
      .onChange((value: number) = > {
        this.sliderWidth = value;
      })
      .position({ x: '20%', y: '87%' })
  }

  build() {
    Column() {
      Column() {
        Column() {
          Image($r("app.media.illustrator")).width('100%').height('100%')
        }
        .aspectRatio(1)                           // 固定寬高比
        .border({ width: 2, color: "#66F1CCB8"})  // 邊框,僅用于展示效果
      }
      .backgroundColor("#FFFFFF")
      .height(this.sliderHeight)
      .width(this.sliderWidth)
      .justifyContent(FlexAlign.Center)
      .alignItems(HorizontalAlign.Center)

      this.slider()
    }
    .width('100%')
    .height('100%')
    .backgroundColor("#F1F3F5")
    .justifyContent(FlexAlign.Center)
    .alignItems(HorizontalAlign.Center)
  }
}

延伸能力

延伸能力是指容器組件內(nèi)的子組件,按照其在列表中的先后順序,隨容器組件尺寸變化顯示或隱藏。它可以根據(jù)顯示區(qū)域的尺寸,顯示不同數(shù)量的元素。

延伸能力通常有兩種實現(xiàn)方式:

  • 通過[List組件]實現(xiàn)。
  • 通過[Scroll組件]配合[Row組件]或[Column組件]實現(xiàn)。

說明:

  • List、Row或Column組件中子節(jié)點的在頁面顯示時就已經(jīng)全部完成了布局計算及渲染,只不過受限于父容器尺寸,用戶只能看到一部分。隨著父容器尺寸增大,用戶可以看到的子節(jié)點數(shù)目也相應(yīng)的增加。用戶還可以通過手指滑動觸發(fā)列表滑動,查看被隱藏的子節(jié)點。
  • 類Web開發(fā)范式同樣可以使用[list組件]實現(xiàn)延伸能力。
  • 類Web開發(fā)范式?jīng)]有提供scroll組件,但可以將[div組件]的overflow樣式設(shè)置為scroll(即div組件主軸方向上子元素的尺寸超過div組件本身的尺寸時進(jìn)行滾動顯示)來模擬scroll組件的行為。

示例:

當(dāng)父容器的尺寸發(fā)生改變時,頁面中顯示的圖標(biāo)數(shù)量隨之發(fā)生改變。

分別通過List組件實現(xiàn)及通過Scroll組件配合Row組件實現(xiàn)。

zh-cn_image_0000001335641246

(1)通過List組件實現(xiàn)。

@Entry
@Component
struct ExtensionCapabilitySample1 {
  @State rate: number = 0.60
  readonly appList: number [] = [0, 1, 2, 3, 4, 5, 6, 7]

  // 底部滑塊,可以通過拖拽滑塊改變?nèi)萜鞒叽?/span>
  @Builder slider() {
    Slider({ value: this.rate * 100, min: 8, max: 60, style: SliderStyle.OutSet })
      .blockColor(Color.White)
      .width('60%')
      .height(50)
      .onChange((value: number) = > {
        this.rate = value / 100
      })
      .position({ x: '20%', y: '80%' })
  }

  build() {
    Column() {
      Row({ space: 10 }) {
        // 通過List組件實現(xiàn)隱藏能力
        List({ space: 10 }) {
          ForEach(this.appList, (item:number) = > {
            ListItem() {
              Column() {
                Image($r("app.media.startIcon")).width(48).height(48).margin({ top: 8 })
                Text('App name')
                  .width(64)
                  .height(30)
                  .lineHeight(15)
                  .fontSize(12)
                  .textAlign(TextAlign.Center)
                  .margin({ top: 8 })
                  .padding({ bottom: 15 })
              }.width(80).height(102)
            }.width(80).height(102)
          })
        }
        .padding({ top: 16, left: 10 })
        .listDirection(Axis.Horizontal)
        .width('100%')
        .height(118)
        .borderRadius(16)
        .backgroundColor(Color.White)
      }
      .width(this.rate * 100 + '%')

      this.slider()
    }
    .width('100%')
    .height('100%')
    .backgroundColor('#F1F3F5')
    .justifyContent(FlexAlign.Center)
    .alignItems(HorizontalAlign.Center)
  }
}

(2)通過Scroll組件配合Row組件實現(xiàn)。

@Entry
@Component
struct ExtensionCapabilitySample2 {
  private scroller: Scroller = new Scroller()
  @State rate: number = 0.60
  @State appList: number [] = [0, 1, 2, 3, 4, 5, 6, 7]

  // 底部滑塊,可以通過拖拽滑塊改變?nèi)萜鞒叽?/span>
  @Builder slider() {
    Slider({ value: this.rate * 100, min: 8, max: 60, style: SliderStyle.OutSet })
      .blockColor(Color.White)
      .width('60%')
      .height(50)
      .onChange((value: number) = > {
        this.rate = value / 100;
      })
      .position({ x: '20%', y: '80%' })
  }

  build() {
    Column() {
      // 通過Scroll和Row組件實現(xiàn)隱藏能力
      Scroll(this.scroller) {
        Row({ space: 10 }) {
          ForEach(this.appList, () = > {
            Column() {
              Image($r("app.media.startIcon")).width(48).height(48).margin({ top: 8 })
              Text('App name')
                .width(64)
                .height(30)
                .lineHeight(15)
                .fontSize(12)
                .textAlign(TextAlign.Center)
                .margin({ top: 8 })
                .padding({ bottom: 15 })


            }.width(80).height(102)
          })
        }
        .padding({ top: 16, left: 10 })
        .height(118)
        .backgroundColor(Color.White)
      }
      .scrollable(ScrollDirection.Horizontal)
      .borderRadius(16)
      .width(this.rate * 100 + '%')

      this.slider()
    }
    .width('100%')
    .height('100%')
    .backgroundColor('#F1F3F5')
    .justifyContent(FlexAlign.Center)
    .alignItems(HorizontalAlign.Center)
  }
}

隱藏能力

隱藏能力是指容器組件內(nèi)的子組件,按照其預(yù)設(shè)的顯示優(yōu)先級,隨容器組件尺寸變化顯示或隱藏,其中相同顯示優(yōu)先級的子組件同時顯示或隱藏。它是一種比較高級的布局方式,常用于分辨率變化較大,且不同分辨率下顯示內(nèi)容有所差異的場景。主要思想是通過增加或減少顯示內(nèi)容,來保持最佳的顯示效果。

隱藏能力通過設(shè)置 布局優(yōu)先級 (displayPriority屬性)來控制顯隱,當(dāng)布局主軸方向剩余尺寸不足以滿足全部元素時,按照布局優(yōu)先級大小,從小到大依次隱藏,直到容器能夠完整顯示剩余元素。具有相同布局優(yōu)先級的元素將同時顯示或者隱藏。

可以訪問[布局約束],了解displayPriority屬性的詳細(xì)信息。

說明: 類Web開發(fā)范式同樣支持[display-index樣式],用于設(shè)置布局優(yōu)先級。

示例:

父容器尺寸發(fā)生變化時,其子元素按照預(yù)設(shè)的優(yōu)先級顯示或隱藏。

zh-cn_image_0000001335485154

@Entry
@Component
struct HiddenCapabilitySample {
  @State rate: number = 0.45

  // 底部滑塊,可以通過拖拽滑塊改變?nèi)萜鞒叽?/span>
  @Builder slider() {
    Slider({ value: this.rate * 100, min: 10, max: 45, style: SliderStyle.OutSet })
      .blockColor(Color.White)
      .width('60%')
      .height(50)
      .onChange((value: number) = > {
        this.rate = value / 100
      })
      .position({ x: '20%', y: '80%' })
  }

  build() {
    Column() {
      Row() {
        Image($r("app.media.favorite"))
          .width(48)
          .height(48)
          .objectFit(ImageFit.Contain)
          .margin({ left: 12, right: 12 })
          .displayPriority(1)  // 布局優(yōu)先級

        Image($r("app.media.down"))
          .width(48)
          .height(48)
          .objectFit(ImageFit.Contain)
          .margin({ left: 12, right: 12 })
          .displayPriority(2)  // 布局優(yōu)先級

        Image($r("app.media.pause"))
          .width(48)
          .height(48)
          .objectFit(ImageFit.Contain)
          .margin({ left: 12, right: 12 })
          .displayPriority(3)  // 布局優(yōu)先級

        Image($r("app.media.next"))
          .width(48)
          .height(48)
          .objectFit(ImageFit.Contain)
          .margin({ left: 12, right: 12 })
          .displayPriority(2)  // 布局優(yōu)先級

        Image($r("app.media.list"))
          .width(48)
          .height(48)
          .objectFit(ImageFit.Contain)
          .margin({ left: 12, right: 12 })
          .displayPriority(1)  // 布局優(yōu)先級
      }
      .width(this.rate * 100 + '%')
      .height(96)
      .borderRadius(16)
      .backgroundColor('#FFFFFF')
      .justifyContent(FlexAlign.Center)
      .alignItems(VerticalAlign.Center)

      this.slider()
    }
    .width('100%')
    .height('100%')
    .backgroundColor('#F1F3F5')
    .justifyContent(FlexAlign.Center)
    .alignItems(HorizontalAlign.Center)
  }
}

折行能力

折行能力是指容器組件尺寸發(fā)生變化,當(dāng)布局方向尺寸不足以顯示完整內(nèi)容時自動換行。它常用于橫豎屏適配或默認(rèn)設(shè)備向平板切換的場景。

折行能力通過使用 Flex折行布局 (將wrap屬性設(shè)置為FlexWrap.Wrap)實現(xiàn),當(dāng)橫向布局尺寸不足以完整顯示內(nèi)容元素時,通過折行的方式,將元素顯示在下方。

可以訪問[Flex組件],了解Flex組件的詳細(xì)用法。

說明: 類Web開發(fā)范式通過將[div組件]的flex-warp樣式設(shè)置為wrap來使用折行能力。
HarmonyOSOpenHarmony鴻蒙文檔籽料:mau123789是v直接拿

搜狗高速瀏覽器截圖20240326151344.png
示例:

父容器中的圖片尺寸固定,當(dāng)父容器尺寸發(fā)生變化,其中的內(nèi)容做自適應(yīng)換行。

zh-cn_image_0000001385645821

@Entry
@Component
struct WrapCapabilitySample {
  @State rate: number = 0.7
  readonly imageList: Resource [] = [
    $r('app.media.flexWrap1'),
    $r('app.media.flexWrap2'),
    $r('app.media.flexWrap3'),
    $r('app.media.flexWrap4'),
    $r('app.media.flexWrap5'),
    $r('app.media.flexWrap6')
  ]

  // 底部滑塊,可以通過拖拽滑塊改變?nèi)萜鞒叽?/span>
  @Builder slider() {
    Slider({ value: this.rate * 100, min: 50, max: 70, style: SliderStyle.OutSet })
      .blockColor(Color.White)
      .width('60%')
      .onChange((value: number) = > {
        this.rate = value / 100
      })
      .position({ x: '20%', y: '87%' })
  }

  build() {
    Flex({ justifyContent: FlexAlign.Center, direction: FlexDirection.Column }) {
      Column() {
        // 通過Flex組件warp參數(shù)實現(xiàn)自適應(yīng)折行
        Flex({
          direction: FlexDirection.Row,
          alignItems: ItemAlign.Center,
          justifyContent: FlexAlign.Center,
          wrap: FlexWrap.Wrap
        }) {
          ForEach(this.imageList, (item:Resource) = > {
            Image(item).width(183).height(138).padding(10)
          })
        }
        .backgroundColor('#FFFFFF')
        .padding(20)
        .width(this.rate * 100 + '%')
        .borderRadius(16)
      }
      .width('100%')

      this.slider()
    }.width('100%')
    .height('100%')
    .backgroundColor('#F1F3F5')
  }
}
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • HarmonyOS
    +關(guān)注

    關(guān)注

    79

    文章

    1977

    瀏覽量

    30236
  • OpenHarmony
    +關(guān)注

    關(guān)注

    25

    文章

    3723

    瀏覽量

    16343
  • 鴻蒙OS
    +關(guān)注

    關(guān)注

    0

    文章

    188

    瀏覽量

    4416
收藏 人收藏

    評論

    相關(guān)推薦

    鴻蒙OS實戰(zhàn)開發(fā):【多設(shè)備自適應(yīng)服務(wù)卡片】

    服務(wù)卡片的布局和使用,其中卡片內(nèi)容顯示使用了一次開發(fā),多端部署的能力實現(xiàn)多設(shè)備自適應(yīng)。 用
    的頭像 發(fā)表于 04-09 09:20 ?868次閱讀
    <b class='flag-5'>鴻蒙</b><b class='flag-5'>OS</b>實戰(zhàn)<b class='flag-5'>開發(fā)</b>:【多設(shè)備<b class='flag-5'>自適應(yīng)</b>服務(wù)卡片】

    HarmonyOS開發(fā)案例:【一次開發(fā),多端部署(視頻應(yīng)用)】

    者提供了“一次開發(fā)多端部署”的系統(tǒng)能力,讓開發(fā)者可以基于一次
    的頭像 發(fā)表于 05-11 15:41 ?1477次閱讀
    HarmonyOS<b class='flag-5'>開發(fā)</b>案例:【<b class='flag-5'>一次</b><b class='flag-5'>開發(fā)</b>,<b class='flag-5'>多端</b><b class='flag-5'>部署</b>(視頻應(yīng)用)】

    HarmonyOS開發(fā)案例:【一次開發(fā),多端部署-音樂專輯】

    基于自適應(yīng)和響應(yīng)式布局,實現(xiàn)一次開發(fā)多端部署音樂專輯頁面。
    的頭像 發(fā)表于 05-13 16:48 ?694次閱讀
    HarmonyOS<b class='flag-5'>開發(fā)</b>案例:【<b class='flag-5'>一次</b><b class='flag-5'>開發(fā)</b>,<b class='flag-5'>多端</b><b class='flag-5'>部署</b>-音樂專輯】

    鴻蒙OS開發(fā):【一次開發(fā),多端部署】應(yīng)用(自適應(yīng)布局

    針對常見的開發(fā)場景,方舟開發(fā)框架提煉了七種自適應(yīng)布局能力,這些布局可以獨立使用,也可多種布局疊加
    的頭像 發(fā)表于 05-24 10:34 ?1039次閱讀
    <b class='flag-5'>鴻蒙</b><b class='flag-5'>OS</b><b class='flag-5'>開發(fā)</b>:【<b class='flag-5'>一次</b><b class='flag-5'>開發(fā)</b>,<b class='flag-5'>多端</b><b class='flag-5'>部署</b>】應(yīng)用(<b class='flag-5'>自適應(yīng)</b><b class='flag-5'>布局</b>)

    鴻蒙OS開發(fā):【一次開發(fā),多端部署】(多天氣)項目

    本示例展示個天氣應(yīng)用界面,包括首頁、城市管理、添加城市、更新時間彈窗,體現(xiàn)一次開發(fā),多端部署的能力。
    的頭像 發(fā)表于 05-20 14:59 ?854次閱讀
    <b class='flag-5'>鴻蒙</b><b class='flag-5'>OS</b><b class='flag-5'>開發(fā)</b>:【<b class='flag-5'>一次</b><b class='flag-5'>開發(fā)</b>,<b class='flag-5'>多端</b><b class='flag-5'>部署</b>】(<b class='flag-5'>一</b>多天氣)項目

    鴻蒙OS開發(fā):【一次開發(fā),多端部署】(音樂專輯主頁)

    本示例使用一次開發(fā)多端部署中介紹的自適應(yīng)布局能力和響應(yīng)式布局
    的頭像 發(fā)表于 05-21 14:48 ?756次閱讀
    <b class='flag-5'>鴻蒙</b><b class='flag-5'>OS</b><b class='flag-5'>開發(fā)</b>:【<b class='flag-5'>一次</b><b class='flag-5'>開發(fā)</b>,<b class='flag-5'>多端</b><b class='flag-5'>部署</b>】(音樂專輯主頁)

    鴻蒙OS開發(fā):【一次開發(fā),多端部署】(音樂專輯頁面)

    基于自適應(yīng)和響應(yīng)式布局,實現(xiàn)一次開發(fā)、多端部署音樂專輯頁面。
    的頭像 發(fā)表于 05-25 16:21 ?808次閱讀
    <b class='flag-5'>鴻蒙</b><b class='flag-5'>OS</b><b class='flag-5'>開發(fā)</b>:【<b class='flag-5'>一次</b><b class='flag-5'>開發(fā)</b>,<b class='flag-5'>多端</b><b class='flag-5'>部署</b>】(音樂專輯頁面)

    鴻蒙OS開發(fā):【一次開發(fā),多端部署】(視頻應(yīng)用)

    者提供了“一次開發(fā),多端部署”的系統(tǒng)能力,讓開發(fā)者可以基于一次
    的頭像 發(fā)表于 05-25 16:29 ?4552次閱讀
    <b class='flag-5'>鴻蒙</b><b class='flag-5'>OS</b><b class='flag-5'>開發(fā)</b>:【<b class='flag-5'>一次</b><b class='flag-5'>開發(fā)</b>,<b class='flag-5'>多端</b><b class='flag-5'>部署</b>】(視頻應(yīng)用)

    鴻蒙OS開發(fā):【一次開發(fā)多端部署】(布局能力簡介)

    布局可以分為自適應(yīng)布局和響應(yīng)式布局,二者的介紹如下表所示。
    的頭像 發(fā)表于 05-25 16:32 ?1081次閱讀
    <b class='flag-5'>鴻蒙</b><b class='flag-5'>OS</b><b class='flag-5'>開發(fā)</b>:【<b class='flag-5'>一次</b><b class='flag-5'>開發(fā)</b>,<b class='flag-5'>多端</b><b class='flag-5'>部署</b>】(<b class='flag-5'>布局</b>能力簡介)

    鴻蒙OS開發(fā):典型頁面場景【一次開發(fā)多端部署】實戰(zhàn)(音樂專輯頁2)

    本示例使用[一次開發(fā)多端部署]中介紹的自適應(yīng)布局能力和響應(yīng)式
    的頭像 發(fā)表于 05-25 16:47 ?2117次閱讀
    <b class='flag-5'>鴻蒙</b><b class='flag-5'>OS</b><b class='flag-5'>開發(fā)</b>:典型頁面場景【<b class='flag-5'>一次</b><b class='flag-5'>開發(fā)</b>,<b class='flag-5'>多端</b><b class='flag-5'>部署</b>】實戰(zhàn)(音樂專輯頁2)

    鴻蒙OS開發(fā):典型頁面場景【一次開發(fā)多端部署】實戰(zhàn)(設(shè)置典型頁面)

    本示例展示了設(shè)置應(yīng)用的典型頁面,其在小窗口和大窗口有不同的顯示效果,體現(xiàn)一次開發(fā)、多端部署的能力。
    的頭像 發(fā)表于 05-27 09:36 ?1154次閱讀
    <b class='flag-5'>鴻蒙</b><b class='flag-5'>OS</b><b class='flag-5'>開發(fā)</b>:典型頁面場景【<b class='flag-5'>一次</b><b class='flag-5'>開發(fā)</b>,<b class='flag-5'>多端</b><b class='flag-5'>部署</b>】實戰(zhàn)(設(shè)置典型頁面)

    HarmonyOS\"一次開發(fā),多端部署\"優(yōu)秀實踐——玩機(jī)技巧,碼上起航

    的潛在用戶群體。個應(yīng)用要在多類設(shè)備上提供統(tǒng)的內(nèi)容,需要適配不同的屏幕尺寸和硬件,開發(fā)成本較高。\"一次開發(fā),
    發(fā)表于 08-30 18:14

    華為開發(fā)者大會2021:一次開發(fā) 多端部署

    一次開發(fā) 多端部署使能開發(fā)者從單設(shè)備生態(tài)跨入多設(shè)備生態(tài)!
    的頭像 發(fā)表于 10-22 15:09 ?1648次閱讀
    華為<b class='flag-5'>開發(fā)</b>者大會2021:<b class='flag-5'>一次</b><b class='flag-5'>開發(fā)</b> <b class='flag-5'>多端</b><b class='flag-5'>部署</b>

    鴻蒙OS開發(fā):【一次開發(fā),多端部署】(多設(shè)備自適應(yīng)能力)簡單介紹

    本示例是《一次開發(fā)多端部署》的配套示例代碼,展示了[頁面開發(fā)多能力],包括
    的頭像 發(fā)表于 05-21 14:59 ?2446次閱讀
    <b class='flag-5'>鴻蒙</b><b class='flag-5'>OS</b><b class='flag-5'>開發(fā)</b>:【<b class='flag-5'>一次</b><b class='flag-5'>開發(fā)</b>,<b class='flag-5'>多端</b><b class='flag-5'>部署</b>】(多設(shè)備<b class='flag-5'>自適應(yīng)</b>能力)簡單介紹

    鴻蒙OS開發(fā):【一次開發(fā),多端部署】( 設(shè)置app頁面)

    本示例展示了設(shè)置應(yīng)用的典型頁面,其在小窗口和大窗口有不同的顯示效果,體現(xiàn)一次開發(fā)、多端部署的能力。
    的頭像 發(fā)表于 05-21 14:56 ?1078次閱讀
    <b class='flag-5'>鴻蒙</b><b class='flag-5'>OS</b><b class='flag-5'>開發(fā)</b>:【<b class='flag-5'>一次</b><b class='flag-5'>開發(fā)</b>,<b class='flag-5'>多端</b><b class='flag-5'>部署</b>】( 設(shè)置app頁面)