在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

HarmonyOS開發ArkUI案例:【常用布局容器對齊方式】

jf_46214456 ? 來源:jf_46214456 ? 作者:jf_46214456 ? 2024-05-08 16:47 ? 次閱讀

介紹

基于ArkTS擴展的聲明式開發范式,實現Flex、Column、Row和Stack四種常用布局容器對齊方式。

效果圖如下:

相關概念

  • 主軸 :在布局容器中,默認存在兩根軸,分別是主軸和交叉軸,不同的容器中主軸的方向不一樣的。
    • 在Column容器中主軸的方向是垂直方向。
    • 在Row容器中主軸的方向是水平方向。
    • 在Flex容器中可以通過direction參數設置主軸的方向,設置為Column時,主軸的方向是垂直方向。設置為Row時,主軸的方向是水平方向。
    • 在Stack容器中沒有明確主軸與交叉軸,通過設置alignContent參數來改變容器內組件的對齊方式。
  • 交叉軸 :與主軸垂直相交的軸線,如果主軸是垂直方向,則交叉軸就是水平方向;如果主軸是水平方向,則交叉軸是垂直方向。

環境搭建

軟件要求

  • [DevEco Studio]版本:DevEco Studio 3.1 Release。
  • OpenHarmony SDK版本:API version 9。

硬件要求

  • 開發板類型:[潤和RK3568開發板]。
  • OpenHarmony系統:3.2 Release。

環境搭建

完成本篇Codelab我們首先要完成開發環境的搭建,本示例以RK3568開發板為例,參照以下步驟進行:

  1. [獲取OpenHarmony系統版本]:標準系統解決方案(二進制)。以3.2 Release版本為例:
  2. 搭建燒錄環境。
    1. [完成DevEco Device Tool的安裝]
    2. [完成RK3568開發板的燒錄]
  3. 搭建開發環境。
    1. 開始前請參考[工具準備],完成DevEco Studio的安裝和開發環境配置。
    2. 開發環境配置完成后,請參考[使用工程向導]創建工程(模板選擇“Empty Ability”)。
    3. 工程創建完成后,選擇使用[真機進行調測]。
    4. 鴻蒙開發指導文檔:[qr23.cn/FBD4cY]

代碼結構解讀

本篇Codelab只對核心代碼進行講解,完整代碼可以直接從gitee獲取。

├──entry/src/main/ets	                // 代碼區
│  ├──common
│  │  └──constants
│  │     └──CommonConstants.ets	        // 樣式常量類
│  ├──entryability
│  │  └──EntryAbility.ts                // 程序入口類
│  ├──pages
│  │  ├──LayoutAlignIndex.ets           // 主界面
│  │  └──Second.ets                     // 視頻播放界面		
│  ├──view
│  │  ├──ColumnAxisAlignRadioList.ets   // 自定義Column容器設置交叉軸對其方式屬性
│  │  ├──ColumnMainAlignRadioList.ets   // 自定義Column容器設置主軸對其方式屬性
│  │  ├──ColumnShowList.ets             // 自定義Column容器子元素列表文件
│  │  ├──CommonComponent.ets            // 自定義公共組件文件
│  │  ├──FlexAxisAlignRadioList.ets     // 自定義Flex容器設置交叉軸對其方式屬性
│  │  ├──FlexMainAlignRadioList.ets     // 自定義Flex容器設置主軸對其方式屬性
│  │  ├──FlexMainDirectionRadioList.ets // 自定義Flex容器設置主軸方向對其方式屬性
│  │  ├──FlexShowList.ets               // 自定義Flex容器子元素列表文件
│  │  ├──RowAxisAlignRadioList.ets      // 自定義Row容器設置交叉軸對其方式屬性
│  │  ├──RowMainAlignRadioList.ets      // 自定義Row容器設置主軸對其方式屬性
│  │  ├──RowShowList.ets                // 自定義Row容器子元素列表文件
│  │  ├──StackAlignRadioList.ets        // 自定義Stack容器設置對其方式屬性
│  │  └──StackComponent.ets             // 自定義Stack容器子元素文件
│  └──viewmodel
│     ├──AttributeModuleData.ets        // 屬性模塊數據
│     ├──ContainerModuleItem.ets        // 屬性模塊對象
│     ├──IndexData.ets                  // 首頁數據
│     └──IndexListItem.ets              // 首頁數據對象
└──entry/src/main/resource              // 應用靜態資源目錄

`HarmonyOSOpenHarmony鴻蒙文檔籽料:mau123789v直接拿`

搜狗高速瀏覽器截圖20240326151450.png

構建主界面

我們將完成示例主界面的設計,主界面由標題和4個容器模塊的 List 組成,效果圖如下:

  1. 在ets目錄下,新建幾個子目錄,點擊鼠標右鍵 >New>Directory,新建名為view的自定義子組件目錄、common公共目錄和viewmodel數據目錄。
  2. 在LayoutAlignIndex.ets主界面中包含顯示四種容器對齊方式的入口。
    // LayoutAlignIndex.ets
    @Entry
    @Component
    struct LayoutAlignIndex {
      private indexList: IndexListItem[] = getIndexList();
    
      build() {
        Column() {
          Text($r('app.string.index_title'))
            ...
          List() {
            ForEach(this.indexList, (item: IndexListItem) = > {
              ListItem() {
                ListItemComp({ item: item })
                  .margin({ top: MARGIN_FONT_SIZE_SPACE.SECOND_MARGIN })
              }
            }, (item: IndexListItem) = > JSON.stringify(item))
          }
          .height(ALL_PERCENT)
          .width(ALL_PERCENT)
          .listDirection(Axis.Vertical)
          .margin({ top: MARGIN_FONT_SIZE_SPACE.EIGHTH_MARGIN })
        }
        ...
      }
    }
    
    @Component
    struct ListItemComp {
      ...
    }
    

構建不同容器對齊方式顯示界面

  1. 在pages目錄下,點擊鼠標右鍵 >New>Page,新建Second.ets頁面。
    在view目錄下,點擊鼠標右鍵 >New>ArkTS File,新建五個ArkTS文件,分別為ColumnShowList.ets、FlexShowList.ets、RowShowList.ets、StackComponent.ets和CommonComponent.ets。

  2. 在ColumnShowList.ets中,自定組件ColumnShowList主要效果是在Column布局容器中,設置不同的主軸與交叉軸的對齊方式屬性時,顯示容器內元素的對齊方式,以及主軸對其方式和交叉軸對其方式屬性設置模塊。

    具體代碼如下:

    // ColumnShowList.ets
    @Component
    export struct ColumnShowList {
      @Consume currentColumnJustifyContent: FlexAlign;
      @Consume currentColumnAlignItems: HorizontalAlign;
    
      build() {
        Column() {
          Column() {
            ForEach(LIST, (item: number) = > {
              CommonItem({ item: item })
            }, (item: number) = > JSON.stringify(item))
          }
          ...
          // 設置主軸對齊方式
          ColumnMainAlignRadioList()
            .margin({ top: MARGIN_FONT_SIZE_SPACE.EIGHTH_MARGIN })
          // 設置交叉軸對齊方式
          ColumnAxisAlignRadioList()
            .margin({ top: MARGIN_FONT_SIZE_SPACE.EIGHTH_MARGIN })
        }
        ...
      }
    }
    

    其中ColumnMainAlignRadioList子組件和ColumnAxisAlignRadioList子組件分別是設置主軸對齊方式單選框列表和設置交叉軸對齊方式單選框列表,并且在FlexShowList,RowShowList和StackComponent中都存在代碼結構類似的子組件,只是設置的屬性和參數單選框列表不同,后面不在重復其詳細代碼,這里選擇其中一個單選框列表子組件來顯示。

    具體代碼如下:

    
    

// ColumnMainAlignRadioList.ets @Component export struct ColumnMainAlignRadioList { ...

build() {
   Column({ space: MARGIN_FONT_SIZE_SPACE.FIRST_MARGIN }) {
  // 單選框列表模塊名稱
     Row() {
       Text(this.moduleName)
         .fontSize(MARGIN_FONT_SIZE_SPACE.FOURTH_MARGIN)
     }
     .margin({ left: MARGIN_FONT_SIZE_SPACE.SECOND_MARGIN })

     Flex({
       direction: FlexDirection.Row,
       justifyContent: FlexAlign.SpaceBetween,
       wrap: FlexWrap.NoWrap
     }) {
       ForEach(this.radioList, (item: string, index?: number) = > {
         MainAlignRadioItem({ textName: item, groupName: this.groupName, isChecked: index === 0 ? true : false })
           .margin({ right: MARGIN_FONT_SIZE_SPACE.COMMON_MARGIN })
       }, (item: string) = > JSON.stringify(item))
     }
     ...
   }
   ...
 }

}

@Component struct MainAlignRadioItem { ...

build() {
   Row() {
     Radio({ value: this.textName, group: this.groupName })
       .checked(this.isChecked)
       .height((MARGIN_FONT_SIZE_SPACE.SECOND_MARGIN))
       .width((MARGIN_FONT_SIZE_SPACE.SECOND_MARGIN))
       .onClick(() = > {
         switch (this.textName) {
           case ATTRIBUTE.START:
             this.currentColumnJustifyContent = FlexAlign.Start;
             break;
           case ATTRIBUTE.CENTER:
             this.currentColumnJustifyContent = FlexAlign.Center;
             break;
           default:
             this.currentColumnJustifyContent = FlexAlign.End;
             break;
         }
       })
     Text(this.textName)
       .fontSize(MARGIN_FONT_SIZE_SPACE.THIRD_MARGIN)
       .opacity(ATTRIBUTE_OPACITY)
   }
 }

}

3. 在FlexShowList.ets中,自定組件FlexShowList主要效果是在Flex布局容器中,設置不同的參數時,顯示容器內元素對齊方式。

![](figures/zh-cn_image_0000001458437253.png)

具體代碼如下:

```typescript
// FlexShowList.ets
@Component
export struct FlexShowList {
  @Consume list: number[];
  @Consume currentFlexDirection: FlexDirection;
  @Consume currentFlexJustifyContent: FlexAlign;
  @Consume currentFlexAlignItems: ItemAlign;
  @Consume currentFlexWrap: FlexWrap;
  @Consume currentFlexAlignContent: FlexAlign;

  build() {
    Column() {
      Flex({
	    // 參數設置
        ...
      }) {
        ForEach(this.list, (item: number) = > {
          CommonItem({ item: item })
        }, (item: number) = > JSON.stringify(item))
      }
      ...
      // 設置主軸方向
      FlexMainDirectionRadioList()
        .margin({ top: MARGIN_FONT_SIZE_SPACE.EIGHTH_MARGIN })
      // 設置主軸方向
      FlexMainAlignRadioList()
        .margin({ top: MARGIN_FONT_SIZE_SPACE.EIGHTH_MARGIN })
      // 設置交叉軸對齊方式
      FlexAxisAlignRadioList()
        .margin({ top: MARGIN_FONT_SIZE_SPACE.EIGHTH_MARGIN })
    }
    ...
  }
}
  1. 在RowShowList.ets中,自定組件RowShowList主要效果是在Row布局容器中,當設置不同的主軸與交叉軸的對齊方式屬性時,顯示容器內元素的對齊方式。

    代碼如下:
    // RowShowList.ets
    @Component
    export struct RowShowList {
      @Consume currentRowJustifyContent: FlexAlign;
      @Consume currentRowAlignItems: VerticalAlign;
    
      build() {
        Column() {
          Row() {
            ForEach(LIST, (item: number) = > {
              CommonItem({ item: item })
            }, (item: number) = > JSON.stringify(item))
          }
          ...
          // 設置主軸對齊方式
          RowMainAlignRadioList()
            .margin({ top: MARGIN_FONT_SIZE_SPACE.EIGHTH_MARGIN })
          // 設置交叉軸對齊方式
          RowAxisAlignRadioList()
            .margin({ top: MARGIN_FONT_SIZE_SPACE.EIGHTH_MARGIN })
        }
        ...
      }
    }
    
  2. 在StackComponent.ets中,自定組件StackComponent主要效果是在Stack布局容器中,設置不同對齊方式屬性時,容器內堆疊元素的對齊方式。

    代碼如下:
    // StackComponent.ets
    @Component
    export struct StackComponent {
      ...
    
      build() {
        Column() {
          Stack({ alignContent: this.currentStackAlignContent }) {
            Text('')
              .width(ALL_PERCENT)
              .height(ALL_PERCENT)
              .fontSize(MARGIN_FONT_SIZE_SPACE.FOURTH_MARGIN)
              .backgroundColor($r('app.color.show_list_backgroundColor'))
            Text(this.message)
              ...
          }
          .margin({ top: MARGIN_FONT_SIZE_SPACE.FIRST_MARGIN })
          .width(ALL_PERCENT)
          .height(SHOW_LIST_HEIGHT_PERCENT.STACK_SHOW_LIST_HEIGHT)
          // 設置對齊方式
          StackAlignRadioList()
            .margin({ top: MARGIN_FONT_SIZE_SPACE.EIGHTH_MARGIN })
        }
        ...
      }
    }
    
  3. 在CommonComponent.ets中,自定義組件CommonItem,代碼如下:
    // CommonComponent.ets
    @Component
    export struct CommonItem {
      private item: number = 0;
    
      build() {
        Text(this.item.toString())
          .fontSize(MARGIN_FONT_SIZE_SPACE.FIFTH_MARGIN)
          .width(MARGIN_FONT_SIZE_SPACE.NINTH_MARGIN)
          .height(MARGIN_FONT_SIZE_SPACE.NINTH_MARGIN)
          .fontColor($r("app.color.show_list_fontColor"))
          .textAlign(TextAlign.Center)
          .align(Alignment.Center)
          .backgroundColor($r("app.color.white"))
          .borderRadius(MARGIN_FONT_SIZE_SPACE.COMMON_PADDING)
          .margin(MARGIN_FONT_SIZE_SPACE.COMMON_PADDING)
      }
    }
    
  4. 在Second.ets頁面,根據首頁跳轉時的參數,渲染頂部不同的容器名稱和條件渲染不同的子組件。
    代碼如下:
    // Second.ets
    @Entry
    @Component
    struct Second {
      ...
    
      aboutToAppear() {
        let params = router.getParams() as Record< string, Object >;
        this.moduleList = params.moduleList as ContainerModuleItem[];
        this.componentName = params.componentName as string;
        this.containerType = params.containerType as number;
      }
    
      build() {
        Row() {
          Column({ space: MARGIN_FONT_SIZE_SPACE.SIXTH_MARGIN }) {
            Column() {
              BackComp({ componentName: this.componentName })
              if (this.containerType === CONTAINER_TYPE.FLEX) {
                FlexShowList()
              } else if (this.containerType === CONTAINER_TYPE.COLUMN) {
                ColumnShowList()
              } else if (this.containerType === CONTAINER_TYPE.ROW) {
                RowShowList()
              } else {
                StackComponent()
              }
            }
            .width(ALL_PERCENT)
            .height(ALL_PERCENT)
          }
          .width(ALL_PERCENT)
        }
        .height(ALL_PERCENT)
      }
    }
    
    @Component
    struct BackComp {
      ...
    }
    

審核編輯 黃宇

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 鴻蒙
    +關注

    關注

    57

    文章

    2469

    瀏覽量

    43652
  • OpenHarmony
    +關注

    關注

    26

    文章

    3804

    瀏覽量

    17894
收藏 人收藏

    評論

    相關推薦

    HarmonyOS開發案例:【常用組件與布局

    HarmonyOS ArkUI提供了豐富多樣的UI組件,您可以使用這些組件輕松地編寫出更加豐富、漂亮的界面。
    的頭像 發表于 05-09 18:20 ?1568次閱讀
    <b class='flag-5'>HarmonyOS</b><b class='flag-5'>開發</b>案例:【<b class='flag-5'>常用</b>組件與<b class='flag-5'>布局</b>】

    鴻蒙ArkUI開發常用布局【主軸】

    線性布局的子元素在線性方向上(水平方向和垂直方向)依次排列
    的頭像 發表于 05-13 17:33 ?1033次閱讀
    鴻蒙<b class='flag-5'>ArkUI</b><b class='flag-5'>開發</b>:<b class='flag-5'>常用布局</b>【主軸】

    HDD杭州站?ArkUI開發更靈活

    開發更靈活,并透露了ArkUI的下一步計劃。下面,小編帶您了解本次活動中HarmonyOS技術專家分享的精彩內容。一、整體介紹ArkUI是用于構建H
    發表于 08-05 11:33

    4天帶你上手HarmonyOS ArkUI開發

    本次HarmonyOS ArkUI入門訓練營課程--健康生活實戰篇,手把手教大家如何制作一個合理膳食的APP前端Demo!課程實戰樣例通過ArkUI聲明式UI開發框架實現,只需用幾行簡
    發表于 09-09 14:44

    ArkUI開發趣味體驗,快來抽取限量HarmonyOS專屬頭像!

    本次ArkUI開發趣味體驗活動,將手把手教大家如何在IDE里實操一個ArkUI程序,通過補充缺失代碼,成功運行程序開啟抽獎功能,抽取個人專屬頭像,做HarmonyOS第一批數字藏品家!
    發表于 12-08 17:20

    4天帶你上手HarmonyOS ArkUI開發——《HarmonyOS ArkUI入門訓練營之健康生活實戰》

    HarmonyOS ArkUI入門訓練營之健康飲食應用》是面向入門開發者打造的實戰課程系列。特邀華為終端BG高級開發工程師作為本次訓練營講師,以健康飲食為例,開展技術教學及實戰案例分
    發表于 01-05 11:49

    ArkUI新能力,助力應用開發更便捷

    的用戶體驗。隨著HarmonyOS 3.1版本的發布,ArkUI也新增許多能力,助力應用開發更便捷。 ArkUI框架新增能力概覽 ArkUI
    發表于 02-15 11:40

    OpenHarmony使用ArkUI Inspector分析布局

    本文轉載自《#2023 盲盒+碼 # OpenHarmony使用ArkUI Inspector分析布局》,作者:zhushangyuan_ ● 摘要:視圖的嵌套層次會影響應用的性能,開發者應該移除
    發表于 09-04 15:27

    HarmonyOS測試技術與實戰-華為ArkUI開發框架和場景測試

    HDC 2021華為開發者大會HarmonyOS測試技術與實戰-華為ArkUI開發框架和場景測試
    的頭像 發表于 10-23 15:16 ?2053次閱讀
    <b class='flag-5'>HarmonyOS</b>測試技術與實戰-華為<b class='flag-5'>ArkUI</b><b class='flag-5'>開發</b>框架和場景測試

    HarmonyOS ArkUI 3.0框架試玩初體驗

    ?? HarmonyOS ArkUI 3.0?正式到來,今天就給大家分享一下我的 HarmonyOS ArkUI 3.0 框架試玩初體驗,以合成 1024 的
    的頭像 發表于 11-01 14:53 ?2424次閱讀

    HarmonyOS ArkUI 3.0框架試玩初體驗

    ?? HarmonyOS ArkUI 3.0?正式到來,今天就給大家分享一下我的 HarmonyOS ArkUI 3.0 框架試玩初體驗,以合成 1024 的
    的頭像 發表于 12-03 10:14 ?3773次閱讀

    鴻蒙ArkUI開發常用布局【交叉軸】

    垂直于主軸方向的軸線。Row容器交叉軸為縱向,Column容器交叉軸為橫向。
    的頭像 發表于 05-14 09:52 ?885次閱讀
    鴻蒙<b class='flag-5'>ArkUI</b><b class='flag-5'>開發</b>:<b class='flag-5'>常用布局</b>【交叉軸】

    鴻蒙ArkUI開發:【彈性布局(主軸&amp;交叉軸對齊方式)】

    通過justifyContent參數設置在主軸方向的對齊方式,和Row、Column的主軸對齊方式行為一樣
    的頭像 發表于 05-14 15:33 ?1054次閱讀
    鴻蒙<b class='flag-5'>ArkUI</b><b class='flag-5'>開發</b>:【彈性<b class='flag-5'>布局</b>(主軸&amp;交叉軸<b class='flag-5'>對齊</b><b class='flag-5'>方式</b>)】

    鴻蒙ArkUI開發常用布局【相對布局

    相對布局可以讓子元素指定兄弟元素或父容器作為錨點,基于錨點做位置布局
    的頭像 發表于 05-14 20:50 ?818次閱讀
    鴻蒙<b class='flag-5'>ArkUI</b><b class='flag-5'>開發</b>:<b class='flag-5'>常用布局</b>【相對<b class='flag-5'>布局</b>】

    鴻蒙ArkUI開發常用布局【 創建列表(List)】

    列表容器是為了高效處理長列表的容器,能支持橫向、豎向滾動,數據分組,分組頭懸浮等功能
    的頭像 發表于 05-15 15:30 ?1064次閱讀
    鴻蒙<b class='flag-5'>ArkUI</b><b class='flag-5'>開發</b>:<b class='flag-5'>常用布局</b>【 創建列表(List)】
    主站蜘蛛池模板: 一级不卡毛片 | 五月桃花网婷婷亚洲综合 | 1024手机看片你懂得的 日韩欧美 | 在线色网站 | 888米奇色狠狠俺去啦 | 久久99久久99精品免观看 | 中文字幕第页 | 美女被草视频 | 天天影视亚洲 | 日韩毛片在线 | 高颜值美女啪啪 | 天天摸夜夜添狠狠添2018 | 人人爱天天做夜夜爽毛片 | 唐人社电亚洲一区二区三区 | 男女一区二区三区免费 | 久久精品国产四虎 | 国产福利在线观看一区二区 | 天天夜天干天天爽 | 特级毛片aaaaaa蜜桃 | 天天色天天碰 | 日本三级香港三级三级人!妇久 | 35qao强力打造免费上线高清 | 午夜黄色福利 | 性xxxx黑人与亚洲 | 黄色短视频软件 | 在线视频亚洲一区 | 日本超黄视频 | 国产综合色精品一区二区三区 | 亚洲一区二区免费看 | 国产美女精品久久久久中文 | 特黄a大片免费视频 | 免费看一级黄色录像 | 国产精品久久久香蕉 | 国产成人精品日本亚洲语言 | 免费在线黄色网 | 国产狂喷冒白浆免费视频 | 五月在线观看 | 天堂资源最新版在线官网 | 深夜视频免费在线观看 | 亚洲国产福利精品一区二区 | 国产伦精品一区二区三区四区 |