harmonyOS 手機,雙折疊,平板,PC端屏幕適配

由于HarmonyOS設備的屏幕尺寸和分辨率各不相同,開發者需要采取適當的措施來適配不同的屏幕。

1.EntryAbility.ets文件里:onWindowStageCreate方法里判斷設備類型,
如果是pad,需全屏展示(按客戶需求來,本次需求按全屏展示),功能實現如下:

	onWindowStageCreate(windowStage: window.WindowStage): void {windowStage.getMainWindow().then((windowClass) => {try {//判斷是否是padif(deviceInfo.deviceType == 'tablet') {//pad//pad橫屏let orientation = window.Orientation.AUTO_ROTATION_LANDSCAPE_RESTRICTED;let promise = windowClass.setPreferredOrientation(orientation);//如果是pad橫屏promise.then(() => {console.info('Succeeded in setting the window orientation.');}).catch((err: BusinessError) => {console.error(`Failed to set the window orientation. Cause code: ${err.code}, message: ${err.message}`);});}}catch (exception) {console.error(`Failed to set window orientation. Cause code: ${exception.code}, message: ${exception.message}`);}// 獲取窗口尺寸,存入AppStorageAppStorage.setOrCreate('winWidth', windowClass.getWindowProperties().windowRect.width);AppStorage.setOrCreate('winHeight', windowClass.getWindowProperties().windowRect.height);// 監聽窗口尺寸變化windowClass.on('windowSizeChange', (windowSize) => {//監聽窗口尺寸變化AppStorage.setOrCreate('winWidth', windowSize.width);//如果窗口變化了,立馬更新存儲值-寬AppStorage.setOrCreate('winHeight', windowSize.height);//如果窗口變化了,立馬更新存儲值-高console.log('寬高',String(windowSize.width), String(windowSize.height))//});});// Main window is created, set main page for this abilityconsole.info('onWindowStageCreate');AppStorage.setOrCreate('windowStage',windowStage);AppUtil.init(this.context);try {let windowClass: window.Window = windowStage.getMainWindowSync()AppStorage.setOrCreate('windowClass', windowClass)// 設置窗口全屏windowClass.setWindowLayoutFullScreen(true)let topRect = windowClass.getWindowAvoidArea(window.AvoidAreaType.TYPE_CUTOUT).topRect//獲取頂部安全區域let bottomRect = windowClass.getWindowAvoidArea(window.AvoidAreaType.TYPE_NAVIGATION_INDICATOR).bottomRect//獲取底部安全區域// 緩存window窗口對象AppStorage.setOrCreate('windowClass', windowClass);AppStorage.setOrCreate('bottomAreaRectHeight', bottomRect.height);//把height-底部安全區域存儲AppStorage.setOrCreate('topAreaRectHeight', topRect.height );//height-頂部安全區域存儲this.updateBreakPoint(windowClass.getWindowProperties().windowRect.width, windowClass.getWindowProperties().windowRect.height);//獲取窗口的寬 度和高度,計算此時是什么場景:直板機、折疊屏、pad等windowClass.on('windowSizeChange', (windowSize: window.Size) => {console.log('windowSizeChange',windowSize.width, windowSize.height)this.updateBreakPoint(windowSize.width, windowSize.height);//})} catch (exception) {Logger.error(`Failed to obtain the main window. Cause code: ${exception.code}, message: ${exception.message}`);}windowStage.loadContent('pages/LaunchPage', (err, data) => { if (err.code) { Logger.error('Failed to load the content. Cause: %{public}s', JSON.stringify(err) ?? ''); return; } }); }private updateBreakPoint(windowWidth: number, windowHeight: number): void {let curBp: string = '';let type = deviceInfo.deviceTypeif (type=='2in1'){//如果是電腦,直接走pad的適配(需要注意,如果是電腦,需要修改一些交互,比如鍵盤(onKeyEvent事件))AppStorage.setOrCreate('breakPoint', 'xl')return}// 平板,下面的就是根據當前實時屏幕尺寸,計算是處于哪種情況 md-直板機 lg-折疊屏  xl-pad(前面已提到,電腦的UI和pad的UI一致)if(type == 'tablet') {curBp = 'xl'AppStorage.setOrCreate('breakPoint', curBp)} else {console.log('windowHeight/windowWidth',windowWidth, windowHeight, windowHeight/windowWidth > 1.5)let windowWidthVp = windowWidth / display.getDefaultDisplaySync().densityPixels;if (windowWidthVp < 700) {curBp = 'md'} else {curBp = 'lg'}if(windowHeight/windowWidth > 1.5 == true) {curBp = 'md'} else {if(windowHeight<1500) {curBp = 'md'} else {curBp = 'lg'}}let ret: boolean = false;ret = display.isFoldable();console.log("curBp", curBp, windowWidthVp)if(deviceInfo.deviceType == 'phone' && ret == false) {AppStorage.setOrCreate('breakPoint', 'md')} else {AppStorage.setOrCreate('breakPoint', curBp)}}console.log('設備類型', curBp)}//以上的內容都是在應用入口完成,判斷好設備類型和視口大小

2.上面是具體說明了判斷設備的類型,以及監聽窗口大小變化來更改視口類型,下面的內容主要是來介紹如何根據設備類型來適配UI:
其實在鴻蒙里,vp和安卓的dp單位等比,開發過程中,可以直接調成安卓單位的UI來開發,就可以兼容所有的設備(字體和組件寬高比,會自適應),我們需要關注的是,在不同設備下,布局的改變,這個時候需要根據我們計算出來的 breakPoint(xl:電腦,pad , lg:折疊屏 , md:手機)

export class BreakpointConstants{  //BreakpointConstants.ets工具類,md(直板機) lg(折疊屏) xl(電腦,平板)/*** Breakpoints that represent small device types.*/static readonly BREAKPOINT_SM: string = 'sm';/*** Breakpoints that represent middle device types.*/static readonly BREAKPOINT_MD: string = 'md';/*** Breakpoints that represent large device types.*/static readonly BREAKPOINT_LG: string = 'lg';/*** Breakpoints that represent large device types.*/static readonly BREAKPOINT_XL: string = 'xl';/*** Current breakpoints that to query the device types.*/static readonly CURRENT_BREAKPOINT: string = 'currentBreakpoint';/*** Range of the small device width.*/static readonly RANGE_SM: string = '(320vp<=width<520vp)';/*** Range of the middle device width.*/static readonly RANGE_MD: string = '(520vp<=width<840vp)';/*** Range of the large device width.*/static readonly RANGE_LG: string = '(840vp<=width)';/*** Range of the largePlus device width.*/static readonly RANGE_XL: string = '(1700vp<=width<=2720vp)';
}

使用方法如下:

 //聲明一個變量,記錄當前視口大小(md,lg,xl)(EntryAbility.ets存儲值)@StorageLink('breakPoint') breakPoint: string = BreakpointConstants.BREAKPOINT_MD

布局兼容如下:

if (this.breakPoint=='xl') {  // pad 和 PC}else{  // 手機和雙折疊}

雙折疊適配如下:

①使用Flex布局

Flex({ justifyContent: FlexAlign.SpaceBetween, alignItems: ItemAlign.Center, wrap: FlexWrap.Wrap }) {Column(){}.width(this.breakPoint == BreakpointConstants.BREAKPOINT_MD ? '100%' : '49%')Column(){}.width(this.breakPoint == BreakpointConstants.BREAKPOINT_MD ? '100%' : '49%')
}

②使用GridRow布局

 GridRow() {GridCol({ span: { sm: 12, md: 6, lg: 4 } }) {Column(){}}GridCol({ span: { sm: 12, md: 6, lg: 8 } }) {Column(){}}}.width('100%').height('100%')

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

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

相關文章

跟韓學AiOps系列之2025學MySQL系列_如何在MySQL中開啟和提交事務?!

跟韓學AiOps系列之2025學MySQL系列_如何在MySQL中開啟和提交事務&#xff1f;! 文章目錄 一、事務的基本操作1. 開啟事務2. 執行事務內操作3. 提交事務4. 回滾事務 二、驗證示例&#xff08;適用于 MySQL 5.7&#xff09;步驟 1&#xff1a;準備測試表和數據步驟 2&#xff1a…

Java生成微信小程序碼及小程序短鏈接

使用wx-java-miniapp-spring-boot-starter 生成微信小程序碼及小程序短鏈接 在pom.xml文件中引入依賴 <dependency><groupId>com.github.binarywang</groupId><artifactId>wx-java-miniapp-spring-boot-starter</artifactId><version>4.7…

如何讓通義千問大模型支持結構化輸出?

之前的文章提到通義千問API無法通過with_structured_output/json schema的方式支持結構化輸出&#xff0c;如果就是想使用通義千問大模型做結構化輸出&#xff0c;應該怎么辦呢&#xff1f;有兩種辦法 使用Ollama來運行通義千問大模型 從Ollama博客文章 Structured output 中…

一條 SQL 查詢語句是如何執行的(MySQL)

第一講&#xff1a;一條 SQL 查詢語句是如何執行的 總覽圖示 MySQL 查詢的執行流程可以大致分為以下步驟&#xff08;如圖所示&#xff09;&#xff1a; 連接器&#xff08;Connection&#xff09;查詢緩存&#xff08;Query Cache&#xff0c;MySQL 8.0 已廢棄&#xff09;…

汽車OTA在線升級法規分析

摘要 本文介紹了R156法規即《關于批準車輛的軟件升級和軟件升級管理體系統一規定的法規》、該法規專注于汽車軟件升級功能&#xff0c;并為此提出了一系列具體要求&#xff0c;旨在確保軟件升級流程的安全性、可控性和合規性&#xff0c;從而順應汽車行業智能化、聯網化的發展趨…

Notepad編輯器實現換行符替換

在不同的Note編輯器中&#xff0c;批量把換行替換為空的方法有所不同&#xff0c;以下是常見編輯器的操作方法&#xff1a; Notepad 打開文件后&#xff0c;按CtrlH打開“查找和替換”對話框&#xff0c;在“查找”字段中輸入\r\n&#xff0c;在“替換為”字段中輸入一個空格…

Rust多線程性能優化:打破Arc+鎖的瓶頸,效率提升10倍

一、引言 在 Rust 開發中&#xff0c;多線程編程是提升程序性能的重要手段。Arc&#xff08;原子引用計數&#xff09;和鎖的組合是實現多線程數據共享的常見方式。然而&#xff0c;很多程序員在使用 Arc 和鎖時會遇到性能瓶頸&#xff0c;導致程序運行效率低下。本文將深入剖…

【安裝指南】Centos7 在 Docker 上安裝 RabbitMQ4.0.x

目錄 前置知識:RabbitMQ 的介紹 一、單機安裝 RabbitMQ 4.0.7版本 1.1 在線拉取鏡像 二、延遲插件的安裝 2.1 安裝延遲插件 步驟一:下載延遲插件 步驟二:將延遲插件放到插件目錄 步驟三:啟動延遲插件 步驟四:重啟 RabbitMQ 服務 步驟五:驗收成果 步驟六:手動…

【quantity】5 derive_more庫 2.0 版介紹

derive_more 是一個 Rust 過程宏庫&#xff0c;旨在通過派生宏自動生成常見 trait 的實現&#xff0c;減少樣板代碼。2.0 版本帶來了多項改進和新特性。 主要特性 1. 支持的 Trait 派生 derive_more 2.0 支持派生以下 trait&#xff1a; 基本操作 trait: Display - 格式化顯…

網站備份,網站數據備份的步驟

網站備份&#xff08;尤其是網站數據備份&#xff09;是保障業務連續性、防止數據丟失和應對安全威脅的關鍵措施。以下是系統化的備份步驟和實施建議&#xff0c;涵蓋技術操作、策略規劃及常見問題處理&#xff1a; 一、備份前的準備工作 明確備份范圍 核心數據&#xff1a;…

OpenCV 圖形API(72)圖像與通道拼接函數-----根據指定的方式翻轉圖像(GMat)函數 flip()

操作系統&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 編程語言&#xff1a;C11 算法描述 翻轉一個2D矩陣&#xff0c;圍繞垂直軸、水平軸或同時圍繞兩個軸。 該函數以三種不同的方式之一翻轉矩陣&#xff08;行和列的索引是從0開始的&a…

醫生視角下轉錄組學的生物信息學分析

醫生視角下轉錄組學的生物信息學分析 轉錄組學的生物信息學分析是醫生解決臨床與科研問題的有力工具。這里羅列醫學轉錄組學相關的幾個概念&#xff0c;從使用者&#xff08;醫生&#xff09;的角度看待理解相關技術&#xff0c;為后續使用該技術說明臨床和科研問題奠定基礎。…

量子機器學習中的GPU加速實踐:基于CUDA Quantum的混合編程模型探索

引言&#xff1a;量子機器學習的新范式 在量子計算與經典機器學習交叉融合的前沿領域&#xff0c;量子機器學習&#xff08;Quantum Machine Learning, QML&#xff09;正經歷著革命性突破。然而&#xff0c;隨著量子比特規模的增長和算法復雜度的提升&#xff0c;傳統計算架構…

Matplotlib核心課程-2

4.1 數據加載、儲存 4.1.1 從數據文件讀取數據 導入支持庫&#xff1a; import numpy as np from pandas import Series,DataFrame import pandas as pd 從csv文件讀取數據&#xff0c;一般方法&#xff1a; pd.read_csv(../data/ex1.csv,encodinggbk) 從csv文件讀取數據&#…

new和malloc的區別

1 語義層級不同&#xff1a;語言機制 vs. 庫函數 new / new[] (C 關鍵字)malloc / calloc / realloc (C 運行時函數)本質語言級運算符&#xff1b;可被重載庫函數&#xff1b;無法重載作用分配內存 并調用構造函數僅分配原始字節塊&#xff0c;不做初始化&#xff0c;也不調用…

C++11新特性_自動類型推導_auto

在 C11 標準中&#xff0c;auto關鍵字被賦予了全新且強大的功能&#xff0c;它用于自動類型推導&#xff0c;即編譯器能夠根據變量的初始化表達式自動確定其類型。 基本語法 使用auto聲明變量時&#xff0c;只需給出auto關鍵字&#xff0c;后面緊跟變量名&#xff0c;并對其進…

[預備知識]6. 優化理論(二)

優化理論 本章節介紹深度學習中的高級優化技術&#xff0c;包括學習率衰減、梯度裁剪和批量歸一化。這些技術能夠顯著提升模型的訓練效果和穩定性。 學習率衰減&#xff08;Learning Rate Decay&#xff09; 數學原理與可視化 學習率衰減策略的數學表達&#xff1a; 步進式…

【計算機視覺】語義分割:Mask2Former:統一分割框架的技術突破與實戰指南

深度解析Mask2Former&#xff1a;統一分割框架的技術突破與實戰指南 技術架構與創新設計核心設計理念關鍵技術組件 環境配置與安裝指南硬件要求安裝步驟預訓練模型下載 實戰全流程解析1. 數據準備2. 配置文件定制3. 訓練流程4. 推理與可視化 核心技術深度解析1. 掩膜注意力機制…

數字智慧方案5857丨智慧機場解決方案與應用(53頁PPT)(文末有下載方式)

資料解讀&#xff1a;智慧機場解決方案與應用 詳細資料請看本解讀文章的最后內容。 隨著科技的飛速發展&#xff0c;智慧機場的建設已成為現代機場發展的重要方向。智慧機場不僅提升了旅客的出行體驗&#xff0c;還極大地提高了機場的運營效率。本文將詳細解讀沃土數字平臺在…

【C到Java的深度躍遷:從指針到對象,從過程到生態】第五模塊·生態征服篇 —— 第二十章 項目實戰:從C系統到Java架構的蛻變

一、跨語言重構&#xff1a;用Java重寫Redis核心模塊 1.1 Redis的C語言基因解析 Redis 6.0源碼核心結構&#xff1a; // redis.h typedef struct redisObject { unsigned type:4; // 數據類型&#xff08;String/List等&#xff09; unsigned encoding:4; // …