微信小程序 Path2D 不支持 svg 路径的解决办法
问题
开发一个微信小程序项目的时候需要用到Path2D这个对象,但是发现小程序的Path2D对象不支持实例化的时候直接传入'svg path',导致下面的代码运行的时候报错(浏览器中可运行)
#其它代码(省略)
...
//核心代码
let p = new Path2D("M10 10 h 80 v 80 h -80 Z"); //微信小程序中会报错
ctx.fill(p);
而小程序的Path2D对象只支持用命令式编程的方式去构建Path2D路径,代码如下:
#其它代码(省略)
...
//核心代码
let p = new Path2D();
p.moveTo(10, 10);
p.lineTo(90, 10);
p.lineTo(90, 90);
p.lineTo(10, 90);
p.closePath();
ctx.fill(p);
这种方式有两个问题:
- 路径比较复杂这样的绘制代码就会很多(不优雅)
- 不能使用现有svg path(主要问题)
解决办法
查了相关的开发文档之后决定写一个工具函数svgPathStringToCanvas来解析svg path并且生成这样的绘制命令,这样就完美解决了上面两个问题
function svgPathStringToCanvas(svgPathData) {
console.log(svgPathData);
// 使用正则表达式拆分 SVG 路径字符串
const pathParts = svgPathData
.split(/(^|\s+)(?=[A-Z])/)
.filter((part) => part !== " ");
// 存储 Canvas 绘图命令的数组
const canvasCommands = [];
// 遍历 SVG 路径的各个部分
for (const part of pathParts) {
// 将部分拆分为命令符(如 M、L、C、Q、Z)和对应的参数
const [cmd, ...rawParams] = part.split(/\s+/);
// 将参数转换为浮点数数组
const params = rawParams.map((param) => parseFloat(param));
// 根据命令符生成对应的 Canvas 绘图命令并存储到数组中
if (cmd === "M") {
canvasCommands.push((ctx) => ctx.moveTo(...params));
} else if (cmd === "L") {
canvasCommands.push((ctx) => ctx.lineTo(...params));
} else if (cmd === "C") {
canvasCommands.push((ctx) => ctx.bezierCurveTo(...params));
} else if (cmd === "Q") {
canvasCommands.push((ctx) => ctx.quadraticCurveTo(...params));
} else if (cmd === "Z") {
canvasCommands.push((ctx) => ctx.closePath());
}
}
// 返回一个函数,该函数接受 Canvas 上下文对象并执行存储的绘图命令
return (ctx) => canvasCommands.forEach((cmd) => cmd(ctx));
}
有了这个函数就可以不使用Path2D相关api了,兼容性也更好了。
使用方式
#其它代码(省略)
...
//核心代码
var canvasPathFun = svgPathStringToCanvas("M10 10 h 80 v 80 h -80 Z");
canvasPathFun(ctx)
ctx.fill()
参考文档
- https://developer.mozilla.org/zh-CN/docs/Web/API/Path2D/Path2D
- https://developers.weixin.qq.com/miniprogram/dev/api/canvas/Path2D.html
原文地址:https://www.abcddd.xyz/posts/2024/01/31/weixin-miniapp-path2d-not-support-svg-path/
微信小程序 Path2D 不支持 svg 路径的解决办法的更多相关文章
- 微信小程序 - 相对定位和绝对定位 - 相对路径和绝对路径
微信小程序 - 相对定位和绝对定位 相对定位relative,绝对定位absolute 相对定位:元素是相对自身进行定位,参照物是自己. 绝对定位:元素是相对离它最近的一个父级元素进行定位. 相对定位 ...
- 原生微信小程序脚手架(支持npm)
微信小程序支持npm 为了支持生态扩展,社区贡献者可以提供更加丰富的功能,已经支持了第三方小程序开发功能,见如下地址. 微信小程序支持npm https://developers.weixin.qq. ...
- 微信小程序分享功能的path路径
表示被微信小程序坑惨了 糟心的开始写,老板说先不上太复杂,就先显示了两个页面,然后开开心心的发布,测试了几遍,没啥问题呀.结果,一上上去,就被老板批了! 啥呀! 这分享怎么这个鬼样子!明明我看文档都是 ...
- 微信小程序--缓存,支持过期时间的二次开发封装
简介 微信小程序提供了缓存的api,包括同步和异步两种,具体api不多说明,可自行查看官方文档 现在微信小程序缓存api存在一个问题就是没有设定过期时间,下面给大家介绍一下对小程序缓存的二次封装,使其 ...
- 微信小程序请求API接口PHPSESSID变化的解决方式
微信小程序开发,请求服务器API的方法使用的是微信官方提供的wx.request()方法.在开发中发现,每一个请求都会生成一个独立的PHPSESSID,如下图示: 搜索后得知,这是由于wx.reque ...
- 微信小程序已发布版本vconsole仍出现问题解决办法
解决办法很简单,进入小程序的体验或者开发版,点击关闭调试,再次进入小程序,就不会出现了
- 微信小程序访问豆瓣api报403错误解决方法
通过豆瓣API可以获取很多电影.书籍的数据信息,今天在调用豆瓣正在上映电影接口的时候报403错误,原因是豆瓣设置了小程序的访问权限.如下: 解决方法是使用代理,将豆瓣API地址换成 https://d ...
- 微信小程序之页面跳转路径问题
错误如下: 业务需求:在movie页面点击进入detail页面. 在遍历跳转路径的时候,写绝对路径了 只需改一下就好了 教程参考地址:http://blog.csdn.net/reylen/artic ...
- 微信小程序——动态渲染页面、路径传参
1.动态渲染页面.改变css.样式必须setData渲染过去 this.setData({ userInfo: app.globalData.userInfo, token: app.glob ...
- 微信小程序开发 -- 获取当前页面路径
Page.prototype就是this: 你在任何一个Page里面都可以使用route字段和setData()函数: 示例代码: /** * 生命周期函数--监听页面加载 */ onLoad: fu ...
随机推荐
- 智慧风电:数字孪生 3D 风机智能设备运维
前言 6 月 1 日,福建省人民政府发布关于<福建省"十四五"能源发展专项规划>的通知.规划要求,加大风电建设规模.自 "30·60" 双碳目标颁布 ...
- vue权限管理
https://www.bilibili.com/video/BV1nq4y1i7BU/?spm_id_from=333.788.recommend_more_video.6&vd_sourc ...
- 人人都会Kubernetes(二):使用KRM实现快速部署服务,并且通过域名发布
1. 上节回顾 上一小节<人人都会Kubernetes(一):告别手写K8s yaml,运维效率提升500%>介绍了KRM的一些常用功能,并且使用KRM的DEMO环境,无需安装就可以很方便 ...
- java项目实战-jdbc实现-书城的增删改查-day21
目录 1. 安装mysql 安装navicate 2. jdbc实现增删改查 1. 安装mysql 安装navicate 参考网上资料 创库 创表 并放入3条测试数据 2. jdbc实现增删改查 bo ...
- 简单剖析Hashmap
剖析 Java Hashmap 源码 在 Java 的集合框架中,HashMap 是一颗璀璨的明珠.通过深入挖掘其源码,我们将揭开 HashMap 的神秘面纱,理解其底层原理.扩容机制和数据结构. 1 ...
- [转帖]wiki Rust
Rust[编辑] 维基百科,自由的百科全书 跳到导航跳到搜索 此条目介绍的是由Mozilla主导开发的编程语言.关于"rust"在英文中的本意,请见"铁锈 ...
- [转帖]linux服务之tuned
https://www.cnblogs.com/createyuan/p/5701650.html RHEL/CentOS 在 6.3 版本以后引入了一套新的系统调优工具 tuned/tuned-ad ...
- 【转帖】通过docker配置DNS服务
https://blog.whsir.com/post-3185.html 在办公室开发人员经常会测试所写的页面,每次都要输入对应的IP地址或者更改hosts,为了让开发大爷省心,不如搭建一个dn ...
- [转帖]文件系统读写性能fio测试方法及参数详解
简介 Fio 是一个 I/O 工具,用来对硬件进行压力测试和验证,磁盘IO是检查磁盘性能的重要指标,可以按照负载情况分成照顺序读写,随机读写两大类. Fio支持13种不同的I/O引擎,包括:sync, ...
- linux使用脚本给文件的最后一行不换行的方式插入一句话
处理一下 sed -i '$s/$/&,xxxx.com/' /deploy/mailfailstart