在Uniapp中使用Canvas绘制多个圆形图片时,第二个图片不显示通常由以下原因导致:
1. Canvas上下文未正确复用
确保使用同一个Canvas上下文(ctx)绘制所有内容。每次调用uni.createCanvasContext时若使用不同ID,会导致绘制覆盖。
错误示例:
const ctx1 = uni.createCanvasContext('canvasId');
const ctx2 = uni.createCanvasContext('canvasId'); // 错误:创建了新上下文
正确做法:
const ctx = uni.createCanvasContext('canvasId');
// 绘制第一个圆形图片
ctx.drawImage(imagePath1, x1, y1, width1, height1);
ctx.save();
ctx.beginPath();
ctx.arc(x1 + radius1, y1 + radius1, radius1, 0, 2 * Math.PI);
ctx.clip();
ctx.drawImage(imagePath1, x1, y1, width1, height1);
ctx.restore();
// 绘制第二个圆形图片
ctx.drawImage(imagePath2, x2, y2, width2, height2);
ctx.save();
ctx.beginPath();
ctx.arc(x2 + radius2, y2 + radius2, radius2, 0, 2 * Math.PI);
ctx.clip();
ctx.drawImage(imagePath2, x2, y2, width2, height2);
ctx.restore();
ctx.draw(); // 统一绘制
2. 未正确恢复绘图状态
使用ctx.save()和ctx.restore()确保裁剪区域不影响后续绘制。每次裁剪后需恢复上下文状态。
3. 图片路径或加载问题
- 确保图片路径正确,支持本地路径(如/static/image.png)或网络路径。
- 网络图片需等加载完成后再绘制(可用uni.getImageInfo预加载)。
预加载示例:
uni.getImageInfo({
  src: 'https://example.com/image2.png',
  success: (res) => {
    // 在成功回调中绘制第二个图片
    ctx.drawImage(res.path, x2, y2, width2, height2);
    // ... 裁剪和绘制圆形
    ctx.draw();
  }
});
4. 坐标或尺寸超出Canvas范围
检查第二个图片的坐标和尺寸是否在Canvas画布范围内。
5. 未调用ctx.draw()
确保所有绘制操作后调用ctx.draw(),且仅调用一次。
完整示例代码:
const ctx = uni.createCanvasContext('myCanvas');
const radius = 50;
// 绘制第一个圆形图片
ctx.save();
ctx.beginPath();
ctx.arc(60, 60, radius, 0, 2 * Math.PI);
ctx.clip();
ctx.drawImage('/static/image1.png', 10, 10, 100, 100);
ctx.restore();
// 绘制第二个圆形图片
ctx.save();
ctx.beginPath();
ctx.arc(180, 60, radius, 0, 2 * Math.PI);
ctx.clip();
ctx.drawImage('/static/image2.png', 130, 10, 100, 100);
ctx.restore();
ctx.draw();
解决步骤:
- 检查是否使用同一上下文。
- 确认图片路径有效且已加载。
- 验证坐标和尺寸未超出画布。
- 使用save()和restore()管理状态。
- 确保调用ctx.draw()。
若问题持续,请提供相关代码片段以便进一步排查。