发布时间:2026/9/3 10:09:19
HarmonyOS7 ArkUI 图片九宫格切割 - 正方形裁剪预览与发布效果实战:从状态到页面反馈 文章目录前言先把业务看明白状态和 UI 的关系核心逻辑拆读片段 1get cols(): number {片段 2get currentFilter(): FilterPreset_wc1v {使用方式完整代码一个小复盘前言这个案例看着是一个小页面里面其实塞了不少常见业务写法列表、筛选、按钮事件、条件样式基本都能练到。它的主线是图片九宫格切割细节落在正方形裁剪预览与发布效果。这些细节刚好能把页面状态、用户操作和组件刷新串起来。先把业务看明白NineGridImageSplitPage不是一个只展示静态内容的页面。它会根据用户点击、输入、切换或计时来改变界面所以阅读代码时可以先抓三条线观察点在这个案例里的表现页面主题图片九宫格切割主要文案原图,清新,复古,黑白,暖调,冷调常用组件Button,Column,Divider,ForEach,Grid,GridItem,Row,Scroll,Slider,Stack,Text适合练习状态驱动 UI、条件样式、列表渲染、事件回调状态和 UI 的关系ArkUI 的页面刷新依赖状态变化。下面这些State字段就是页面的“开关”和“数据源”不用手动找 DOM也不用自己通知某个控件刷新。状态字段类型我会怎么理解它selectedCountnumber当前选中项决定高亮和内容切换filterIndexnumber当前选中项决定高亮和内容切换previewModeboolean记录页面当前选择、输入或展示状态spacingnumber记录页面当前选择、输入或展示状态一个经验先把State看完再看build()页面逻辑会清楚很多。否则很容易被一长串布局代码带偏。核心逻辑拆读片段 1get cols(): number {这段代码承担的是页面里的“判断”或“动作”把它从布局里抽出来后build()会清爽很多。后面要加新条件也不会到处翻 UI 代码。getcols():number{if(this.selectedCount1)return1if(this.selectedCount4)return2return3}片段 2get currentFilter(): FilterPreset_wc1v {这段代码承担的是页面里的“判断”或“动作”把它从布局里抽出来后build()会清爽很多。后面要加新条件也不会到处翻 UI 代码。getcurrentFilter():FilterPreset_wc1v{returnthis.filterPresets[this.filterIndex]}使用方式把下面代码放进 ArkTS 页面文件中即可运行。用于正式项目时我会继续把数据模型、卡片 Builder 和页面事件拆出去页面文件只负责组合。建议练习顺序先改状态字段 - 再改交互事件 - 最后调整 UI 样式 检查重点点击是否刷新、列表 key 是否稳定、条件样式是否集中管理这份代码可以继续扩展的方向把模拟数据替换成接口数据抽出复用卡片组件增加空状态和异常状态补充深色模式或主题色适配对输入类场景增加校验提示完整代码// NineGridImageSplitPage - 图片九宫格切割 - 正方形裁剪预览与发布效果interfaceGridCell{row:numbercol:numberbgX:numberbgY:number}interfaceFilterPreset_wc1v{name:stringbrightness:numbercontrast:numbersaturate:numbergrayscale:number}EntryComponentstruct NineGridImageSplitPage{StateselectedCount:number9StatefilterIndex:number0StatepreviewMode:booleanfalseStatespacing:number4privatefilterPresets:FilterPreset_wc1v[][{name:原图,brightness:1.0,contrast:1.0,saturate:1.0,grayscale:0},{name:清新,brightness:1.1,contrast:0.9,saturate:1.3,grayscale:0},{name:复古,brightness:0.9,contrast:1.1,saturate:0.7,grayscale:0.2},{name:黑白,brightness:1.0,contrast:1.2,saturate:0,grayscale:1.0},{name:暖调,brightness:1.05,contrast:1.0,saturate:1.2,grayscale:0},{name:冷调,brightness:0.95,contrast:1.1,saturate:0.9,grayscale:0},]privatecolorPalette:string[][#FF6B9D,#C44569,#F8B500,#6C5CE7,#00B894,#0984E3,#E17055,#74B9FF,#A29BFE,]getcols():number{if(this.selectedCount1)return1if(this.selectedCount4)return2return3}getcurrentFilter():FilterPreset_wc1v{returnthis.filterPresets[this.filterIndex]}getCells():GridCell[]{constcells:GridCell[][]for(letr0;rthis.cols;r){for(letc0;cthis.cols;c){if(cells.lengththis.selectedCount){cells.push({row:r,col:c,bgX:c,bgY:r})}}}returncells}build(){Column({space:0}){// 顶部导航Row(){Text(✕).fontSize(20).fontColor(#1a1a1a)Blank()Text(九宫格切割).fontSize(18).fontWeight(FontWeight.Bold).fontColor(#1a1a1a)Blank()Text(发布).fontSize(16).fontColor(#1890ff).fontWeight(FontWeight.Bold)}.width(100%).padding({left:16,right:16,top:14,bottom:14}).backgroundColor(#ffffff)Scroll(){Column({space:20}){// 源图预览用颜色渐变模拟Column(){Text(源图预览).fontSize(13).fontColor(#999999).padding({bottom:10}).width(100%)Stack(){Column().width(100%).height(280).linearGradient({angle:135,colors:[[#FF6B9D,0],[#C44569,0.3],[#F8B500,0.6],[#6C5CE7,1.0]]}).borderRadius(12).brightness(this.currentFilter.brightness).contrast(this.currentFilter.contrast).saturate(this.currentFilter.saturate).grayscale(this.currentFilter.grayscale)// 九宫格切割线if(this.selectedCount9){Column(){Divider().strokeWidth(2).color(#ffffff80).margin({top:93})Divider().strokeWidth(2).color(#ffffff80).margin({top:93})}.width(100%).height(280).position({x:0,y:0})Row(){Divider().width(2).height(280).backgroundColor(#ffffff80).margin({left:33%})Divider().width(2).height(280).backgroundColor(#ffffff80).margin({left:33%})}.width(100%).height(280).position({x:0,y:0})}}.width(100%)}.padding({left:16,right:16})// 滤镜选择Column({space:10}){Text(滤镜效果).fontSize(14).fontWeight(FontWeight.Medium).fontColor(#1a1a1a).padding({left:16}).width(100%)Scroll(){Row({space:12}){ForEach(this.filterPresets,(f:FilterPreset_wc1v,idx:number){Column({space:6}){Column().width(60).height(60).linearGradient({angle:135,colors:[[#FF6B9D,0],[#6C5CE7,1.0]]}).borderRadius(8).brightness(f.brightness).contrast(f.contrast).saturate(f.saturate).grayscale(f.grayscale).border({width:2,color:this.filterIndexidx?#1890ff:transparent})Text(f.name).fontSize(11).fontColor(this.filterIndexidx?#1890ff:#666666)}.alignItems(HorizontalAlign.Center).onClick((){this.filterIndexidx})})}.padding({left:16,right:16})}.scrollable(ScrollDirection.Horizontal).scrollBar(BarState.Off)}// 切割数量选择Column({space:12}){Text(切割数量).fontSize(14).fontWeight(FontWeight.Medium).fontColor(#1a1a1a).padding({left:16}).width(100%)Row({space:12}){ForEach([1,2,3,4,6,9],(n:number){Column({space:4}){// 预览小网格Column(){Grid(){ForEach(Array.from({length:n}),(_:Object,i:number){GridItem(){Column().width(100%).height(100%).backgroundColor(this.colorPalette[i%this.colorPalette.length])}})}.columnsTemplate(n1?1fr:n4?1fr 1fr:1fr 1fr 1fr).rowsGap(2).columnsGap(2).width(36).height(36)}.width(44).height(44).backgroundColor(this.selectedCountn?#e8f4ff:#f5f5f5).borderRadius(8).border({width:2,color:this.selectedCountn?#1890ff:transparent}).justifyContent(FlexAlign.Center).alignItems(HorizontalAlign.Center)Text(${n}格).fontSize(11).fontColor(this.selectedCountn?#1890ff:#666666)}.alignItems(HorizontalAlign.Center).onClick((){this.selectedCountn})})}.justifyContent(FlexAlign.SpaceEvenly).width(100%)}// 间距设置Column({space:8}){Row(){Text(切割间距).fontSize(14).fontWeight(FontWeight.Medium).fontColor(#1a1a1a)Blank()Text(${this.spacing}px).fontSize(13).fontColor(#1890ff)}.padding({left:16,right:16}).width(100%)Slider({value:this.spacing,min:0,max:20,step:1}).width(90%).trackColor(#e8e8e8).selectedColor(#1890ff).onChange((v:number){this.spacingMath.round(v)})}// 切割预览Column({space:12}){Text(切割预览).fontSize(14).fontWeight(FontWeight.Medium).fontColor(#1a1a1a).padding({left:16}).width(100%)Grid(){ForEach(this.getCells(),(cell:GridCell,idx:number){GridItem(){Column().width(100%).height(100%).linearGradient({angle:135,colors:[[#FF6B9D,0],[#C44569,0.3],[#F8B500,0.6],[#6C5CE7,1.0]]}).brightness(this.currentFilter.brightness).contrast(this.currentFilter.contrast).saturate(this.currentFilter.saturate).grayscale(this.currentFilter.grayscale)}})}.columnsTemplate(this.cols1?1fr:this.cols2?1fr 1fr:1fr 1fr 1fr).rowsGap(this.spacing).columnsGap(this.spacing).width(100%).height(this.cols1?300:this.cols2?200:300).padding({left:16,right:16})}// 发布按钮Button(保存并发布).width(90%).height(50).fontSize(16).backgroundColor(#1890ff).borderRadius(25).fontWeight(FontWeight.Medium).margin({top:8})Column().height(32)}.padding({top:16})}.layoutWeight(1).backgroundColor(#f5f7fa)}.width(100%).height(100%).backgroundColor(#f5f7fa)}}一个小复盘这个案例可以当成一个小模板先把页面会变的东西放进状态再用函数或 Builder 处理重复逻辑最后让布局只关心展示。写 HarmonyOS7 页面时这个顺序通常比一上来堆 UI 更稳。

相关新闻

2026/8/31 11:09:02

【关于微服务的深入理解】

1.什么是微服务?微服务就是把一个大型的单体应用,按照业务功能拆分成多个独立的小服务,每个小服务独立开发、独立部署、独立运行。微服务与高并发的区别?微服务解决的是:组织复杂度和系统脆弱性的问题高并发&#xff1…

2026/9/1 3:20:08

人工智能演进之路:从符号逻辑到自主智能体的12个里程碑

1. 符号逻辑时代:人工智能的奠基(1950s-1970s)1956年达特茅斯会议上,约翰麦卡锡首次提出"人工智能"术语时,研究者们手中的工具只有数学逻辑和符号系统。这个阶段的AI像一位严谨的数学家,试图用形…

2026/9/3 10:07:54

《狂野飙车9》1星宾利速8 R6赛道34秒603极限跑法全解析

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

2026/9/3 10:07:54

Java Web个人信息系统:原生Servlet+JSP实战骨架

简介:这是一套面向Java初学者与高校课程设计学生的个人信息维护系统实践项目,聚焦Web应用开发全流程训练,涵盖用户登录、信息展示与修改、登录日志查询等核心功能,帮助学习者掌握JDBC数据库操作、MVC分层架构、前端交互及基础安全…

2026/9/3 10:07:54

51单片机实车大灯控制系统设计与落地实践

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

2026/9/3 10:07:54

Python PDF办公自动化:格式解析、合并拆分、文本表格提取指南

在日常办公和数据处理中,PDF 是出现频率极高的文件格式。无论是阅读合同、整理报价单、合并扫描件、提取报销发票信息,还是把系统导出的 PDF 报表转成 Excel 再汇总,都会涉及大量重复操作。手动处理这些文件不仅浪费时间,还容易出…

2026/9/3 10:07:54

沥青路面缺陷检测数据集构建与YOLOv8模型训练全流程实战

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

2026/9/1 16:02:17

vSound小提琴数字处理器实操指南:从接线到演出的完整配置

电小提琴或者原声小提琴插电演出,第一个绕不开的坎就是声音难听。原声琴的共鸣和空气感一旦进了拾音器,出来的往往是一坨干瘪、发尖、带着奇怪塑料味的信号。我当初第一次把琴接上乐队调音台,直接被主唱吐槽"你这声音像在锯钢丝"。…

2026/9/2 9:00:32

传感器接口IC如何攻克生物化学传感的微弱信号难题?

1. 从电极到比特流:为什么生物化学传感必须依赖专用接口IC 做生物化学传感的人都有过类似的经历:明明传感器本身性能很好,信号输出却一塌糊涂——噪声大、漂移明显、重复性差,怎么调都达不到预期。很多时候问题并不在传感器&#…

2026/9/2 8:41:06

STM32F411CEU6多通道ADC采集:扫描模式+DMA实现详解

1. 多通道 ADC 的用武之地把“Multichannel ADC”和“STM32F411CEU6”这两个关键字放在一起,其实就是嵌入式开发里最常遇到的一类需求:用一块不算贵的 MCU,同时采集多路模拟信号。STM32F411CEU6 是 48 引脚的 Cortex-M4F 主控,主频…

2026/9/3 0:02:06

零基础装 OpenClaw 小龙虾 AI:Windows 一键部署教程与避坑要点

Windows 部署 OpenClaw 完整教程|本地 AI 智能体 5 分钟落地,环境配置一次搞定 版本说明:Windows 3.1.0 / Mac 2.7.9 写在前面 近两年开源 AI 领域有一款被称作「数字员工」的工具持续走热,它就是 OpenClaw,圈内人更习…

2026/9/3 0:02:06

Hermes Agent 本地部署新方案:Windows 整合包减少依赖报错

Windows 本地部署 Hermes 太麻烦?这版一键包 5 分钟快速跑通 很多人想体验 Hermes Agent,但真正开始部署时,往往会卡在环境配置这一步。 需要安装各类依赖、调试运行环境、处理路径问题,还容易遇到命令行报错、系统拦截、文件缺…

2026/9/3 0:02:06

实测 OpenClaw 一键包,5 分钟完成本地自动化环境搭建

OpenClaw 本地 AI 自动化工具部署指南|使用一键包规避环境配置难题 痛点:部署 AI 自动化工具常常要处理 Python、Node.js 各类依赖,版本冲突、环境配置耗费大量时间,OpenClaw 提供一键安装包,降低部署门槛。 适配系统&…

2026/9/2 1:15:22

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行,Type-C接口算是典型的“看着简单,做起来全坑”的东西。光引脚就24个,高低速信号、电源、控制线全部塞在一个小小的连接器里,如果PCB布局不做规划,打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/2 1:15:22

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/2 1:15:20

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…