微信小程序 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 ...
随机推荐
- 使用aop去自定义注解,实现用户在请求的时候记录下来,如日志功能等
首先搞清楚aop的几个概念: AOP即是面向切面,是Spring的核心功能之一,主要的目的即是针对业务处理过程中的横向拓展,以达到低耦合的效果. 「切面(Aspect)」:一个关注点的模块化.以注解@ ...
- jdk(jvm)调式工具
JConsole 可视化工具介绍一. JConsole介绍1.1 JConsole描述Jconsole (Java Monitoring and Management Console),一种基于JMX ...
- 五、java操作redis
系列导航 一.redis单例安装(linux) 二.redis主从环境搭建 三.redis集群搭建 四.redis增加密码验证 五.java操作redis --demo主方法 package com. ...
- Xmanager连接linux服务器的桌面
在办公室使用xshell通过22端口访问linux服务器大家都很熟悉,但有的时候在办公室要远程linux服务器上的桌面应用,该如何实现. 环境准备 客户端:win10 服务器:centos7.9 一. ...
- 4 Englishi 词根
11 -ism N词后缀 ...主义: 流派: 特性 individualism captitalism modernism humanism 12 -ist N词后缀 人: ...家 art ...
- treeselect 表单验证解决方法
https://www.cnblogs.com/wxqworld/p/11203603.html
- linux tcpdump 使用小结(一)
转载请注明出处: 很多情况在服务联调和定位过程中,需要在服务器上进行抓包进行问题定位.在Linux环境上使用tcpdump命令进行抓包: 1.tcpdump -s 0 -l -i any -w - p ...
- [转帖]Sqlserver数据库中char、varchar、nchar、nvarchar的区别及查询表结构
https://www.cnblogs.com/liuqifeng/p/10405121.html varchar 和 nvarchar区别: varchar(n)长度为 n 个字节的可变长度且非 U ...
- Oracle 专用模式与共享模式的学习与思考
Oracle 专用模式与共享模式的学习与思考 说明 Oracle数据库中的专用模式和共享模式是两种不同的数据库运行模式,它们在应用场景和权限管理上有所不同. 专用模式(Dedicated Mode): ...
- [转帖]事务上的等待事件 —— enq: TM - contention
执行DML期间,为防止对与DML相关的对象进行修改,执行DML的进程必须对该表获得TM锁.若在获得TM锁的过程中发生争用,则等待enq: HW - contention 事件. SQL> sel ...