news 2026/10/29 2:13:12

微信小程序案例 《4.10 canvas 画布组件》

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
微信小程序案例 《4.10 canvas 画布组件》

案例需求

  1. 页面展示type="2d"新版 canvas 画布,蓝色背景;手指在画布滑动可以自由绘制线条。
  2. bindtouchstart手指按下,设置绘图起点;bindtouchmove手指移动持续画线。 3.【清空画布】按钮,调用clearRect清除画布全部绘制内容。
  3. ✨作业扩展:增加【改变画笔线条颜色】按钮,点击在红色、绿色之间切换画笔颜色。

完整代码

1.app.json

2.pages/index/index.wxml

3.pages/index/index.wxss

4.pages/index/index.js(含作业扩展切换画笔颜色,增加空判断防报错)

5.app.wxss 全局样式

核心知识点

1.canvas‑2d 组件常用属性

属性说明
type="2d"新版 2D 画布,必须配置;不带 type 的旧版 canvas 已经废弃
id供createSelectorQuery获取 canvas 节点,id 内横线必须是英文半角-
bindtouchstart手指按下触摸事件,绘图起点
bindtouchmove手指在画布上移动,持续绘制线条

2. 绘图上下文 API

  1. getContext('2d'):获取 2D 绘图上下文 ctx,所有绘图操作由 ctx 完成。
  2. dpr 设备像素比适配:canvas 实际像素 = css 尺寸 × dpr;执行ctx.scale(dpr,dpr)缩放坐标系,解决线条模糊锯齿。
  3. moveTo(x,y):抬起画笔,移动到起点坐标。
  4. lineTo(x,y):定义直线路径到目标坐标。
  5. stroke():执行描边,真正把线条绘制到画布。
  6. strokeStyle:画笔线条颜色。
  7. lineWidth:画笔粗细。
  8. lineCap:"round"线条端点圆角;lineJoin:"round"线条拐角圆角。
  9. beginPath():开启一条全新路径。
  10. clearRect(x,y,w,h):清空指定矩形画布区域。

3.touches 触摸对象

e.touches[0]获取第一个触摸点;.x、.y坐标是相对于 canvas 画布左上角。

4. 作业扩展逻辑

data 中定义strokeColor变量保存当前画笔颜色;点击按钮在红色#ff0000、绿色#00ff00来回切换;每次绘图读取 data 里面保存的颜色。

踩坑实录

坑 1:报错Cannot read property 'node' of null

90% 原因:复制代码带入中文全角横线,canvas 的 id 和 js 选择器不匹配。

  1. wxml 中id="my‑canvas"如果是中文长横线,js#my‑canvas选择器找不到节点;
  2. 解决方案:全部替换为英文半角id="my‑canvas";
  3. 增加防御判断,res [0] 不存在直接 return,避免程序崩溃。

坑 2:画布线条模糊,锯齿严重

忘记 dpr 像素适配;onReady 回调内部必须乘pixelRatio,并且执行ctx.scale(dpr,dpr)。

坑 3:画不出线条

  1. 忘记写stroke();lineTo只是定义路径,stroke()才真正绘制;
  2. 获取 canvas 节点时机:必须放在onReady的 exec 回调里面;onLoad 阶段 DOM 还未渲染完成拿不到节点;
  3. 复制代码带入中文全角符号,wxml/wxss 报unexpected character。

坑 4:切换颜色,旧线条跟着变色

canvas 绘制完成的像素是静态;strokeStyle仅控制后续新画的笔迹,旧笔迹不会变化,属于正常现象。

坑 5:清空画布后继续绘画有尾巴残留

clear()内部调用ctx.beginPath(),清空画布同时重置绘制路径。

坑 6:不要使用旧版 canvas 组件

本案例统一用type="2d"新版 canvas;不带 type 属性的旧 canvas 组件官方已经废弃。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/29 2:12:55

Codex 插件打包前漏了什么?用目录树检查 Skill、MCP 和最小测试

Codex 插件打包前漏了什么?用目录树检查 Skill、MCP 和最小测试 插件在本机能跑、装到别处却找不到 Skill,通常不是模型问题,而是包内路径或声明不一致。发布前用目录树检查,可以先发现最便宜的错误;以下是本地文件检查,不涉及上传或安装。 先核对三份声明是否能互相指…

作者头像 李华
网站建设 2026/10/29 2:12:24

一个 CDN 触发的数据出境:后端组件排查手册

有个做跨境独立站的团队被问了一个问题:“你们有没有数据出境?” 技术负责人很确定:没有,服务器全在境内。 但把域名解析记录、客户端上报日志、第三方脚本清单摆出来之后,结论反转了:站点引用了境外 CDN、…

作者头像 李华
网站建设 2026/10/29 2:12:04

移动网络与卫星互联网终端模组的AT指令备忘

2026年10月开发中使用鼎桥通信的5G模组MT5710上网,回忆到2025年10月应用睿普康集成电路的801天通模组https://www.rpcom-micro.com/product/satellite_chip/17.html实现两台终端间拨号以通话形式传输数据。好奇所用到的各自手册中定义的一些AT指令,通话与…

作者头像 李华
网站建设 2026/10/29 2:11:52

职业倦怠不是懒惰,是长期透支发出的信号

职业倦怠不是懒惰,是长期透支发出的信号 越来越多上班族在工作一段时间后,会出现这样的状态:早晨起床想到上班就提不起劲,工作越来越应付,曾经能带来成就感的事情变得索然无味,身体也频繁出现疲惫、失眠、头…

作者头像 李华
网站建设 2026/10/29 2:11:25

局域网网页控灯验收:ESP-IDF v6.1 用 STA IP 开灯 / 关灯

文章目录局域网网页控灯验收:ESP-IDF v6.1 用 STA IP 开灯 / 关灯一、前置准备二、验收目标三、业务链路与两种网络模式3.1 请求链路(记这一句)3.2 SoftAP 与 STA:用途不同四、分步实操4.1 拿到 STA 局域网 IP4.2 手机回到家里主 …

作者头像 李华