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

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

3天內不再提示

鴻蒙ArkUI聲明式學習:【UI資源管理】

jf_46214456 ? 來源:jf_46214456 ? 作者:jf_46214456 ? 2024-04-08 22:08 ? 次閱讀

OpenHarmony 應用的資源分類和資源的訪問以及應用開發使用的像素單位以及各單位之間相互轉換的方法。

資源分類

移動端應用開發常用到的資源比如圖片,音視頻,字符串等都有固定的存放目錄,OpenHarmony 把這些應用的資源文件統一放在 resources 目錄下的各子目錄中便于開發者使用和維護, resoures 目錄包括兩大類,一類為 base 目錄與限定詞目錄,另一類為 rawfile 目錄。新建 OpenHarmony 應用,默認生成的資源目錄如下所示:

2_3_1_1

base 目錄與限定詞目錄下面可以創建資源組目錄(包括 element 、 media 、animation 、 layout 、 graphic 、 profile ),用于存放特定類型的資源文件,各資源目錄說明如下圖所示:

2_3_1_2

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

資源訪問

OpenHarmony 應用資源分為兩類,一類是應用資源,另一類是系統資源,它們的資源訪問方式如下:

  • 訪問應用資源
    base 目錄下的資源文件會被編譯成二進制文件并且給這些資源賦予唯一的 ID ,使用相應資源的時候通過資源訪問符 r('app.type.name') 的形式,app 代表是應用內 resources 目錄中定義的資源;type 表示資源類型,可取值有 color 、 float 、 string 、 string 、 media 等;name 表示資源的文件名字。例如 string.json 中新加 nametext_string 的字符串,則訪問該字符串資源為 r('app.string.text_string') 。
    筆者在 base 目錄下新建 float.jsoncolor.json 文件,分別存放字體和顏色,資源內容如下圖所示:
    2_3_2_1
    通過 $('app.type.name') 訪問資源的簡單樣例如下所示:

    @Entry @Component struct ResourceTest {
      build() {
        Column({space: 10}) {
          Text($r('app.string.text_string'))                       // 訪問字符串資源
            .size({width: 300, height: 120})                       // 設置尺寸
            .fontSize($r('app.float.text_size'))                   // 訪問字體大小
            .fontColor($r('app.color.text_color'))                 // 訪問字體顏色
            .backgroundImage($r('app.media.test'), ImageRepeat.XY) // 設備背景圖片
        }
        .width('100%')
        .height('100%')
        .padding(10)
      }
    }
    

    樣例運行結果如下圖所示:

    2_3_2_2

  • 訪問系統資源
    系統資源包含 顏色 、 圓角 、 字體 、 間距 、 字符串圖片 等,通過使用系統資源,不同的開發者可以開發出具有相同視覺風格的應用,開發者可以通過 $r('sys.type.name') 的形式引用系統資源,和訪問應用資源不同的是使用 sys 代表系統資源,其它和訪問應用資源規則一致。
    訪問系統資源簡單樣例如下所示:

    @Entry @Component struct ResourceTest {
      build() {
        Column() {
          Text('Hello')
            .fontColor($r('sys.color.ohos_id_color_emphasize'))
            .fontSize($r('sys.float.ohos_id_text_size_headline1'))
            .fontFamily($r('sys.string.ohos_id_text_font_family_medium'))
            .backgroundColor($r('sys.color.ohos_id_color_palette_aux1'))
          Image($r('sys.media.ohos_app_icon'))
            .border({
              color: $r('sys.color.ohos_id_color_palette_aux1'),
              radius: $r('sys.float.ohos_id_corner_radius_button'),
              width: 2
            })
            .margin({
              top: $r('sys.float.ohos_id_elements_margin_horizontal_m'),
              bottom: $r('sys.float.ohos_id_elements_margin_horizontal_l')
            })
            .height(200)
            .width(300)
        }
        .padding(10)
        .width("100%")
        .height("100%")
      }
    }
    

    樣例運行結果如下圖所示:

    2_3_2_3

像素單位

ArkUI開發框架提供了 4 種像素單位供開發者使用,分別是: px 、 vp 、 fplpx ,它們之間的區別如下表所示:

名稱描述
px屏幕物理像素單位。
vp屏幕密度相關像素單位,根據屏幕像素密度轉換為屏幕物理像素。
fp字體像素,與vp類似適用于屏幕密度變化,隨系統字體大小設置變化。
lpx視窗邏輯像素單位,lpx單位為實際屏幕寬度與邏輯寬度(在 config.json 中配置的 designWidth )的比值,如配置 designWdith 為 720 時,在實際寬度為 1440 物理像素的屏幕上, 1px 為 2px 。

ArkUI開發框架也提供了全局方法把這些不同的尺寸單位相互轉換,全局方法如下所示:

declare function vp2px(value: number): number;
declare function px2vp(value: number): number;
declare function fp2px(value: number): number;
declare function px2fp(value: number): number;
declare function lpx2px(value: number): number;
declare function px2lpx(value: number): number;
  • vp2px :將 vp 單位的數值轉換為以 px 為單位的數值。
  • px2vp :將 px 單位的數值轉換為以 vp 為單位的數值。
  • fp2px :將 fp 單位的數值轉換為以 px 為單位的數值。
  • px2fp :將 px 單位的數值轉換為以 fp 為單位的數值。
  • lpx2px :將 lpx 單位的數值轉換為以 px 為單位的數值。
  • px2lpx :將 px 單位的數值轉換為以 lpx 為單位的數值。

這些單位尺寸具體大小,筆者舉個簡單樣例演示一下:

@Entry @Component struct ResourceTest {
  build() {
    Column() {
      Flex({ wrap: FlexWrap.Wrap }) {
        Column() {
          Text("width(220)")
            .width(220)
            .height(40)
            .backgroundColor(Color.Pink)
            .textAlign(TextAlign.Center)
            .fontSize('12vp')
        }.margin(5)

        Column() {
          Text("width('220px')")
            .width('220px')
            .height(40)
            .backgroundColor(Color.Pink)
            .textAlign(TextAlign.Center)
        }.margin(5)

        Column() {
          Text("width('220vp')")
            .width('220vp')
            .height(40)
            .backgroundColor(Color.Pink)
            .textAlign(TextAlign.Center)
            .fontSize('12vp')
        }.margin(5)

        Column() {
          Text("width('220lpx') designWidth:720")
            .width('220lpx')
            .height(40)
            .backgroundColor(Color.Pink)
            .textAlign(TextAlign.Center)
            .fontSize('12vp')
        }.margin(5)

        Column() {
          Text("width(vp2px(220) + 'px')")
            .width(vp2px(220) + 'px')
            .height(40)
            .backgroundColor(Color.Pink)
            .textAlign(TextAlign.Center)
            .fontSize('12vp')
        }.margin(5)

        Column() {
          Text("fontSize('12fp')")
            .width(220)
            .height(40)
            .backgroundColor(Color.Pink)
            .textAlign(TextAlign.Center)
            .fontSize('12fp')
        }.margin(5)
      }
      .width('100%')
      .height("100%")
    }
    .width('100%')
    .height("100%")
    .padding(10)
  }
}

樣例運行結果如下圖所示:

2_3_3_1

資源管理器

ArkUI開發框架在 @ohos.resourceManager 模塊里提供了資源管理器 ResourceManager,它可以訪問不同的資源,比如獲取獲取字符串資源,獲取設備配置信息等等,resourceManager 模塊提供部分 API 如下所示:

declare namespace resourceManager {
  // 省略部分代碼
  export interface ResourceManager {
      // 獲取字符串資源
      getString(resId: number, callback: AsyncCallback< string >): void;
      // 獲取字符串數組資源
      getStringArray(resId: number, callback: AsyncCallback< Array< string >>): void;
      // 獲取媒體資源
      getMedia(resId: number, callback: AsyncCallback< Uint8Array >): void;
      // 獲取設備信息,比如當前屏幕密度,設備類型是手機還是平板等
      getDeviceCapability(callback: AsyncCallback< DeviceCapability >): void;
      // 獲取配置信息,比如當前屏幕方向密度,當前設備語言
      getConfiguration(callback: AsyncCallback< Configuration >): void;
      // 釋放ResourceManager資源
      release();
  }
}
export default resourceManager;

使用 ResourceManager 之前先調用 getContext(this) 方法獲取當前組件的 Context ,該 Conetxt 內部定義了一個 ResourceManager 的屬性,因此可以直接使用 ResourceManager 的各種 getXXX() 方法獲取對應資源, ResourceManager 使用流程如下所示:

  • 引入 resourceManager

    import resourceManager from '@ohos.resourceManager';
    

    1

  • 獲取 ResourceManager

    aboutToAppear() {
      // 獲取ResourceManager
      let manager = getContext(this).resourceManager;
    }
    
  • 使用 ResourceManager

    manager.getString(0x1000001, (innerError, data) = > {
      if(data) {
        // 獲取資源成功
      } else {
        console.log("error: " + JSON.stringify(innerError))
      }
    })
    
  • 釋放 ResourceManager

    this.manager.release();
    

完整樣例如下所示:

import resourceManager from '@ohos.resourceManager';

@Entry @Component struct ResourceTest {

  @State text_string: string = "";
  @State capability: string = "";
  @State configuration: string = "";
  
  private resManager: resourceManager.ResourceManager;

  build() {
    Column({ space: 10 }) {
      Text(this.text_string)                   // 訪問字符串資源
        .size({ width: 300, height: 120 })     // 設置尺寸
        .fontSize($r('app.float.text_size'))   // 訪問字體大小
        .fontColor($r('app.color.text_color')) // 訪問字體顏色
        .backgroundImage($r('app.media.test')) // 設備背景圖片

      Text(this.capability)                    // capability信息
        .fontSize(20)

      Text(this.configuration)                 // configuration信息
        .fontSize(20)
    }
    .width('100%')
    .height('100%')
    .padding(10)
  }

  aboutToAppear() {
    this.resManager = getContext(this).resourceManager;
    this.resManager.getStringValue(0x1000001, (innerError, data) = > {
      if(data) {
        this.text_string = data;
      } else {
        console.log("error: " + JSON.stringify(innerError));
      }
    })

    this.resManager.getDeviceCapability((innerError, deviceCapability) = > {
      if(deviceCapability) {
        this.capability = JSON.stringify(deviceCapability);
      }
    })

    this.resManager.getConfiguration((innerError, configuration) = > {
      if(configuration) {
        this.configuration = JSON.stringify(configuration);
      }
    })
  }
  
  aboutToDisappear() {
    this.resManager?.release(); // 釋放 ReleaseManager 資源
  }

}

樣例運行結果如下圖所示:

2_3_4_1

渲染出來的 mock string 是因為在預覽器上暫時不支持 ResourceManager 的用法,在實際設備上是沒問題的。

審核編輯 黃宇

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

    關注

    55

    文章

    1919

    瀏覽量

    42196
  • OpenHarmony
    +關注

    關注

    24

    文章

    3442

    瀏覽量

    15291
收藏 人收藏

    評論

    相關推薦

    鴻蒙ArkUI開發學習:【渲染控制語法】

    ArkUI開發框架是一套構建 HarmonyOS / OpenHarmony 應用界面的聲明UI開發框架,它支持程序使用?`if/else`?條件渲染,?`ForEach`?循環渲染以及?`LazyForEach`?懶加載渲染
    的頭像 發表于 04-09 16:40 ?522次閱讀
    <b class='flag-5'>鴻蒙</b><b class='flag-5'>ArkUI</b>開發<b class='flag-5'>學習</b>:【渲染控制語法】

    鴻蒙這么大聲勢,為何遲遲看不見崗位?最新數據來了

    基礎》 ArkTS語言 安裝DevEco Studio 運用你的第一個ArkTS應用 ArkUI聲明UI開發 .…… 《鴻蒙開發進階》
    發表于 02-29 20:53

    HarmonyOS應用開發-ArkUI聲明UI工程體驗與分享

    聲明UI工程體驗1. 創建工程說明:聲明UI工程目前僅在API7才能使用 選擇 選擇
    發表于 12-08 10:22

    4天帶你上手HarmonyOS ArkUI開發

    ArkUI開發應用界面!完成學習任務并且參與考試,獲取您的個人證書及學習激勵禮品!2、通過學習課程,使用ArkUI
    發表于 09-09 14:44

    ArkUI框架,更懂程序員的UI信息語法

    搜索了一下ArkUI有什么優勢。發現很重要的一個原因:ArkUI使用了聲明UI開發框架,同時在UI
    發表于 12-14 11:23

    ArkUI,更高效的框架設計

    了一整套完整的分層機制。接下來我們依次分層為大家介紹。 ArkUI框架的“前驅”——【前端層】 前端層 架構的第一層【前端層】又稱【聲明UI前端】,這一層包含了上期文章介紹的極簡的
    發表于 12-21 10:26

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

    開發者快速提升技能實力進階。目標學員入門開發者(計算機專業相關)學習鏈接:https://t.elecfans.com/c2241.html訓練營目標通過學習ArkUI入門訓練營課程,了解聲明
    發表于 01-05 11:49

    WCDMA無線資源管理

    本課程介紹了無線資源管理的相關知識。首先通過對無線資源管理的總體介紹,讓大家對無線資源管理有了一個大體上的概念接著對無線資源管理的幾個方面:信道配置、
    發表于 06-01 16:02 ?5次下載

    網格資源管理模型研究

    文章分析了網格資源管理中的三種模型:傳統的資源管理,基于代理的資源管理和基于經濟學的資源管理。以Globus 為例討論了傳統的資源管理方法;
    發表于 08-07 14:30 ?15次下載

    基于樹形的網格資源管理研究

    資源管理是計算機網格研究的基礎內容之一。首先介紹了當前的主流網格資源管理模型,然后提出了一種新型的資源管理模型――基于樹形的網格資源管理模型。模型以代理作為基
    發表于 12-30 14:17 ?15次下載

    什么是無線資源管理,主要的技術有哪些?

    什么是無線資源管理,主要的技術有哪些?無線資源管理(Radio Resource Management,RRM)的目標是在有限帶寬的條件下,為網絡內無線用戶終端提供業務質量保障,
    發表于 06-18 00:10 ?5630次閱讀

    Hadoop的YARN資源管理系統

    本質上是資源管理系統。YARN提供了資源管理資源調度等機制
    的頭像 發表于 03-15 17:00 ?1941次閱讀
    Hadoop的YARN<b class='flag-5'>資源管理</b>系統

    華為推出新聲明UI 開發框架(ArkUI

    今年的 HDC 華為開發者大會 2021,華為又雙叒推出新的聲明UI 開發框架(ArkUI),咋說呢,學無止境啊,更新速度堪比坐火箭。
    的頭像 發表于 01-04 13:39 ?3816次閱讀

    鴻蒙ArkUI:【從代碼到UI顯示的整體渲染流程】

    方舟開發框架(簡稱ArkUI)是鴻蒙開發的UI框架,提供如下兩種開發范式,我們 **只學聲明式開發范式**
    的頭像 發表于 05-13 16:06 ?230次閱讀
    <b class='flag-5'>鴻蒙</b><b class='flag-5'>ArkUI</b>:【從代碼到<b class='flag-5'>UI</b>顯示的整體渲染流程】

    鴻蒙ArkUI-X跨平臺開發:【 編寫第一個ArkUI-X應用】

    通過構建一個簡單的ArkUI頁面跳轉示例,快速了解資源創建引用,路由代碼編寫和UI布局編寫等應用開發流程。
    的頭像 發表于 05-21 17:36 ?203次閱讀
    <b class='flag-5'>鴻蒙</b><b class='flag-5'>ArkUI</b>-X跨平臺開發:【 編寫第一個<b class='flag-5'>ArkUI</b>-X應用】
    亚洲欧美日韩精品久久_久久精品AⅤ无码中文_日本中文字幕有码在线播放_亚洲视频高清不卡在线观看
    <acronym id="s8ci2"><small id="s8ci2"></small></acronym>
    <rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
    <acronym id="s8ci2"></acronym>
    <acronym id="s8ci2"><center id="s8ci2"></center></acronym>