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

鸿蒙开发-想画虚线和特效路径?PathEffect来帮忙

想画虚线?PathEffect 让线条不再单调

你有没有注意过,地图上的国界线是虚线,设计稿里的辅助线是虚线,流程图里的判断分支也是虚线。在 HarmonyOS 的 drawing 模块里,画虚线靠的是PathEffect

PathEffect 是什么?

PathEffect(路径效果)可以对 Pen 描绘的路径做"变形"。最常用的就是把实线变成虚线,但它还能做更多——比如用自定义形状来做虚线段,让线条看起来像一串小箭头、一串小圆点,甚至一串小星星。

下面是 PathEffect 的类型和使用流程:

标准虚线

自定义形状虚线

需要虚线或特效路径

选择 PathEffect 类型

createDashPathEffect

createPathDashEffect

设置 intervals 实线-空白模式

设置 phase 偏移量

用 Path 定义虚线段形状

设置步长和样式 MORPH/ROTATE/TRANSLATE

pen.setPathEffect 应用

canvas.drawLine / drawPath 绘制

画虚线:createDashPathEffect

最基础的用法:

import{drawing}from'@kit.ArkGraphics2D';letintervals=[10,5];// 实线10像素,空白5像素leteffect=drawing.PathEffect.createDashPathEffect(intervals,0);

intervals是一个数组,描述虚线的"实线-空白"交替模式:

  • 数组长度必须是偶数,至少 2 个元素
  • 奇数位置(第0、2、4…个)是实线部分的长度
  • 偶数位置(第1、3、5…个)是空白部分的长度

几个常见的虚线样式:

// 标准虚线:10px 实线 + 5px 空白[10,5]// 长虚线:20px 实线 + 10px 空白[20,10]// 点线交替:10px 实线 + 3px 空白 + 2px 实线 + 3px 空白[10,3,2,3]// 点状线:2px 实线 + 5px 空白[2,5]

phase参数是偏移量——控制虚线从哪个位置开始。比如phase=5意味着从实线的第 5 个像素开始画。你可以动态改变这个值来做出"虚线滚动"的动画效果。

把虚线效果用在 Pen 上

constpen=newdrawing.Pen();pen.setColor(255,0,0,255);pen.setStrokeWidth(2);leteffect=drawing.PathEffect.createDashPathEffect([10,5],0);pen.setPathEffect(effect);canvas.attachPen(pen);canvas.drawLine(20,50,380,50);// 画一条蓝色虚线canvas.detachPen();

用完后清除效果:

pen.setPathEffect(null);

自定义形状虚线:createPathDashEffect(API 18+)

如果你觉得普通的虚线太无聊了,可以用createPathDashEffect把自定义形状当作"虚线段":

// 创建一个小三角形作为虚线段letdashPath=newdrawing.Path();dashPath.moveTo(0,0);dashPath.lineTo(10,5);dashPath.lineTo(0,10);dashPath.close();letpathEffect=drawing.PathEffect.createPathDashEffect(dashPath,// 用这个形状作为虚线段50,// 步长(每个虚线段之间的距离)0,// 偏移量drawing.PathDashStyle.MORPH// 样式);pen.setPathEffect(pathEffect);

PathDashStyle有三种样式:

  • MORPH:虚线段会沿着路径的方向旋转,平滑过渡
  • ROTATE:虚线段会旋转,但在拐角处不会平滑过渡
  • TRANSLATE:虚线段不会旋转,始终保持原始方向

一般用MORPH效果最好——沿着曲线走的时候,虚线段会跟着转弯。

用圆形做虚线

letcirclePath=newdrawing.Path();circlePath.addCircle(0,0,3);// 半径 3 的小圆letpathEffect=drawing.PathEffect.createPathDashEffect(circlePath,30,0,drawing.PathDashStyle.MORPH);

这样画出来的虚线就是一串小圆点,像铁轨上的铆钉一样。

自定义形状虚线的三种 PathDashStyle 效果对比如下:

自定义形状虚线

选择 PathDashStyle

MORPH: 沿路径旋转且平滑过渡

ROTATE: 沿路径旋转但拐角不平滑

TRANSLATE: 不旋转保持原始方向

适合: 曲线路径效果最自然

适合: 直线路径

适合: 需要固定方向的装饰

完整示例:多种虚线效果

import{RenderNode}from'@kit.ArkUI';import{common2D,drawing}from'@kit.ArkGraphics2D';classDashLineRenderNodeextendsRenderNode{draw(context:DrawContext){constcanvas=context.canvas;// 标准虚线constpen1=newdrawing.Pen();pen1.setColor(255,255,0,0);pen1.setStrokeWidth(2);pen1.setPathEffect(drawing.PathEffect.createDashPathEffect([10,5],0));canvas.attachPen(pen1);canvas.drawLine(20,30,380,30);canvas.detachPen();// 点状线constpen2=newdrawing.Pen();pen2.setColor(255,0,150,0);pen2.setStrokeWidth(3);pen2.setPathEffect(drawing.PathEffect.createDashPathEffect([2,8],0));canvas.attachPen(pen2);canvas.drawLine(20,70,380,70);canvas.detachPen();// 三角形虚线lettriPath=newdrawing.Path();triPath.moveTo(0,0);triPath.lineTo(8,4);triPath.lineTo(0,8);triPath.close();constpen3=newdrawing.Pen();pen3.setColor(255,0,0,200);pen3.setStrokeWidth(2);pen3.setPathEffect(drawing.PathEffect.createPathDashEffect(triPath,40,0,drawing.PathDashStyle.MORPH));canvas.attachPen(pen3);canvas.drawLine(20,110,380,110);canvas.detachPen();// 圆形虚线letcirclePath=newdrawing.Path();circlePath.addCircle(0,0,4);constpen4=newdrawing.Pen();pen4.setColor(255,200,0,200);pen4.setStrokeWidth(2);pen4.setPathEffect(drawing.PathEffect.createPathDashEffect(circlePath,30,0,drawing.PathDashStyle.MORPH));canvas.attachPen(pen4);canvas.drawLine(20,150,380,150);canvas.detachPen();}}

这段代码画了四种不同风格的虚线:红色标准虚线、绿色点状线、蓝色三角形虚线、紫色圆形虚线。

动态虚线动画

还记得phase参数吗?如果你在draw方法里根据时间改变phase,就能做出虚线"流动"的效果:

letphase=(Date.now()/50)%15;// 每 50ms 偏移 1 像素leteffect=drawing.PathEffect.createDashPathEffect([10,5],phase);pen.setPathEffect(effect);

这在加载动画、路径引导等场景中很常见——虚线像水流一样沿着路径流动。

小结

  • createDashPathEffect:标准虚线,用intervals数组定义"实线-空白"模式。
  • createPathDashEffect:自定义形状虚线,用 Path 定义虚线段的形状。
  • phase参数控制偏移量,可以做虚线动画。
  • PathDashStyle.MORPH让虚线段沿路径方向旋转,效果最自然。
  • setPathEffect(null)清除虚线效果。

下一篇我们进入场景三:AR 增强现实,看看怎么用 AR Engine 做平面识别和图像跟踪。

http://www.zskr.cn/news/1424419.html

相关文章:

  • Claude产品需求文档黄金结构拆解:1份文档撬动3轮融资的关键数据锚点
  • 如何高效部署多语言语音合成:专业TTS模型转换实战指南
  • 全域通信链路智能化优化方案
  • HCSR04 RGB超声波传感器:从测距原理到动态灯光交互的Arduino实践
  • MCB900开发板电源噪声问题分析与解决方案
  • 爪云主机深度测评:2026年免备案海外主机的硬件配置与性能实测
  • Claude NPV分析仅限首批200家企业开放API调用权限——错过本轮将延后6个月接入金融合规沙盒
  • Meshroom免费开源3D重建软件:5步从照片到专业模型的完整指南
  • 智慧电力设备-电力巡线安全帽数据集,共约3437张张,标注格式为xml,本人用ylov5跑过,训练完检测效果可商用,电力安全帽检测数据集
  • BetterNCM终极安装指南:3分钟快速解锁网易云音乐完整插件生态
  • 2026年5月新发布:探寻智能水电气集中供料系统领域实力强劲的批发厂家 - 2026年企业资讯
  • 实战指南:用Python复现ICLR 2021的聚类友好表征学习(附Instance Discrimination与Feature Decorrelation代码)
  • 2026年Q2佛山靠谱标签定制厂家排行及参考:佛山定制印刷公司电话/佛山市印刷公司电话/佛山标签定制厂家电话/印刷公司哪家好/选择指南 - 优质品牌商家
  • 保姆级教程:用CCS12.1+TI Clang搞定CC2340开发环境(附Sysconfig和FreeRTOS配置)
  • 避开这些坑!用CA3140运放设计电荷放大器时,90%新手会忽略的细节(附低通滤波器参数计算)
  • 2026年河南省央美推荐画室排行:平顶山艺考画室、开封艺考画室、新乡艺考画室、沈丘画室、河南省央美推荐画室、河南省清华推荐画室选择指南 - 优质品牌商家
  • 丰宝斋上门回收:一次托付,一生信赖,老字号从不让藏家失望 - 深鉴新闻
  • 10 基础阶段综合实战
  • 麒麟Kylin桌面版网络配置保姆级教程:从插网线到连隐藏Wi-Fi,一次搞定
  • Silicon Graphics 030-0686-004图形控制板卡
  • 2026年5月新消息:江苏省内信誉与实力兼备的奥迪双离合维修服务商深度解析 - 2026年企业资讯
  • 四川灭火器维修充装正规机构排行:写字楼灭火器维修、工厂灭火器维修、工地灭火器回收充装、干粉灭火器充装、废旧灭火器回收选择指南 - 优质品牌商家
  • 3步快速导出QQ空间完整历史记录:GetQzonehistory终极指南
  • 博客迁移通知
  • STM32 HAL库实战:用TB6612FNG模块让GB37-520电机实现前进、后退、转向的多种运动模式
  • 2026年漂染水处理药剂权威供应商排行盘点:福建,泉州,闽南,日化化工原料、消泡剂水处理药剂、漂染化工原料、环保化工原料选择指南 - 优质品牌商家
  • 制造业AI智能体选型:跨系统执行、任务拆解与信创适配三大技术维度对比
  • 从Windows转战Ubuntu?手把手教你无缝迁移Beyond Compare使用习惯(含dpkg安装与破解详解)
  • 从MODBUS协议栈到你的代码:深入理解CRC-16校验的‘位反序’到底在干什么?
  • FastAdmin后台开发实战:手把手教你从零新增一个自定义管理页面(ThinkPHP6框架)