Harmony OS“一多” 詳解:基于窗口變化的斷點自適應實現

一、一多開發核心概念(1+8+N模式)

? ? ? ? 目標:一次開發多端部署 解決的問題:
????????????????1、界面級一多:適配不同屏幕尺寸
????????????????2、功能級一多:設備功能兼容性處理(CanIUser)
????????????????3、工程級一多:項目架構管理(三成架構HAP、HAR、HSP)

二、界面級一多解決方法

1、自適應布局

能力

核心屬性/組件

代碼示例

拉伸

flexGrow/flexShrink

.flexGrow(1).flexShrink(1)

均分

justifyContent: SpaceEvenly

Row().justifyContent(FlexAlign.SpaceEvenly)

占比

layoutWeight 或百分比寬高

.width('50%').layoutWeight(1)

縮放

aspectRatio

.aspectRatio(1.5)

延伸

List/Scroll + Row

List().listDirection(Axis.Horizontal)

隱藏

displayPriority

.displayPriority(2)

折行

FlexWrap.Wrap

Flex({ wrap: FlexWrap.Wrap })

2、響應式布局

? ? ? ? 2-1、斷點系統

斷點

范圍(vp)

典型設備

xs

[0, 320)

智能手表

sm

[320, 600)

手機豎屏

md

[600, 840)

折疊屏/橫屏

lg

[840, +∞)

平板/PC

// 在Ability中監聽窗口變化
windowObj.on('windowSizeChange', (size) => {const widthVp = size.width / density;AppStorage.set('currentBreakpoint', calculateBreakpoint(widthVp));
});

2-2、媒體查詢

// 創建監聽器
const listener = mediaquery.matchMediaSync('(320vp<=width<600vp)');
// 注冊回調
listener.on('change', (res) => {if (res.matches) AppStorage.set('breakpoint', 'sm');
});
// 移除監聽
listener.off('change');

2-3柵格布局

GridRow({columns: { sm: 4, md: 8, lg: 12 },gutter: 10
})
/*--------------------------------------------*/
//GridRow:定義行布局規則
GridRow({columns: { sm: 4, md: 8, lg: 12 },gutter: 10
})
/*--------------------------------------------*/
//GridCol:定義列占比與偏移
GridCol({span: { sm: 2, md: 4 },offset: { md: 1 }
})

場景

推薦方案

優勢

微調元素尺寸

自適應布局(占比/拉伸)

簡單高效,代碼侵入性低

多設備顯隱邏輯

響應式布局(媒體查詢)

精確控制不同斷點下的UI表現

復雜多列布局

柵格系統

內置響應規則,維護性強

全局斷點狀態管理

BreakpointSystem工具

統一管理斷點,避免重復監聽

3、界面級一多斷點
import window from '@ohos.window'
import display from '@ohos.display'
import UIAbility from '@ohos.app.ability.UIAbility'export default class EntryAbility extends UIAbility {private windowObj?: window.Windowprivate curBp: string = ''//...// 根據當前窗口尺寸更新斷點private updateBreakpoint(windowWidth: number) :void{// 將長度的單位由px換算為vplet windowWidthVp = windowWidth / display.getDefaultDisplaySync().densityPixelslet newBp: string = ''if (windowWidthVp < 320) {newBp = 'xs' // 超小屏} else if (windowWidthVp < 600) {newBp = 'sm' // 小屏} else if (windowWidthVp < 840) {newBp = 'md' // 中屏} else {newBp = 'lg' // 大屏}if (this.curBp !== newBp) {this.curBp = newBp// 使用狀態變量記錄當前斷點值AppStorage.setOrCreate('currentBreakpoint', this.curBp)}}onWindowStageCreate(windowStage: window.WindowStage) :void{windowStage.getMainWindow().then((windowObj) => {this.windowObj = windowObj// 獲取應用啟動時的窗口尺寸this.updateBreakpoint(windowObj.getWindowProperties().windowRect.width)// 注冊回調函數,監聽窗口尺寸變化windowObj.on('windowSizeChange', (windowSize)=>{this.updateBreakpoint(windowSize.width)})});// ...}//...
}
  1. 技術棧
    • 鴻蒙特定 API:基于鴻蒙系統的@ohos.window@ohos.display@ohos.app.ability.UIAbility模塊進行開發,充分利用鴻蒙系統提供的窗口管理、顯示信息獲取以及應用能力相關的原生 API。
  2. 核心點
    • 窗口尺寸監聽:在onWindowStageCreate方法中,通過windowStage.getMainWindow().then獲取主窗口對象,隨后利用windowObj.on('windowSizeChange', ...)注冊回調函數,實時監聽窗口尺寸變化,這是實現屏幕適配的關鍵起始步驟。
    • 斷點計算與更新updateBreakpoint方法將獲取到的窗口寬度從像素(px)換算為虛擬像素(vp),根據不同的vp范圍確定對應的斷點值(xssmmdlg)。當計算出的新斷點與當前斷點不同時,更新當前斷點并通過AppStorage.setOrCreate方法記錄在狀態變量中,以便應用其他部分根據斷點值進行不同的布局或功能調整。

三、總結?

????????本文圍繞 “一多開發” 這一核心概念展開,著重探討了其在界面級的實現方式。“一多開發” 旨在達成一次開發多端部署,解決界面、功能及工程等層面的適配與管理問題。

????????在界面級,通過自適應布局、響應式布局兩種主要方式實現對不同屏幕尺寸的適配。自適應布局借助如flexGrowjustifyContent等多種屬性和組件,能簡單高效地微調元素尺寸;響應式布局則通過斷點系統、媒體查詢和柵格布局,可更精準地控制不同設備下的 UI 表現,滿足多設備顯隱邏輯和復雜多列布局等場景需求。

????????結合提供的鴻蒙開發代碼示例,其基于鴻蒙特定 API 實現了窗口尺寸監聽與斷點計算更新,這是界面適配的關鍵技術點。通過監聽窗口變化獲取尺寸信息,換算為vp后確定斷點值并記錄,為應用根據不同屏幕尺寸調整布局和功能提供依據。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/75708.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/75708.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/75708.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

SpringMvc獲取請求數據

基本參數 RequestMapping("save5") ResponseBody public User save5(String name, int age) {User user new User();user.setName(name);user.setAge(age);return user; } 在url中將name與age進行編寫&#xff0c;通過框架可以提取url中的name與age&#xff0c;這…

大模型持續學習方案解析:災難性遺忘的工業級解決方案

引言 隨著大型語言模型&#xff08;LLMs&#xff09;如 GPT 系列、BERT 等在自然語言處理領域取得突破性進展&#xff0c;它們強大的理解和生成能力已經滲透到各行各業。然而&#xff0c;這些模型通常是在海量靜態數據集上進行一次性預訓練的。現實世界是動態變化的&#xff0…

推薦系統(二十二):基于MaskNet和WideDeep的商品推薦CTR模型實現

在上一篇文章《推薦系統&#xff08;二十一&#xff09;&#xff1a;基于MaskNet的商品推薦CTR模型實現》中&#xff0c;筆者基于 MaskNet 構建了一個簡單的模型。筆者所經歷的工業級實踐證明&#xff0c;將 MaskNet 和 Wide&Deep 結合應用&#xff0c;可以取得不錯的效果&…

【爬蟲案例】采集 Instagram 平臺數據幾種方式(python腳本可直接運行)

更多內容請見: 爬蟲和逆向教程-專欄介紹和目錄 文章目錄 一、概述1.1 Instagram基礎信息1.2 Instagram平臺架構核心技術棧1.3 采集提示1.4 幾種采集方案對比二、四種采集方案分析三、寫爬蟲采集Instagram案例3.1 采集作品信息并下載視頻或圖片(無需登錄)3.2 explore接口的采…

OFP--2018

文章目錄 AbstractIntroductionRelated Work2D object detection3D object detection from LiDAR3D object detection from imagesIntegral images 3D Object Detection ArchitectureFeature extractionOrthographic feature transformFast average pooling with integral imag…

LINUX 4 tar -zcvf -jcvf -Jcvf -tf -uf

cp -r mv: 1.移動文件到目錄 2.文件改名 3.目錄改名 s 上面是打包 下面是打包并壓縮

linux signal up/down/down_interruptiable\down_uninterruptiable使用

在Linux內核中&#xff0c;down, down_interruptible, down_killable, 和 up 是用于操作信號量&#xff08;semap hores&#xff09;的函數&#xff0c;它們用于進程同步和互斥。以下是對這些函數的簡要說明。 1&#xff0c;down(&sem): 這個函數用于獲取信號量。如果信號…

使用人工智能大模型DeepSeek,如何進行論文潤色和去重?

今天我們學習人工智能&#xff0c;如何協助我們進行論文潤色和去重。手把手的學習視頻地址請訪問https://edu.csdn.net/learn/40402/666422 第一步在騰訊元寶對話框中輸入如何協助老師做論文潤色&#xff0c;通過提問&#xff0c;我們了解了老師寫論文潤色的步驟和建議。潤色的…

UE5 Simulation Stage

首先將Grid2D創建出來&#xff0c;然后設置值&#xff0c;Grid2D類似于在Niagara系統中的RenderTarget2D&#xff0c;可以進行繪制&#xff0c;那么設置大小為512 * 512 開啟Niagara粒子中的Simulation Stage 然后開始編寫我們的自定義模塊 模塊很簡單&#xff0c;TS就是Textur…

OpenCV 圖形API(6)將一個矩陣(或圖像)與一個標量值相加的函數addC()

操作系統&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 編程語言&#xff1a;C11 算法描述 addC 函數將給定的標量值加到給定矩陣的每個元素上。該功能可以用矩陣表達式替換&#xff1a; dst src1 c \texttt{dst} \texttt{src1} \te…

多GPU訓練

寫在前面 限于財力不足&#xff0c;本機上只有一個 GPU 可供使用&#xff0c;因此這部分的代碼只能夠稍作了解&#xff0c;能夠使用的 GPU 也只有一個。 多 GPU 的數據并行&#xff1a;有幾張卡&#xff0c;對一個小批量數據&#xff0c;有幾張卡就分成幾塊&#xff0c;每個 …

0基礎 | 硬件 | 電源系統 一

降壓電路LDO 幾乎所有LDO都是基于此拓撲結構 圖 拓撲結構 LDO屬于線性電源&#xff0c;通過控制開關管的導通程度實現穩壓&#xff0c;輸出紋波小&#xff0c;無開關噪聲 線性電源&#xff0c;IoutIin&#xff0c;發熱功率P電壓差△U*電流I&#xff0c;轉換效率Vo/Vi LDO不適…

mysql數據庫中getshell的方式總結

mysql數據庫中getshell的方式總結 MySQL版本大于5.0&#xff0c;MySQL 5.0版本以上會創建日志文件,我們通過修改日志文件的全局變量,就可以GetSHELL,下面這篇文章主要給大家介紹了關于mysql數據庫中getshell的方式,需要的朋友可以參考下 outfile和dumpfile寫shell 利用條件 …

基于Python的微博數據采集

摘要 本系統通過逆向工程微博移動端API接口,實現了對熱門板塊微博內容及用戶評論的自動化采集。系統采用Requests+多線程架構,支持遞歸分頁采集和動態請求頭模擬,每小時可處理3000+條數據記錄。關鍵技術特征包括:1)基于max_id的評論分頁遞歸算法 2)HTML標簽清洗正則表達…

WiFi加密協議

目錄 1. 認證(Authentication)? ?1.1 開放系統認證(Open System Authentication)? 1.2 共享密鑰認證(Shared Key Authentication)? ?1.3 802.1X/EAP認證(企業級認證)? ?2. 關聯(Association)? ?3. 加密協議(Security Handshake)? ?整體流程總結?…

MySQL篇(六)MySQL 分庫分表:應對數據增長挑戰的有效策略

MySQL篇&#xff08;六&#xff09;MySQL 分庫分表&#xff1a;應對數據增長挑戰的有效策略 MySQL篇&#xff08;六&#xff09;MySQL 分庫分表&#xff1a;應對數據增長挑戰的有效策略一、引言二、為什么需要分庫分表2.1 性能瓶頸2.2 存儲瓶頸2.3 高并發壓力 三、分庫分表的方…

極限編程(XP)簡介及其價值觀與最佳實踐

目錄 一、什么是極限編程&#xff08;XP&#xff09;二、極限編程的核心價值觀1. 溝通2. 簡單3. 反饋4. 勇氣 三、極限編程的12個最佳實踐1. 結對編程2. 40小時工作制3. 簡單設計4. 代碼規范5. 測試驅動開發&#xff08;TDD&#xff09;6. 系統隱喻7. 持續集成8. 重構9. 客戶在…

Java進階-day06:反射、注解與動態代理深度解析

目錄 一、反射機制&#xff1a;Java的自我認知能力 1.1 認識反射 1.2 獲取Class對象 1.3 獲取類的成分 二、注解&#xff1a;Java的元數據機制 2.1 注解概述 2.2 元注解 2.3 注解解析 2.4 注解的實際應用 三、動態代理&#xff1a;靈活的間接訪問機制 3.1 為什么需要…

Nacos注冊中心AP模式核心源碼分析(集群模式)

文章目錄 概述一、客戶端新注冊實例信息在集群間同步二、服務端集群節點信息在集群間同步2.1、DistroMapper2.2、ProtocolManager2.3、ServerListManager2.4、RaftPeerSet 三、客戶端實例狀態信息在集群間同步四、服務端新節點上線同步集群數據 概述 在Nacos集群模式下&#xf…

vscode和cursor對ubuntu22.04的remote ssh和X-Windows的無密碼登錄

這里寫自定義目錄標題 寫在前面需求的描述問題的引出 昨天已使能自動登錄上午我的改變UBUNTU 22.04關閉密碼規則一&#xff1a;修改 /etc/pam.d/common-password 文件二&#xff1a;修改 /etc/security/pwquality.conf 文件方法三&#xff1a;禁用 pam_pwquality.so 模塊 vscod…