微信小程序canvas实战,从入门到绘制精美图表
发布时间:11-07来源:微信小程序工具|微信小程序开发|微信小程序制作平台-龙图应用【XcxIP.com】
先泼盆冷水。市面上讲小程序canvas的文章,十篇里有八篇是拿官方文档抄一遍,剩下两篇教你画个彩虹圈就敢叫“实战”。但真正做业务的人清楚,从“能画”到“画得好看”,中间隔着一整条鸿沟——坐标计算、像素比适配、动效性能,哪个坑都能让你加班到凌晨。这篇不整虚的,直接按项目里踩过的坑来,把基础API过一遍,再给几个能直接抄进代码里的美化技巧。

先解决最基础的:canvas在小程序里不是你想画就能画。得先在wxml里放个标签,注意type属性必须写,不然你拿不到node节点。很多新手卡在这一步,是因为旧版接口还能用,但官方早就标记废弃了。也别偷懒用旧接口,新项目用了会被审核打回。拿到节点后,才返回正经的绘图上下文。这里有个隐藏坑:canvas的宽高不能直接写在wxml的style里,必须通过和来设,否则画出来的图会糊成一团。
接下来是像素比适配,这步不做,你画的线全是虚的。手机屏幕的devicePixelRatio通常是2或3,但canvas默认按1:1渲染,等于把一张高清图压缩显示,边缘自然发虚。解决办法很简单:先拿到,然后,再通过把坐标系缩放回来。这样画出来的线条锐利得像刀切过。顺带说一句,做图表库别用绝对像素值,全部基于宽度比例计算,不然换个屏幕尺寸直接崩。
基础绘制搞定了,聊聊怎么让图表有“高级感”。很多人画折线图,直接用加连起来,结果出来的是锯齿感十足的折线。正确的姿势是用做平滑曲线,但控制点别自己瞎算——用猫儿缨算法(Catmull-Rom)转换,网上有现成公式,抄过来就行。还有颜色填充,别用纯色,渐变才是提升质感的关键。创建渐变对象,从数据点颜色过渡到透明,视觉上立刻立体起来。柱状图的圆角也别忽略,虽然在小程序里直接可用,但老版本基础库不支持,做个兼容判断,不行就自己画四个圆弧。
说到动效,这里有个性能陷阱。小程序canvas的动画不能靠硬扛,因为每帧都要通过触发,而且频繁重绘整张画布会卡成PPT。聪明的做法是把静态部分(比如坐标轴、网格线)画在一个离屏canvas上,动态部分(比如数据点移动)单独画一层,再用把静态层贴过来。这样每帧只需重绘动态层,性能直接翻倍。另外,动画曲线别用线性匀速,太死板,用这类缓动函数,视觉上舒服得多。
图表交互这块,很多人忽略。小程序canvas默认不支持点击事件,但你可以监听canvas的,然后通过拿到canvas的边界坐标,换算成画布坐标,再判断是否落在某个数据点附近。这里有个细节:换算时要减去的left和top,还要除以pixelRatio,不然点击位置永远对不上。做tooltip提示框时,别直接在canvas上画,因为重绘成本高。用一个覆盖在canvas上的组件来显示信息,位置通过绝对定位控制,性能好,样式也好调。
说说封装。别把绘制逻辑全堆在页面里,不然改个颜色得翻几百行代码。建议建一个,对外暴露方法,内部处理像素比、坐标系、绘制流程。数据更新时,调用,内部只重绘变化的部分。这套思路是从ECharts学来的,但小程序里不能用DOM,所以得自己实现一套精简版。做到这步,基本能应对产品经理80%的图表需求——折线图、柱状图、饼图,改改配置项就能出图。
说回开头那句话,canvas实战真不是看文档就能会的。从像素比适配到离屏渲染,每个坑都是拿加班费换来的经验。你把这套流程走一遍,再回头看当初觉得牛逼的彩虹圈,会发现那只是起点。图表好不好看,拼的不是API熟练度,而是你对坐标、颜色、动效这些底层细节的敏感度。下次产品再丢给你一个“要好看”的需求,别慌,先画个坐标系,再想怎么让人眼前一亮。
