当前位置: 首页 > news >正文

绘制自定义图形:Shape组件(Circle, Rect, Path)的高级用法(32)

在 ArkUI 框架中,Shape是所有几何图形组件的父组件(基类),它不仅自身支持通用属性,还可以作为容器包裹Circle(圆形)、Rect(矩形)、Path(路径)等子组件,实现类似 SVG 的复合绘制效果。

以下梳理这三种核心绘制组件的高级用法与实战技巧:

一、 Shape 组件的高级特性

Shape的核心优势在于组合绘制视口控制(viewPort)

  1. 组合绘制:可以在Shape内部放置多个基础图形,并通过统一的填充、描边属性控制外观。
  2. viewPort 缩放与平移:通过viewPort({ x, y, width, height })属性,可以指定用户空间中的一个矩形映射到组件边界,从而实现绘制内容的放大、缩小或平移效果。
  3. 网格扭曲(Mesh):当传入PixelMap作为绘制目标时,可以使用.mesh()属性实现网格扭曲效果。

实战示例

Shape() { // 底层背景矩形 Rect().width('100%').height('100%').fill('#0097D4') // 叠加圆形 Circle({ width: 75, height: 75 }).fill('#E87361') } .viewPort({ x: 0, y: 0, width: 150, height: 150 }) // 视口控制 .width(300).height(300) // 组件实际尺寸,配合viewPort实现放大 .backgroundColor('#F5DC62')

二、 Rect 组件:灵活的圆角与渐变

Rect除了基础的宽高和颜色设置,还支持高度定制化的圆角和渐变效果:

  1. 独立控制四角圆角:通过.radius([[40, 40], [20, 20], [40, 40], [20, 20]])可以分别设置左上、右上、右下、左下四个角的圆角半径。
  2. 宽高分离的圆角:使用.radiusWidth().radiusHeight()可以绘制椭圆形的圆角。
  3. 裁剪与渐变结合:从 API 18 开始,结合.linearGradient().clipShape(),可以绘制带有复杂倒角边界的渐变色矩形。

实战示例

Rect({ width: '90%', height: 80 }) .radius([[40, 40], [20, 20], [40, 40], [20, 20]]) // 四角不同圆角 .fill(Color.Pink)

三、 Path 组件:基于 SVG 规范的自由绘制

Path是绘制复杂自定义图形(如心形、不规则曲线)的核心组件。它通过.commands()属性接收符合 SVG 路径描述规范的字符串。

常用命令速查:
  • M x y:移动画笔到指定起点。
  • L x y:画直线到指定点。
  • H x / V y:画水平/垂直线。
  • C x1 y1 x2 y2 x y:三次贝塞尔曲线(常用于绘制平滑的心形等)。
  • A rx ry ... x y:椭圆弧。
  • Z:闭合路径,自动连接终点与起点。

实战示例(绘制心形)

Path() .commands( 'M150 80 ' + 'C150 74 140 50 100 50 ' + 'C40 50 40 125 40 125 ' + 'C40 160 80 204 150 240 ' + 'C220 204 260 160 260 125 ' + 'C260 125 260 50 200 50 ' + 'C170 50 150 74 150 80 Z' ) .fill(Color.Red) .stroke(Color.Orange) .strokeWidth(3)

四、 通用高级属性

无论是Shape还是其子组件,都支持以下链式调用的渲染控制属性:

  • 填充与透明度.fill(color).fillOpacity(value)
  • 描边与样式.stroke(color).strokeWidth(value).strokeLineJoin()(拐角样式)、.strokeDashArray()(虚线样式)。
  • 抗锯齿.antiAlias(true),默认开启,保证图形边缘平滑。
1、 动态属性控制(AttributeModifier)

在复杂业务中,图形的颜色、透明度、边框等属性往往需要随状态动态变化。ArkUI 提供了attributeModifier机制,允许将多个图形属性封装在一个类中,实现统一管理,避免在组件上挂载大量零散的修饰符。

核心逻辑:实现AttributeModifier<ShapeAttribute>接口,在applyNormalAttribute中集中设置属性。

class MyShapeModifier implements AttributeModifier<ShapeAttribute> { applyNormalAttribute(instance: ShapeAttribute): void { instance.fill("#707070") .fillOpacity(0.5) .stroke("#2787D9") .strokeWidth(10) .strokeLineCap(LineCapStyle.Round) .antiAlias(true); } } @Entry @Component struct ShapeModifierDemo { @State modifier: MyShapeModifier = new MyShapeModifier(); build() { Column() { Shape() { Rect().width(200).height(100) } .attributeModifier(this.modifier) // 统一应用属性 } } }
2、 Canvas 组件:面向复杂交互的 2D 画布

当需要实现手绘、签名、复杂图表或高频重绘场景时,Shape的声明式渲染可能面临性能瓶颈。此时应使用Canvas组件配合CanvasRenderingContext2D进行命令式绘制。

核心逻辑

  1. 初始化CanvasRenderingContext2D
  2. onReady中配置画笔属性。
  3. 绑定触摸事件(如onTouch),在onActionUpdate中调用context的绘图 API(如lineTo,stroke)并调用context.invalidate()触发重绘。
@Entry @Component struct CanvasDrawDemo { private context: CanvasRenderingContext2D = new CanvasRenderingContext2D(new RenderingContextSettings(true)); private path: Path2D = new Path2D(); build() { Canvas(this.context) .width('100%') .height('100%') .onReady(() => { this.context.lineWidth = 3; this.context.strokeStyle = '#000000'; }) .onTouch((event: TouchEvent) => { if (event.type === TouchType.Down) { this.path.moveTo(event.touches[0].x, event.touches[0].y); } else if (event.type === TouchType.Move) { this.path.lineTo(event.touches[0].x, event.touches[0].y); this.context.stroke(this.path); this.context.invalidate(); // 关键:触发画布重绘 } }) } }
3、 路径动画联动(MotionPath)

Path组件中的 SVG 路径字符串不仅可以用于静态绘制,还可以作为组件运动的轨迹。通过.motionPath()属性,可以让任意 UI 组件沿着自定义的贝塞尔曲线或直线进行平滑动画。

核心逻辑:将 SVG 路径字符串传递给motionPathpath属性,并设置rotatable: true让组件在移动时自动跟随路径切线方向旋转。

Image($r('app.media.car')) .width(50) .height(50) .motionPath({ path: 'M10 10 L100 10 C150 50 200 100 300 200', // 复用 Path 的 SVG 语法 from: 0.0, to: 1.0, rotatable: true })
http://www.jsqmd.com/news/1027196/

相关文章:

  • 2026年石英片厂家官方甄选指南:高透、耐高温与定制化加工推荐 - 优质品牌商家
  • 2026年国内烘箱烘干机厂家官方甄选:技术实力与工程经验并重的行业推荐 - 优质品牌商家
  • 无锡房屋渗漏水检测维修、卫生间漏水免砸砖维修、漏水点精准检测、厨房漏水防水补漏、正规防水补漏公司、口碑榜TOP5靠谱推荐、本地人必选的防水维修公司 - 安佳防水
  • 裕达集装箱房・移动房屋・集成房屋(无锡全域)|租赁・定制・出租・出售 一站式服务 - 博客万
  • 2026耐用的高分子晶须合金桥架生产商怎么选 - 品牌排行榜
  • 2026年武汉建设工程纠纷法律服务全景解析与核心服务商深度推荐 - 品牌鉴赏官2026
  • 2026年口碑甄选:琴台式防爆正压柜采购指南与厂商对比分析 - 优质品牌商家
  • 2026北京黄金回收人气TOP5榜单|实地测评排名 同城卖金首选榜单 - 博客万
  • 新乡房屋渗漏水检测维修、卫生间漏水免砸砖维修、漏水点精准检测、厨房漏水防水补漏、正规防水补漏公司、口碑榜TOP5靠谱推荐、本地人必选的防水维修公司 - 安佳防水
  • Grbl_Esp32深度解析:ESP32双核架构如何重塑开源CNC控制系统
  • OpenCascade.js企业级部署:高性能WebAssembly CAD内核的架构实践
  • 2026绵阳智慧养老平台怎么选?官方甄选本地化服务商综合评估 - 优质品牌商家
  • 2026年中广州经济纠纷频发,寻求专业律师咨询哪个好? - 品牌鉴赏官2026
  • Everspin低功耗并行接口MRAM芯片存储应用优势
  • 面向开发者的Top10加密货币数据API(2026年最新)
  • 【深度探索】Sigil:重新定义开源电子书编辑的创作哲学
  • 2026年办公室加气块隔墙怎么选?官方推荐甄选施工服务商 - 优质品牌商家
  • 蓝牙智能戒指 — 蓝牙产品形态与软硬件架构设计
  • 谷歌收录搜索不到原因 | 刚上线3个月的新站?这是必经的沙盒期
  • 2026年充电站膜结构雨棚生产厂商甄选:这几家值得关注 - 优质品牌商家
  • 2026 年 6 月国际 GEO 优化服务商推荐:五家优质企业深度测评 - 博客万
  • Cadence EDA工具全解析:从芯片设计到PCB开发的十五年实战指南
  • 从零开始构建操作系统:30天自制操作系统的完整实践指南
  • 2026年二次变频恒压供水设备选购指南:从水质到工艺的实用推荐 - 优质品牌商家
  • ICEF 认知操作系统・CUS-L0-A 十大元认知原则(正式定稿 V1.0)
  • 2026年拉丝不锈钢板厂家专业甄选:从工艺到交付的全维度分析 - 优质品牌商家
  • 5个方法让Agent工具调用准确率从60%拉到95%
  • Adapter模块:大模型轻量微调的工程化实践指南
  • 影刀RPA避坑指南_网页反爬虫机制应对IP代理UserAgent与Cookie管理
  • 郴州高口碑黄金铂金回收白银回收实体老店排行 5 家靠谱门店电话地址全收录