HarmonyOS应用开发实战:猫猫大作战-`$r` 与 `$rawfile` 的区别、资源目录结构、多分辨率适配
前言前面我们大量用 Emoji、、做图标——简单但不专业。真正的游戏需要 PNG/JPG/SVG 图集猫咪精灵图、UI 图标、背景插画。HarmonyOS 加载图片资源有两条路径——$r()引用编译期资源和**$rawfile()引用原始文件**。两者用法、性能、适用场景完全不同。本篇以「猫猫大作战」图标资源加载为锚点把$r与$rawfile的区别、资源目录结构、多分辨率适配三大要点讲透。提示本系列不讲 ArkTS 基础语法与环境搭建假设你已跟完第 1–26 篇。本篇是布局进阶的第七篇。一、场景拆解图标资源加载回顾「猫猫大作战」主菜单标题图标第 1 篇// 来源entry/src/main/ets/pages/Index.ets MainMenuView() Text().fontSize(72)这是用 Emoji 文字做图标。现在想换成专业的 PNG 图标cat_logo.png——需要 Image 组件 资源引用// 写法 1$r() 引用编译期资源推荐 Image($r(app.media.cat_logo)) .width(72).height(72) // 写法 2$rawfile() 引用原始文件 Image($rawfile(icons/cat_logo.png)) .width(72).height(72)关键区别维度$r(app.media.xxx)$rawfile(path/xxx)资源位置resources/base/media/resources/rawfile/编译处理编译期索引、可多语言多分辨率原样打包不处理引用方式资源名无扩展名相对路径含扩展名适用UI 图标、标准图片动效 JSON、字体、大文件二、$r 编译期资源引用2.1 资源目录结构entry/src/main/resources/ ├─ base/ # 默认资源所有设备匹配 │ ├─ element/ # string.json, color.json, float.json │ ├─ media/ # 图片、音频、视频 │ │ ├─ cat_logo.png │ │ ├─ icon_pause.png │ │ └─ bg_main.jpg │ └─ profile/ # 自定义 JSON 配置 ├─ zh_CN/element/ # 中文语言覆盖 ├─ en_US/element/ # 英文语言覆盖 ├─ dark/element/ # 暗色模式覆盖 └─ rawfile/ # 原始文件不编译 └─ icons/cat_logo.png2.2 $r 三种资源类型// 1. media图片/音频/视频 Image($r(app.media.cat_logo)) // 2. string字符串 Text($r(app.string.hello_world)) // 3. color/float颜色/尺寸 Text(A).fontColor($r(app.color.primary)) Text(B).fontSize($r(app.float.title_size))关键经验$r(app.type.name)引用资源——type是media/string/color/float/plural等name是资源名不含扩展名。2.3 命名规则// ✅ 合法资源名 $r(app.media.cat_logo) // 蛇形命名 $r(app.media.icon_pause) $r(app.string.hello_world) // ❌ 非法资源名 $r(app.media.catLogo) // 驼峰ArkTS 不允许 $r(app.media.cat-logo) // 含连字符 $r(app.media.cat logo) // 含空格提示HarmonyOS 资源名必须蛇形命名snake_case——驼峰会编译报错。2.4 多分辨率适配HarmonyOS 自动按设备密度加载对应 dpi 的图片resources/ ├─ base/media/cat_logo.png # 默认mdpi 1x ├─ fiberscale-2x/media/cat_logo.png # 2x 高分辨率 └─ fiberscale-3x/media/cat_logo.png # 3x 超高分辨率设备密度加载的图片mdpi1xbase/media/cat_logo.pngxhdpi2xfiberscale-2x/media/cat_logo.pngxxhdpi3xfiberscale-3x/media/cat_logo.png实战经验UI 图标准备 1x、2x、3x 三套——分别放在base/media、fiberscale-2x/media、fiberscale-3x/media系统自动选最清晰的。三、$rawfile 原始文件引用3.1 适用场景// 1. Lottie 动效 JSON Image($rawfile(lottie/loading.json)) // 2. 自定义字体 TTF Font().registerFont({ familyName: Custom, familySrc: $rawfile(fonts/Custom.ttf) }) // 3. 大型背景图不想编译处理 Image($rawfile(bg/level_1.jpg)) // 4. 配置 JSON 文件 const config fs.readSync($rawfile(config/game.json))3.2 路径规则$rawfile(icons/cat_logo.png) // 相对 resources/rawfile/ 的路径 // 完整路径resources/rawfile/icons/cat_logo.png关键经验$rawfile路径必须包含扩展名——与$r省略扩展名不同。3.3 $rawfile vs $r 的核心差异维度$r$rawfile编译期索引✅ 拼写错误编译报错❌ 运行时才报错多语言覆盖✅zh_CN//en_US/自动切❌ 不支持多分辨率✅fiberscale-2x/自动选❌ 不支持暗色模式✅dark/自动切❌ 不支持文件类型限制限图片/音频/视频任意文件适用UI 图标、标准化资源Lottie、字体、大文件实战经验能用 $r 就用 $r——编译期校验、多端适配都免费。只有 Lottie 动效、自定义字体这种「非标准资源」才用 $rawfile。四、用 $r 改造主菜单图标4.1 替换标题 Emoji 为 PNG 图标假设已放置resources/base/media/cat_logo.pngBuilder MainMenuView() { Column() { Spacer().height(15%) // 改造Emoji → $r PNG 图标 Image($r(app.media.cat_logo)) .width(72) .height(72) .margin({ bottom: 8 }) Text(猫猫大作战).fontSize(36).fontWeight(FontWeight.Bold).fontColor(#2C3E50).margin({ bottom: 8 }) Text(合并进化 · 策略消除).fontSize(16).fontColor(#95A5A6).margin({ bottom: 48 }) if (this.highScore 0) { Row() { // 改造 Emoji → $r PNG 奖杯图标 Image($r(app.media.icon_trophy)) .width(20).height(20) Text( 最高分: ${this.highScore}).fontSize(16).fontColor(#F1C40F).fontWeight(FontWeight.Bold) }.margin({ bottom: 32 }) } // 开始游戏按钮 Button(开始游戏) .width(70%).height(56) .fontSize(20).fontWeight(FontWeight.Bold) .fontColor(#FFFFFF).backgroundColor(#2ECC71) .borderRadius(28) .shadow({ radius: 8, color: rgba(46, 204, 113, 0.4), offsetY: 4 }) .onClick(() { this.startGame(); }) Spacer().height(24) // 规则面板第 25 篇 Scroll() { /* ... */ }.height(180) Spacer() } .width(100%).height(100%) .linearGradient({ direction: GradientDirection.Bottom, colors: [[#E8F4F8, 0.0], [#D6EEF5, 0.5], [#C9E8F2, 1.0]] }) .alignItems(HorizontalAlign.Center) }4.2 Image 组件常用属性Image($r(app.media.cat_logo)) .width(72).height(72) // 尺寸 .objectFit(ImageFit.Contain) // 缩放模式 .borderRadius(12) // 圆角 .interpolation(ImageInterpolation.High) // 高质量插值 .draggable(false) // 禁止拖拽 .alt($r(app.media.placeholder)) // 加载失败占位图4.3 objectFit 缩放模式ImageFit 值效果适用Contain等比缩放完整显示可能留白UI 图标推荐Cover等比缩放填满容器可能裁剪背景图Fill拉伸填满变形不推荐None原始尺寸可能溢出精确像素ScaleDown等比缩小不放大缩略图实战经验UI 图标用 Contain——保证图标完整不变形全屏背景用 Cover——填满屏幕不裁剪主体。五、资源访问的编程式 API5.1 resourceManager 获取资源import { common } from kit.AbilityKit; const context getContext(this) as common.UIAbilityContext; const resMgr context.resourceManager; // 同步获取字符串 const str: string resMgr.getStringSync($r(app.string.hello_world).id); // 同步获取颜色 const color: number resMgr.getColorSync($r(app.color.primary).id); // 异步获取 rawfile 文件描述符 const rawFd await resMgr.getRawFd(config/game.json); // rawFd { fd, offset, length }5.2 getStringByNameSync 按名取值// 按资源名不含 app. 前缀取字符串 const greeting: string resMgr.getStringByNameSync(hello_world);实战经验UI 层用$r()直接渲染逻辑层用resourceManager取值——例如要把字符串塞进 ArrayBuffer 时。六、踩坑提示6.1 资源名拼错// ❌ 错误拼写错误编译报错 Image($r(app.media.cat_Logo)) // L 大写 Image($r(app.media.catlogo)) // 缺下划线 // ✅ 正确与文件名完全一致蛇形 Image($r(app.media.cat_logo))6.2 $r 引用 rawfile 资源// ❌ 错误$r 不能引用 rawfile 下的文件 Image($r(app.media.cat_logo)) // 但 cat_logo.png 在 rawfile/icons/ 下 // ✅ 正确rawfile 用 $rawfile Image($rawfile(icons/cat_logo.png))6.3 多分辨率图片缺失# ❌ 只有 3x 图1x 设备加载 3x 图缩放模糊 resources/base/media/ # 空 resources/fiberscale-3x/media/cat_logo.png # ✅ 至少提供 1x 和 3x resources/base/media/cat_logo.png # 1x resources/fiberscale-3x/media/cat_logo.png # 3x6.4 Image 不设宽高// ❌ 错误不设尺寸Image 按图片原始像素渲染可能撑爆屏幕 Image($r(app.media.cat_logo)) // ✅ 正确显式设尺寸 Image($r(app.media.cat_logo)).width(72).height(72)七、调试技巧DevEco 资源预览resources/base/media/下的图片在 IDE 里直接预览。console.info打资源 id$r(app.media.cat_logo).id打 log追资源加载。图片不显示排查检查资源名拼写检查文件是否在media/或rawfile/检查 Image 宽高是否设。模糊排查1x 设备加载 3x 图会缩放模糊补全多分辨率资源。八、性能与最佳实践UI 图标用 $r——编译期校验、多分辨率适配免费。**Lottie/字体/大文件用rawfile**——r 不支持非标准资源。资源名蛇形命名——驼峰会编译报错。多分辨率准备 1x/2x/3x——避免高 dpi 设备加载低清图模糊。Image 必须设宽高——不设按原始像素渲染可能撑爆屏幕。UI 图标 objectFit 用 Contain——保证完整不变形。总结本篇我们从 Image 资源引用切入掌握了**r 编译期资源多语言/多分辨率/暗色自动适配**、**rawfile 原始文件Lottie/字体/大文件、资源目录结构与命名规则三大要点并给出了主菜单 PNG 图标改造完整代码。核心要点r 编译期校验多端适配rawfile 任意文件资源名蛇形命名UI 图标准备 1x/2x/3x 三套**。下一篇我们将拆解暗色模式适配——深色资源与 colorMode。如果这篇文章对你有帮助欢迎点赞、收藏⭐、关注你的支持是我持续创作的动力相关资源「猫猫大作战」项目源码本仓库entry/src/main/ets/pages/Index.etsImage 组件官方指南资源引用 $r 与 $rawfile 官方指南资源目录结构官方文档多分辨率资源适配最佳实践开源鸿蒙跨平台社区HarmonyOS 开发者官方文档首页系列索引本仓库articles/INDEX.md

相关新闻

UnderReplicatedBlocks处理流程

UnderReplicatedBlocks处理流程

此图基本解释清楚了hdfs处理block副本不足、分布不合理的流程。 https://my.oschina.net/u/3987818/blog/3100408

2026/7/28 19:40:21阅读更多 →
HarmonyOS应用开发实战:猫猫大作战-`ForEach` 的双层嵌套、`keyGenerator` 密钥、`width` 百分比响应式格子

HarmonyOS应用开发实战:猫猫大作战-`ForEach` 的双层嵌套、`keyGenerator` 密钥、`width` 百分比响应式格子

前言 「猫猫大作战」的棋盘是 5 行 8 列网格——40 个格子。如果手写 40 个 Stack 组件,代码又长又难维护。ArkUI 的 ForEach 循环渲染就是为这类「重复结构 数据驱动」场景准备的——双层 ForEach 嵌套,外层渲染行、内层渲染列,几十行代码…

2026/7/28 19:40:21阅读更多 →
技术架构深度解析:ESPTOOL串口烧录工具架构设计与性能优化

技术架构深度解析:ESPTOOL串口烧录工具架构设计与性能优化

技术架构深度解析:ESPTOOL串口烧录工具架构设计与性能优化 【免费下载链接】esptool Serial utility for flashing, provisioning, and interacting with Espressif SoCs 项目地址: https://gitcode.com/gh_mirrors/es/esptool ESPTOOL是Espressif Systems官…

2026/7/28 19:38:20阅读更多 →
提示词驱动的AI Agent:CLI-Anything技术解析

提示词驱动的AI Agent:CLI-Anything技术解析

1. CLI-Anything 的本质:提示词驱动的AI Agent 当我第一次看到CLI-Anything这个项目时,最让我震惊的是它完全颠覆了传统命令行工具的开发模式。作为一个长期从事CLI工具开发的工程师,我习惯性地去GitHub仓库里寻找核心引擎代码,结…

2026/7/28 20:58:49阅读更多 →
语言模型遗忘机制的低秩关联分析与优化策略

语言模型遗忘机制的低秩关联分析与优化策略

1. 项目概述:语言模型遗忘现象的低秩关联解析 在2025年NIPS会议上发表的这项研究,直指大语言模型(LLM)领域一个长期被忽视却至关重要的问题——模型在学习新知识时对旧知识的遗忘机制。我们团队通过低秩矩阵分解技术,首…

2026/7/28 20:58:49阅读更多 →
特泊替尼治疗METex14跳跃突变NSCLC的临床价值

特泊替尼治疗METex14跳跃突变NSCLC的临床价值

1. 项目概述:METex14跳跃突变NSCLC的一线治疗新选择 最近在肺癌靶向治疗领域,特泊替尼(Tepotinib)针对METex14跳跃突变非小细胞肺癌(NSCLC)的一线治疗数据引起了广泛关注。作为一名长期跟踪肺癌精准治疗进展的临床医生,我想结合最新研究数据和…

2026/7/28 20:58:49阅读更多 →
大语言模型(LLM)核心架构与应用实践解析

大语言模型(LLM)核心架构与应用实践解析

1. 从"超级背书侠"到"职场多面手":大语言模型的本质解析 十年前我第一次接触自然语言处理时,系统连简单的主谓宾结构都分析得磕磕绊绊。如今打开手机,AI助手能流畅地帮我写邮件、改代码甚至做心理疏导。这种跨越式发展的…

2026/7/28 20:58:49阅读更多 →
MMDetection3D框架与3D目标检测核心技术解析

MMDetection3D框架与3D目标检测核心技术解析

1. MMDetection3D框架全景解析 作为当前最主流的3D目标检测开源框架之一,MMDetection3D建立在PyTorch生态之上,继承了MMDetection的优秀设计理念。这个框架最显著的特点是采用了高度模块化的架构设计,将整个3D检测流程拆解为可插拔的组件。在…

2026/7/28 20:58:49阅读更多 →
游戏化学习工具Code Quest如何提升C语言入门效率

游戏化学习工具Code Quest如何提升C语言入门效率

1. 为什么游戏化学习工具适合C语言入门?作为一名有十年编程教学经验的开发者,我见证过太多初学者在C语言门槛前放弃。传统教材往往从晦涩的指针和内存管理开始,而今天要介绍的这款名为"Code Quest"的游戏化学习工具,彻底…

2026/7/28 20:56:49阅读更多 →
覆盖国产 + 海外 + 开源模型,OpenClaw 2.7.9 Windows/Mac 双端部署详解

覆盖国产 + 海外 + 开源模型,OpenClaw 2.7.9 Windows/Mac 双端部署详解

🔹 工具基础介绍 OpenClaw 是开源生态中一款实用性较强的本地智能工具,凭借本地离线运行、可视化图形操作和任务自动化三大核心特性,赢得了众多用户的青睐。与普通在线对话AI工具不同,它属于能够直接操控本机软硬件的智能数字员工…

2026/7/28 4:06:39阅读更多 →
伺服阀焊完微漏毁整机?精密激光焊接三关锁住高压

伺服阀焊完微漏毁整机?精密激光焊接三关锁住高压

所谓液压伺服阀体的精密激光焊接,是用激光束对阀座壳体(通常为不锈钢或铝合金)进行密封焊接,使阀体在21-35MPa的高压液压油或压缩气体中长期运行而不发生介质泄漏。液压伺服阀是高端液压系统的"大脑"。从航空航天飞行控…

2026/7/28 2:08:06阅读更多 →
D2DX:三步实现《暗黑破坏神2》高清宽屏体验的终极指南

D2DX:三步实现《暗黑破坏神2》高清宽屏体验的终极指南

D2DX:三步实现《暗黑破坏神2》高清宽屏体验的终极指南 【免费下载链接】d2dx D2DX is a complete solution to make Diablo II run well on modern PCs, with high fps and better resolutions. 项目地址: https://gitcode.com/gh_mirrors/d2/d2dx 你是否还在…

2026/7/28 1:38:28阅读更多 →
告别臃肿!3步让你的暗影精灵笔记本重获新生

告别臃肿!3步让你的暗影精灵笔记本重获新生

告别臃肿!3步让你的暗影精灵笔记本重获新生 【免费下载链接】OmenSuperHub Control Omen laptop performance, fan speeds, and keyboard lighting, and unlock power limits. 项目地址: https://gitcode.com/gh_mirrors/om/OmenSuperHub 你是否也曾为官方Om…

2026/7/28 0:00:29阅读更多 →
RAG必踩坑!财报法规检索不准?这款开源工具让答案浮出水面,准确率飙升98.7%!

RAG必踩坑!财报法规检索不准?这款开源工具让答案浮出水面,准确率飙升98.7%!

做 RAG 的人应该都踩过这个致命的坑:把几百页的财报、法规、技术手册扔给向量库,问一个具体问题,搜出来的全是沾边但没用的内容 —— 关键信息要么被硬切块拆碎了,要么藏在几十条结果的最下面。语义相似≠真正相关,这个…

2026/7/28 0:00:29阅读更多 →
抖音视频文案提取工具全指南:免费2026版、手机App、在线工具一网打尽

抖音视频文案提取工具全指南:免费2026版、手机App、在线工具一网打尽

2026年做短视频运营,从抖音上扒文案早就不是偷偷抄笔记的事了。我刚开始做内容的时候,每天刷半小时抖音,手动把爆款视频的口播敲进备忘录,一条2分钟的视频得花十来分钟,碰到语速快的还要反复回听。后来试了一圈工具&am…

2026/7/28 0:00:29阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/28 20:22:24阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/28 3:17:03阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/28 2:35:58阅读更多 →