在线观看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 {
      ...
    }
    

審核編輯 黃宇

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

    關注

    60

    文章

    2613

    瀏覽量

    44006
  • OpenHarmony
    +關注

    關注

    29

    文章

    3848

    瀏覽量

    18542
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

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

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

    HarmonyOS NEXT應用元服務布局合理使用布局組件

    選擇合適的布局組件 在布局時,子組件會根據父組件的布局算法得到相應的排列規則,然后按照規則進行子組件位置的擺放。不同的布局容器使用的
    發表于 06-20 15:48

    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 ?2126次閱讀
    <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 ?2542次閱讀

    HarmonyOS ArkUI 3.0框架試玩初體驗

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

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

    垂直于主軸方向的軸線。Row容器交叉軸為縱向,Column容器交叉軸為橫向。
    的頭像 發表于 05-14 09:52 ?1032次閱讀
    鴻蒙<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 ?1205次閱讀
    鴻蒙<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 ?960次閱讀
    鴻蒙<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 ?1215次閱讀
    鴻蒙<b class='flag-5'>ArkUI</b><b class='flag-5'>開發</b>:<b class='flag-5'>常用布局</b>【 創建列表(List)】
    主站蜘蛛池模板: 色综合天天综合网亚洲影院 | 淫婷婷| 日本黄大片在线观看 | 婷婷免费高清视频在线观看 | 一级片免费在线播放 | 美女淫 | 精品亚洲国产国拍 | 分分精品 | 在线五月婷婷 | 在线不卡一区 | 天天干夜干 | 美女视频网站免费播放视 | 色在线观看视频 | 高清国产在线观看 | 午夜dy888理论 | 激情五月五月婷婷 | 最好看最新的中文字幕1 | 欧美性猛交xxxx免费 | 国内精品手机在线观看视频 | www.色噜噜| 综合免费视频 | 激情综合网五月激情 | 欧美人成在线观看 | 91国内在线国内在线播放 | 免费看一毛一级毛片视频 | 丁香亚洲综合五月天婷婷 | 国产女乱淫真高清免费视频 | 四虎影视大全免费入口 | 色免费在线观看 | 亚洲一区二区免费在线观看 | 在线天堂中文在线资源网 | 狠狠色丁香婷婷综合激情 | 久久久久激情免费观看 | 精品国产自在在线在线观看 | 草草操 | 四虎美女| 久久国模 | 久草3| 四虎网址大全 | 亚洲色图21p | 手机在线精品视频 |