HarmonyOS7 ArkUI 图片九宫格切割 - 正方形裁剪预览与发布效果实战:从状态到页面反馈

发布时间:2026/9/29 4:54:24

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/9/26 15:36:48

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

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

2026/9/28 19:02:27

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

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

2026/9/29 4:54:16

Innovus CTS进阶:Flexible H-tree与Multi-tap时钟树综合实战

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

2026/9/29 4:54:16

Arduino感光灯:光敏电阻模拟输入与PWM调光实战

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

2026/9/29 4:54:16

功能安全架构设计:从FTA反向建模到四层安全机制落地

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

2026/9/29 4:54:16

嵌入式开发四大核心动作:烧录、下载、仿真与调试全解析

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

2026/9/29 4:54:16

边缘端AI选型:从场景反推算力,避开TOPS误区

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

2026/9/29 4:49:15

Vue3+TS+Vite数据大屏自适应方案详解:scale与rem两种方法

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

2026/9/28 3:03:23

东莞市品牌网站建设报价常见报错与解决

东莞品牌网站建设报价单背后:一份保姆级建站教程避坑实录 网站做好了没人访问,这大概是很多老板最头疼的事。花了大几万做的品牌站,上线后流量惨淡,比路边摊还冷清。别急着骂外包公司,很多“东莞品牌网站建设报价”里藏着不少猫腻,比如用模板站冒充定制…

2026/9/28 6:05:15

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解 【免费下载链接】spirula-studio Cross-vendor 3D Gaussian Splatting trainer - video to splat to mesh, Vulkan or CUDA. 项目地址: https://gitcode.com/GitHub_Trending/sp/spirula-studio Sp…

2026/9/28 6:07:41

SEO怎么推广速查手册新手避坑实战指南

SEO怎么推广速查手册新手避坑实战指南 模板网站太丑不够用?别急着加滤镜,那是治标不治本。很多老板盯着后台流量掉得眼红,却还在纠结首页Banner的圆角是不是3像素。这就像穿着西装去挖土,姿势不对,努力白费。我整理这份 速查手册…

2026/9/29 0:04:04

AI Evals实战指南:从零搭建LLM应用评估体系与CI/CD集成

1. 为什么AI Evals值得你花时间搞明白做LLM应用的人,迟早会撞上同一堵墙:模型输出飘忽不定,今天答得好好的,明天换个问法就胡说八道。你改了一版提示词,感觉好像好了点,但到底好了多少?说不清。…

2026/9/29 0:04:04

Java采购管理系统实战:从数据库设计到事务一致性

简介:这是一套面向Java Web初学者与课程设计者的采购管理系统完整源码,采用JSP技术搭建,配合MySQL数据库,用于解决企业采购信息的管理问题,适合作为毕业设计、课程大作业或进销存类项目的参考模板。系统实现了用户登录…

2026/9/29 3:53:39

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

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

2026/9/26 19:58:38

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

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

2026/9/28 1:59:25

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

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

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑