问题

开发一个微信小程序项目的时候需要用到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://www.abcddd.xyz/posts/2024/01/31/weixin-miniapp-path2d-not-support-svg-path/

微信小程序 Path2D 不支持 svg 路径的解决办法的更多相关文章

  1. 微信小程序 - 相对定位和绝对定位 - 相对路径和绝对路径

    微信小程序 - 相对定位和绝对定位 相对定位relative,绝对定位absolute 相对定位:元素是相对自身进行定位,参照物是自己. 绝对定位:元素是相对离它最近的一个父级元素进行定位. 相对定位 ...

  2. 原生微信小程序脚手架(支持npm)

    微信小程序支持npm 为了支持生态扩展,社区贡献者可以提供更加丰富的功能,已经支持了第三方小程序开发功能,见如下地址. 微信小程序支持npm https://developers.weixin.qq. ...

  3. 微信小程序分享功能的path路径

    表示被微信小程序坑惨了 糟心的开始写,老板说先不上太复杂,就先显示了两个页面,然后开开心心的发布,测试了几遍,没啥问题呀.结果,一上上去,就被老板批了! 啥呀! 这分享怎么这个鬼样子!明明我看文档都是 ...

  4. 微信小程序--缓存,支持过期时间的二次开发封装

    简介 微信小程序提供了缓存的api,包括同步和异步两种,具体api不多说明,可自行查看官方文档 现在微信小程序缓存api存在一个问题就是没有设定过期时间,下面给大家介绍一下对小程序缓存的二次封装,使其 ...

  5. 微信小程序请求API接口PHPSESSID变化的解决方式

    微信小程序开发,请求服务器API的方法使用的是微信官方提供的wx.request()方法.在开发中发现,每一个请求都会生成一个独立的PHPSESSID,如下图示: 搜索后得知,这是由于wx.reque ...

  6. 微信小程序已发布版本vconsole仍出现问题解决办法

    解决办法很简单,进入小程序的体验或者开发版,点击关闭调试,再次进入小程序,就不会出现了

  7. 微信小程序访问豆瓣api报403错误解决方法

    通过豆瓣API可以获取很多电影.书籍的数据信息,今天在调用豆瓣正在上映电影接口的时候报403错误,原因是豆瓣设置了小程序的访问权限.如下: 解决方法是使用代理,将豆瓣API地址换成 https://d ...

  8. 微信小程序之页面跳转路径问题

    错误如下: 业务需求:在movie页面点击进入detail页面. 在遍历跳转路径的时候,写绝对路径了 只需改一下就好了 教程参考地址:http://blog.csdn.net/reylen/artic ...

  9. 微信小程序——动态渲染页面、路径传参

      1.动态渲染页面.改变css.样式必须setData渲染过去   this.setData({ userInfo: app.globalData.userInfo, token: app.glob ...

  10. 微信小程序开发 -- 获取当前页面路径

    Page.prototype就是this: 你在任何一个Page里面都可以使用route字段和setData()函数: 示例代码: /** * 生命周期函数--监听页面加载 */ onLoad: fu ...

随机推荐

  1. FZU 2232

    ***题意:求最大匹配是否为n 今天突然想起来吧模板改一下,然而自己得想法不对,WA了有十多次吧,看了一下题解,不需要改,套上模板就行*** #include<stdio.h> #incl ...

  2. Visual Studio Code如何校验yaml格式文件

    1.yaml格式校验快捷键:Shift+Alt+F默认没有安装,这时候点击安装: 2.选择YAML Language Support by Red Hat   3.安装完成后,自动开启校验,当格式错误 ...

  3. 概率图模型 · 蒙特卡洛采样 · MCMC | 非常好的教学视频

    https://www.bilibili.com/video/BV17D4y1o7J2?p=1 非常感谢!感觉学会一点了,应该能写作业了

  4. mybatis plus 中增删改查及Wrapper的使用

    本文为博主原创,未经允许不得转载: mybatis plus 通过封装  baseMapper 以及 ServiceImpl ,实现对数据库的增删改查操作,baseMapper 是我们通常所说的 da ...

  5. Hive(3)-Hive数据类型

    1. 基本数据类型 对于Hive的String类型相当于数据库的varchar类型,该类型是一个可变的字符串,不过它不能声明其中最多能存储多少个字符,理论上它可以存储2GB的字符数 Hive数据类型 ...

  6. 【转帖】QUIC协议简史

    QUIC简史 QUIC(Quick UDP Internet Connection)是谷歌推出的一套基于UDP的传输协议,它实现了TCP + HTTPS + HTTP/2的功能,目的是保证可靠性的同时 ...

  7. 【转帖】bpftrace 指南

    文章目录 0. bpftrace 0.1 bpftrace组件 0.2 bpftrace 帮助信息 0.3 bpftrace 工具速览表 0.4 bpftrace 探针 0.4.1 tracepoin ...

  8. [转帖]超能课堂(323) 为什么WiFi实际速率只有标称速率的一半?

    超能课堂(323) 为什么WiFi实际速率只有标称速率的一半? 开始的地方 协议速率与实际速率有何不同? 什么是"全双工"与"半双工"? 无线网络与有线网络的抗 ...

  9. [转帖]文件系统读写性能fio测试方法及参数详解

    简介 Fio 是一个 I/O 工具,用来对硬件进行压力测试和验证,磁盘IO是检查磁盘性能的重要指标,可以按照负载情况分成照顺序读写,随机读写两大类. Fio支持13种不同的I/O引擎,包括:sync, ...

  10. [转帖]「更易用的OceanBase」|OceanBase 4.0 一体化安装包 - 把简单留给用户

    https://www.modb.pro/db/565842 1. OceanBase 3.x 版本安装浅谈 我是在 OceanBase 3.1.4 版本的时候开始尝试入手测试的.刚开始 OB 3.x ...