鸿蒙多功能工具箱开发实战(三十二)-多设备适配与响应式布局
鸿蒙多功能工具箱开发实战(三十二)-多设备适配与响应式布局前言HarmonyOS支持多种设备形态多设备适配是开发的重要环节。本文将讲解响应式布局和多设备适配策略。一、设备类型1.1 设备分类类型宽度范围典型设备小屏 600dp手机竖屏中屏600-840dp手机横屏、小平板大屏 840dp平板、折叠屏1.2 设备信息获取importdisplayfromohos.displayimportdeviceInfofromohos.deviceInfoexportclassDeviceUtil{/** * 获取设备类型 */staticgetDeviceType():phone|tablet|tv|wearable{consttypedeviceInfo.deviceTypeswitch(type){casephone:returnphonecasetablet:returntabletcasetv:returntvcasewearable:returnwearabledefault:returnphone}}/** * 获取屏幕宽度 */staticgetScreenWidth():number{constdisplayInfodisplay.getDefaultDisplaySync()returndisplayInfo.width}/** * 获取屏幕高度 */staticgetScreenHeight():number{constdisplayInfodisplay.getDefaultDisplaySync()returndisplayInfo.height}/** * 是否横屏 */staticisLandscape():boolean{returnthis.getScreenWidth()this.getScreenHeight()}/** * 是否大屏设备 */staticisLargeScreen():boolean{constwidthpx2vp(this.getScreenWidth())returnwidth600}}1.3 网络请求流程图服务器HTTP模块HttpUtil应用层服务器HTTP模块HttpUtil应用层发起请求构建请求参数调用request()发送HTTP请求返回响应数据响应结果解析响应返回数据二、响应式布局2.1 媒体查询importmediaQueryfromohos.mediaqueryexportclassMediaQueryUtil{privatestaticlistener:mediaQuery.MediaQueryListener/** * 监听屏幕变化 */staticlistenScreenChange(callback:(isLarge:boolean)void):void{constconditionmediaQuery.matchConditionSync(screen and (min-width: 600vp))this.listenermediaQuery.matchCondition(condition,(result:mediaQuery.MediaQueryResult){callback(result.matches)})}/** * 取消监听 */staticunlisten():void{if(this.listener){mediaQuery.unmatchCondition(this.listener)}}}2.2 响应式组件Componentexportstruct ResponsiveLayout{StateisLargeScreen:booleanfalseaboutToAppear(){this.isLargeScreenDeviceUtil.isLargeScreen()MediaQueryUtil.listenScreenChange((isLarge){this.isLargeScreenisLarge})}aboutToDisappear(){MediaQueryUtil.unlisten()}BuilderParamsmallContent:()voidBuilderParamlargeContent:()voidbuild(){if(this.isLargeScreen){this.largeContent()}else{this.smallContent()}}}2.3 使用示例EntryComponentstruct ResponsivePage{build(){ResponsiveLayout({smallContent:(){// 小屏布局单列Column(){this.ContentArea()}},largeContent:(){// 大屏布局双列Row(){this.SideBar()this.ContentArea()}}})}BuilderSideBar(){Column(){Text(侧边栏)}.width(240).backgroundColor(#F5F5F5)}BuilderContentArea(){Column(){Text(内容区域)}.layoutWeight(1)}}三、栅格布局3.1 栅格系统Componentexportstruct GridContainer{Propcolumns:number12Propgutter:number16BuilderParamcontent:()voidbuild(){Row(){this.content()}.width(100%)}}Componentexportstruct GridColumn{Propspan:number12// 占用列数Propoffset:number0// 偏移列数BuilderParamcontent:()voidbuild(){Column(){this.content()}.width(${(this.span/12)*100}%).margin({left:${(this.offset/12)*100}%})}}3.2 响应式栅格Componentexportstruct ResponsiveGrid{Statecolumns:number12StateisLargeScreen:booleanfalseaboutToAppear(){this.updateColumns()MediaQueryUtil.listenScreenChange((isLarge){this.isLargeScreenisLargethis.updateColumns()})}privateupdateColumns(){this.columnsthis.isLargeScreen?12:4}build(){Grid(){// 栅格内容}.columnsTemplate(repeat(${this.columns}, 1fr))}}四、多设备资源4.1 资源目录结构resources/ ├── base/ # 默认资源 │ ├── element/ │ │ └── string.json │ └── media/ │ └── icon.png ├── phone/ # 手机资源 │ └── media/ │ └── icon.png # 手机尺寸图标 └── tablet/ # 平板资源 └── media/ └── icon.png # 平板尺寸图标4.2 设备特定配置exportclassResourceUtil{/** * 获取设备特定资源 */staticgetDeviceResource(baseName:string):Resource{constdeviceTypeDeviceUtil.getDeviceType()// 根据设备类型返回不同资源switch(deviceType){casetablet:return$r(app.media.${baseName}_tablet)default:return$r(app.media.${baseName})}}/** * 获取尺寸相关值 */staticgetDimensionValue(config:{small:numbermedium:numberlarge:number}):number{constwidthpx2vp(DeviceUtil.getScreenWidth())if(width600)returnconfig.smallif(width840)returnconfig.mediumreturnconfig.large}}五、适配最佳实践5.1 弹性尺寸EntryComponentstruct AdaptivePage{build(){Column(){// 使用百分比宽度Row(){Column().width(30%).backgroundColor(#F5F5F5)Column().width(70%).backgroundColor(#FFFFFF)}.width(100%)// 使用layoutWeightRow(){Column().layoutWeight(1).backgroundColor(#F5F5F5)Column().layoutWeight(2).backgroundColor(#FFFFFF)}.width(100%)}}}5.2 字体适配exportclassFontSizeUtil{/** * 获取适配字体大小 */staticgetFontSize(baseSize:number):number{constdeviceTypeDeviceUtil.getDeviceType()switch(deviceType){casetablet:returnbaseSize*1.25casetv:returnbaseSize*1.5default:returnbaseSize}}}// 使用Text(标题).fontSize(FontSizeUtil.getFontSize(18))六、高级适配技巧6.1 设备适配流程图手机平板折叠屏获取设备信息判断设备类型设备类型应用手机布局应用平板布局应用折叠屏布局渲染UI6.2 自适应组件Componentstruct AdaptiveLayout{StatedeviceType:stringphoneaboutToAppear(){this.deviceTypeDeviceUtil.getDeviceType()}build(){if(this.deviceTypetablet){this.TabletLayout()}else{this.PhoneLayout()}}BuilderTabletLayout(){Row(){this.SidePanel()this.MainContent()}}BuilderPhoneLayout(){Column(){this.MainContent()}}}6.3 资源限定符resources/ base/ # 默认资源 phone/ # 手机资源 tablet/ # 平板资源 tv/ # TV资源 wearable/ # 可穿戴设备资源七、小结本文详细讲解了多设备适配✅ 设备类型判断✅ 媒体查询✅ 响应式布局✅ 栅格系统✅ 多设备资源✅ 自适应组件✅ 资源限定符系列文章导航下期预告鸿蒙多功能工具箱开发实战(三十三)-折叠屏适配

相关新闻

LeetCode 1037题解:向量叉乘法判断三点共线

LeetCode 1037题解:向量叉乘法判断三点共线

1. 题目解析与核心思路1.1 题目要求理解LeetCode 1037题要求判断给定的三个点是否能构成"有效的回旋镖"。根据几何学定义,三个点构成回旋镖的条件是它们不在同一条直线上。题目输入是三个二维坐标点,我们需要通过计算判断这三个点是否共线。题…

2026/10/13 23:50:39 阅读更多 →
AI Agent开发:从3000行到50行的架构思维转变

AI Agent开发:从3000行到50行的架构思维转变

1. 从3000行到50行:重新理解AI Agent的本质去年我经历了一次职业生涯中最有价值的挫败——耗时三个月开发的3000行"智能框架",被同事用50行代码彻底颠覆。这个戏剧性的对比让我重新思考AI Agent开发的本质。1.1 传统框架思维的陷阱我的初始方案…

2026/9/29 17:02:09 阅读更多 →
NVIDIA GPU保底方案:降低AI开发门槛的金融技术实践

NVIDIA GPU保底方案:降低AI开发门槛的金融技术实践

这次我们来看一个很有意思的话题:NVIDIA 的保底方案如何让 GPU 贷款变得可行。对于很多中小团队和个人开发者来说,GPU 资源一直是 AI 开发和模型训练的最大瓶颈,而传统的 GPU 租赁或购买方案往往门槛较高。NVIDIA 近期推出的保底方案&#xf…

2026/10/4 8:04:25 阅读更多 →

最新新闻

免费广告拦截插件 uBlock Origin:默认 5 份过滤列表,请求发出前就拦下

免费广告拦截插件 uBlock Origin:默认 5 份过滤列表,请求发出前就拦下

免费广告拦截插件 uBlock Origin:默认 5 份过滤列表,请求发出前就拦下 【免费下载链接】uBlock uBlock Origin - An efficient blocker for Chromium and Firefox. Fast and lean. 项目地址: https://gitcode.com/GitHub_Trending/ub/uBlock 很多…

2026/10/15 3:07:36 阅读更多 →
Wing 云存储 Bucket 的 Key 语义与 sim 快照测试:以 bucket_keys 测试为范例

Wing 云存储 Bucket 的 Key 语义与 sim 快照测试:以 bucket_keys 测试为范例

编程语言编译器云原生语言运行时 【免费下载链接】wing A programming language for the cloud ☁️ A unified programming model, combining infrastructure and runtime code into one language ⚡ 项目地址: https://gitcode.com/gh_mirrors/wi/wing 点击查看 免…

2026/10/15 3:07:36 阅读更多 →
php-token-stream 版本演进全解析:从 ChangeLog 到源码,深入 tokenizer 封装库的架构与修复脉络

php-token-stream 版本演进全解析:从 ChangeLog 到源码,深入 tokenizer 封装库的架构与修复脉络

测试 【免费下载链接】php-token-stream Wrapper around PHPs tokenizer extension. 项目地址: https://gitcode.com/gh_mirrors/ph/php-token-stream 点击查看 免费下载 本指南以 ChangeLog.md 为主线,逐版本还原 php-token-stream 从 2.0.0 到 4.0.4 …

2026/10/15 3:07:36 阅读更多 →
Kiln 评估架构重构:将 Eval Trace 与 Eval Score 彻底分离的实战指南

Kiln 评估架构重构:将 Eval Trace 与 Eval Score 彻底分离的实战指南

人工智能AI 应用AI 评测RAG微调提示工程开发工具桌面应用 【免费下载链接】Kiln Build, Evaluate, and Optimize AI Systems. Includes evals, RAG, agents, fine-tuning, synthetic data generation, dataset management, MCP, and more. 项目地址: https://gitcod…

2026/10/15 3:07:36 阅读更多 →
cas:2242902-55-0,Desthiobiotin-phenol,脱硫生物素-苯酚

cas:2242902-55-0,Desthiobiotin-phenol,脱硫生物素-苯酚

基本理化属性项目信息中文名称脱硫生物素-苯酚英文名称Desthiobiotin-phenol分子式C₁₆H₂₂N₂O₃分子量290.36 g/mol外观通常为白色或类白色固体粉末溶解性可溶于DMSO、甲醇等有机溶剂,部分溶于水结构式:结构特点它是将脱硫生物素(去掉硫原…

2026/10/15 3:07:36 阅读更多 →
Folia 跨设备同步完整教程

Folia 跨设备同步完整教程

Folia 跨设备同步完整教程 【免费下载链接】folia-major 专注于绚丽的歌词动画效果的本地音乐/navidrome/第三方多平台在线音乐播放器 项目地址: https://gitcode.com/GitHub_Trending/fo/folia-major 电脑上把 AI 主题和外观调了半宿,换台设备一切照旧&…

2026/10/15 3:06:36 阅读更多 →

日新闻

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

1. 为什么选择容器化方式部署 LoRa 网络服务LoRa 物联网项目落地时,网络服务器是整个链路的核心枢纽。它负责接收网关上报的数据包、完成去重与解密、再把有效载荷分发给上层应用。早期大家习惯把网络服务器直接装在物理机上,依赖一堆系统库和特定版本的…

2026/10/15 0:00:46 阅读更多 →
共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

1. 共享推理服务里,扩缩容到底难在哪做过大模型推理服务部署的人,大概都经历过这样的场景:一个团队共用一套推理集群,A 业务跑的是 7B 的小模型,B 业务跑的是 72B 的大模型,C 业务白天流量高、晚上几乎归零…

2026/10/15 0:00:46 阅读更多 →
Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

1. 引子:一次内核恐慌引发的追查先从一个真实场景说起。某次我给一台老旧的嵌入式设备折腾系统裁减,为了把启动时间压进两秒以内,我手贱地把一串自认为“没用”的 systemd 服务给 disable 了,其中就包括systemd-remount-fs.servic…

2026/10/15 0:00:46 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/14 3:30:28 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/14 16:30:29 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/14 3:29:58 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 0:14:36 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 22:45:47 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 7:53:34 阅读更多 →