Harmony os 技术实战|拼豆制图02:50 张图纸的 Repository 与轻量预览
Harmony os 技术实战拼豆制图0250 张图纸的 Repository 与轻量预览图库从 7 张扩到 50 张后最容易遇到的问题不是数据不够而是页面一打开就把所有完整编号矩阵都渲染出来。拼豆图纸每张都可能有 70 x 70 个格子如果列表页把这些格子全部创建成 UI用户只是滑动图库却要替详情页付出成本。这篇文章会把问题拆到能落地的层面重点解决把图纸种子、资源矩阵和页面展示分开。列表页使用 previewCells详情页才使用 chartCells。用统计函数复算颜色数量和拼豆总数避免手填失真。保留没有真实矩阵时的程序化图纸生成能力。问题不是 50 张图而是 50 张完整矩阵拼豆制图的图库包含动漫人物、游戏人物、爱豆、场景、潮玩盲盒等分类。列表页需要快速展示封面、标题、难度、色数和收藏按钮详情页才需要每一格色号、坐标、图例和放大查看。如果把这两种需求混成一个对象在列表页就会过度计算。项目里已经把PatternRepository放在 services 层这是一个正确方向。它既不是简单常量表也不是 UI 组件它负责把种子数据、真实矩阵资产和颜色统计拼成页面可消费的Pattern。这样图库页只管渲染卡片编号图纸页只管展示完整施工图。落地时可以先抓三个信号Repository的职责是否只在一个层级里被定义而不是页面、服务和资源各写一份。Pattern相关状态是否能从用户入口一路追到结果页中间没有隐式副作用。遇到空数据、取消操作或边界输入时页面是否还能停在可继续操作的状态。Repository 应该拥有数据组装权Repository 的边界可以定得更清楚它接收图纸 ID 和加载策略返回稳定的业务对象。页面不关心矩阵来自脚本、资源文件还是程序化算法页面只关心对象里有没有 previewCells、chartCells 和 colorStats。决策点推荐做法避免的问题列表展示读取previewCells列表滑动卡顿详情展示进入编号页再取完整chartCells首屏承担全部矩阵成本颜色统计从格子数组复算手填统计和实际图纸不一致资源缺省保留程序化生成兜底某张图缺资源导致页面空白这张表真正约束的是变更顺序先固定“列表展示”的归属再处理“详情展示”的输入输出最后围绕“颜色统计”做回归。只要这三处没有漂移后续增加页面、资源或参数时改动就不会一路扩散到无关模块。实际排查时也建议按这个顺序记录结论哪一层接收输入、哪一层生成结果、哪一层负责失败后的恢复。记录得越具体下一轮迭代越不容易把已经稳定的路径改坏。Pattern 模型要覆盖列表和施工图模型要同时服务列表和详情但不要让页面猜字段含义。previewCells是小尺寸预览chartCells是施工图矩阵二者都使用同一个BeadCell这样渲染组件可以复用。1. 模型同时覆盖预览和完整图纸一个Pattern可以被列表页和详情页共用但字段含义必须区分清楚。exportinterfaceBeadCell{id:string;row:number;col:number;colorId:string;colorCode:string;hex:string;isEmpty:boolean;}exportinterfacePattern{id:string;title:string;category:string;width:number;height:number;previewCells:BeadCell[];chartCells:BeadCell[];colorStats:BeadColorStat[];}previewCells解决列表页轻量展示chartCells解决施工图细节。两者共用BeadCell避免写两套渲染逻辑。按需创建预览和完整图纸Repository 的核心不是返回数组而是把来源不同的数据统一成Pattern。真实矩阵存在时使用资源矩阵没有资源时使用程序化图形保证每张图都能进入详情页。2. Repository 暴露列表和按 ID 查询页面不用知道种子数组在哪里也不用关心真实矩阵是否存在。exportclassPatternRepository{staticgetPatterns():Pattern[]{constseedsPatternRepository.createSeeds();constresult:Pattern[][];for(leti0;iseeds.length;i){result.push(PatternRepository.createPattern(seeds[i],false));}returnresult;}staticgetPatternById(id:string):Pattern|null{constseedsPatternRepository.createSeeds();for(leti0;iseeds.length;i){if(seeds[i].idid){returnPatternRepository.createPattern(seeds[i],true);}}returnnull;}}列表读取时includeFullChartfalse详情读取时才打开完整矩阵。这个参数把性能策略放在 Repository而不是散在页面分支里。矩阵编码要能被脚本稳定生成图库页的渲染策略应该克制。列表卡片用预览格子和封面信息不直接渲染完整图纸。这样搜索和分类切换时只需要处理轻对象。3. 真实矩阵和程序化图纸走同一出口不是每张图一开始都有真实矩阵所以需要一个统一的创建函数。privatestaticcreatePattern(seed:PatternSeed,includeFullChart:boolean):Pattern{constassetChartPatternAssetCharts.get(seed.id);constpaletteassetChartnull?seed.palette:PatternRepository.assetPalette(seed.id,assetChart.colors);constpreviewCellsassetChartnull?PatternRepository.createCells(${seed.id}-preview,palette,seed.variant,16):PatternRepository.createCellsFromRows(${seed.id}-preview,palette,assetChart.previewRows);constchartCellsassetChart!nullincludeFullChart?PatternRepository.createCellsFromRows(seed.id,palette,assetChart.chartRows):previewCells;returnPatternRepository.buildPattern(seed,palette,previewCells,chartCells);}这里的重点是出口一致页面拿到的永远是Pattern。资源矩阵、程序化兜底、轻量预览都被收在 Repository 内部。统计结果从格子反推统计信息不要做成静态文本。色号数量、每色颗数、总颗数都可以从格子里复算导出图和详情页也会得到同一组数字。4. 用字符矩阵表达颜色索引资源矩阵适合脚本生成字符编码比直接写 4900 个对象更容易维护。privatestaticcreateCellsFromRows(id:string,palette:PaletteColor[],rows:string[]):BeadCell[]{constcells:BeadCell[][];for(letrow0;rowrows.length;row){constsourceRowrows[row];for(letcol0;colsourceRow.length;col){consttokensourceRow.substring(col,col1);constcolorIndexPatternRepository.assetColorIndex(token);constcolorcolorIndex0?null:palette[colorIndex];cells.push(PatternRepository.createCell(id,row,col,color));}}returncells;}字符.表示空格数字和字母表示颜色索引。脚本只要输出稳定字符串就能被 Repository 转成统一的格子对象。页面只消费业务对象批量生成后的矩阵资源需要有稳定命名。文件名、图纸 ID 和资源映射要保持同一套规则否则 50 张图扩到 100 张时最先出问题的是错配而不是算法。5. 统计从格子反推图例和总颗数不要手写避免换图后忘记同步。privatestaticcountColors(palette:PaletteColor[],cells:BeadCell[]):BeadColorStat[]{conststats:BeadColorStat[][];for(leti0;ipalette.length;i){constcolorpalette[i];letcount0;for(letcellIndex0;cellIndexcells.length;cellIndex){if(cells[cellIndex].colorIdcolor.id){count;}}stats.push({colorId:color.id,colorCode:color.code,colorName:color.name,hex:color.hex,count});}returnstats;}统计函数拥有完整格子输入因此能服务详情页、导出图和个人页作品统计。后续如果增加材料清单也可以从这里派生。验证图库加载路径实际项目里验证不能只看页面有没有打开。更稳的做法是把入口、状态、边界数据和失败路径都走一遍尤其是拼豆图纸这种“看起来能显示放大后才暴露问题”的功能。验证前建议准备一组固定样本一条正常路径、一条空数据路径、一条失败路径再加一条连续操作路径。这样每次改动都能比较同一批场景不会只凭当前页面肉眼感觉判断。如果涉及屏幕尺寸、资源替换或系统能力还要保留修改前后的截图和关键输入方便回退时确认差异来自哪里。hvigor assembleHap--no-daemonWrite-Host手动验证图库滚动 - 分类切换 - 打开编号图 - 返回图库 - 再打开另一张图图库首次打开时不应明显卡顿分类切换后卡片高度和列数保持稳定。随机打开 5 张图纸确认详情页宽高、色数、总颗数与图例一致。缺少真实矩阵的图纸也能进入编号图纸页不能出现空白详情。搜索结果中的图纸点击后仍能读取完整 chartCells。批量替换资源后图纸 ID 和矩阵资源要一一对应。常见问题和处理现象先看哪里处理方式图库滑动卡顿列表页是否渲染完整矩阵列表只渲染 previewCells 或封面图详情色号为空assetColorIndex 和 palette 长度检查矩阵字符是否越界图例数量不对countColors 输入的是预览还是完整图详情和导出使用 chartCells 统计某张图打不开PatternAssetCharts.get 返回值缺资源时回退程序化图纸继续扩展图库时的做法当图库继续扩容可以把种子数据拆成 JSON5 或生成脚本输出的 ArkTS 文件Repository 只保留解析和统计逻辑。若后续支持用户下载主题包也可以把PatternAssetCharts.get替换成异步读取本层接口仍然返回同样的Pattern。继续推进时建议保持三条约束先让现有主路径可回归再拆更细的组件或服务。新增状态必须能说明来源、更新时机和失败后的保留策略。新增资源或配置要能从页面反查到生成来源避免后期只靠人工记忆维护。小结图库稳定的核心是按场景给数据减重。列表页要快详情页要准统计要能复算。Repository 负责把资源和算法收成统一模型页面就不会被 50 张图纸的矩阵细节拖住。

相关新闻

Arduino按键自锁与状态机实现:从消抖到稳定状态切换

Arduino按键自锁与状态机实现:从消抖到稳定状态切换

1. 项目概述:从物理开关到逻辑锁存在玩Arduino的初期,我们最常接触的输入设备可能就是那个小小的轻触按键了。按下去导通,松开就断开,这种“非自锁”的特性,简单直接,但也带来了一些麻烦。比如你想做一个灯…

2026/7/29 6:51:48阅读更多 →
STM32 PWM频率与占空比计算原理:从定时器时钟到参数配置实战

STM32 PWM频率与占空比计算原理:从定时器时钟到参数配置实战

1. 项目概述:从“知其然”到“知其所以然”搞嵌入式开发,尤其是用STM32做电机控制、LED调光、舵机驱动这些项目,PWM(脉冲宽度调制)绝对是个绕不开的核心功能。我见过不少新手朋友,在CubeMX里配置PWM时&…

2026/7/29 6:51:48阅读更多 →
车载Android开发核心技术解析与实践指南

车载Android开发核心技术解析与实践指南

1. 车载Android开发的行业背景与技术特点车载信息娱乐系统(IVI)正在经历从传统嵌入式系统向智能平台的转型。作为这一变革的核心,Android Automotive OS(AAOS)凭借其成熟的生态和灵活性,正在成为主机厂的首…

2026/7/29 6:51:48阅读更多 →
独立站建站方案怎么选?从 Taoify 看技术选型

独立站建站方案怎么选?从 Taoify 看技术选型

做跨境电商三年,我们在建站方案上踩过坑。最早用某平台,抽成加插件费吃掉薄利,独立站的数据还捏在别人手里。比较后才明白技术选型不只是比功能,更是比长期成本和控制权。独立站的价值在于把客户关系和交易数据握在自己手里。跨境…

2026/7/29 8:07:01阅读更多 →
agent多层调用

agent多层调用

大语言模型agent善于处理文字,而如果要驾驶的话,用的是自动驾驶大模型。未来的AGI应该满足多任务 多场景的功能要求,需要多个agent联合执行,多agent调用的思路在研究上慢慢清晰了起来。多agent让数据更流畅、高效。只需要把合适的…

2026/7/29 8:07:01阅读更多 →
【北方生物质取暖炉炉膛结焦堵塞成因与养殖 / 厂房落地防积焦实操方案】

【北方生物质取暖炉炉膛结焦堵塞成因与养殖 / 厂房落地防积焦实操方案】

文章前置合规声明:本文为生物质清洁供热行业技术科普推广内容,全文以设备故障原理、实操运维方案为核心干货,仅客观引用行业实体设备案例作为选型参考,无联系方式、报价、线下邀约、第三方导流等营销引导内容,不构成采…

2026/7/29 8:07:01阅读更多 →
别一不舒服就上网狂搜:你的身体,只是在给你发日志

别一不舒服就上网狂搜:你的身体,只是在给你发日志

我家书桌最底下的那个抽屉,常年备着两板药。一板布洛芬,一板铝碳酸镁。 年轻那会儿我不这样。那时候带团队干大版图的系统集成项目,天天全国各地飞,头疼了拿冷水洗把脸,胃里泛酸就随手抓个面包咽下去,根本…

2026/7/29 8:07:01阅读更多 →
深度优先与广度优先搜索的性能差异对比7

深度优先与广度优先搜索的性能差异对比7

引言搜索算法在图论和数据结构中的重要性深度优先搜索(DFS)与广度优先搜索(BFS)的基本概念性能对比的实际意义算法原理与实现深度优先搜索的核心思想与伪代码递归与非递归实现时间复杂度与空间复杂度分析广度优先搜索的核心思想与…

2026/7/29 8:07:01阅读更多 →
基于MicroBlaze软核的FPGA嵌入式开发入门:从硬件搭建到串口通信

基于MicroBlaze软核的FPGA嵌入式开发入门:从硬件搭建到串口通信

1. 项目概述与核心价值拿到一块Xilinx的AX7103开发板,很多朋友的第一反应可能是直接上手写Verilog或VHDL,用硬件描述语言去点灯、做逻辑。这当然没问题,但对于一些更偏向系统级、需要运行复杂控制逻辑或软件算法的应用来说,纯FPGA…

2026/7/29 8:05:01阅读更多 →
覆盖国产 + 海外 + 开源模型,OpenClaw 2.7.9 Windows/Mac 双端部署详解

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

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

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

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

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

2026/7/29 7:00:19阅读更多 →
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/29 7:58:51阅读更多 →
28. Agent 执行到一半想暂停?用 interrupt 给它设个“关卡“!

28. Agent 执行到一半想暂停?用 interrupt 给它设个“关卡“!

28. Agent 执行到一半想暂停?用 interrupt 给它设个“关卡“! 在构建复杂的 Agent 系统时,我们经常会遇到这样的场景:Agent 正在执行一个多步骤的任务,比如“下单购买商品”,但执行到一半时,我们…

2026/7/29 0:01:46阅读更多 →
自律同行,突破无界!NANK南卡正式官宣曾舜晞成为品牌代言人

自律同行,突破无界!NANK南卡正式官宣曾舜晞成为品牌代言人

近日,国际专注开放式技术研发的声学品牌Nank南卡,正式官宣实力艺人曾舜晞担任品牌代言人。消息一经发出便轰动全网。为什么耳机品牌不选择流量明星、老牌歌手?而且是选择曾舜晞?让我们一起来探索一下!比起短期的流量&a…

2026/7/29 0:01:46阅读更多 →
【RT-DETR多模态创新改进】CVPR 2025 | 独家特征融合创新改进篇 | 引入RLAB残差线性注意力模块,有效融合并强调多尺度特征,多种改进点,适合红外与可见光融合目标检测任务,有效涨点

【RT-DETR多模态创新改进】CVPR 2025 | 独家特征融合创新改进篇 | 引入RLAB残差线性注意力模块,有效融合并强调多尺度特征,多种改进点,适合红外与可见光融合目标检测任务,有效涨点

一、本文介绍 🔥本文在RT-DETR多模态融合目标检测中引入RLAB残差线性注意力模块,可在不同模态特征交互阶段进行多次残差细化,使可见光、红外等特征在尺度、语义和空间位置上更好对齐;随后将细化特征与解码器输出拼接并生成Q、K、V,通过线性注意力自适应强化关键通道、目…

2026/7/29 0:01:46阅读更多 →
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/29 4:31:51阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

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

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

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