uniapp在安卓app开发中,使用了lime-signature签名插件,查看源码发现这个插件中的canvas是通过在renderjs中执行this.canvas = document.createElement('canvas')创建的。
我现在希望在页面加载时,这个组件能够加载我之前保存下来的签名,也就是canvas加载图片。尝试了多次,每次canvas显示都是空白,以下是我的操作:
在renderjs的init方法中补充:
this.canvas.className = 'canvasClass';
this.canvas.setAttribute('canvas-id', 'myCanvas');
在lime-signature插件的l-signature.vue文件中mouted()中添加代码:this.$emit('render-complete');在签名组件加载完成时触发父组件方法onRenderComplete:
onRenderComplete(){
const query = uni.createSelectorQuery().in(this); // 使用 this 指向当前 Page
query.select('.canvasClass').fields({node: true, size: true}, async (res) => {
const canvasWidth = res.width;
const canvasHeight = res.height;
await this.onSignatureRenderRnd('_doc/1.png',canvasWidth,canvasHeight);
}).exec();
},
//将签字内容显示到canvas上
async onSignatureRenderRnd(url,canvasWidth,canvasHeight) {
let that = this;
// 确认图片已成功保存
uni.getImageInfo({
src: url,
success: (imageInfoRes) => {
const scale = Math.min(canvasWidth / imageInfoRes.width, canvasHeight / imageInfoRes.height);
// 计算缩放后的图片尺寸
const scaledWidth = imageInfoRes.width * scale;
const scaledHeight = imageInfoRes.height * scale;
console.log('图片已加载成功,宽度:', imageInfoRes.width, '高度:', imageInfoRes.height);
const canvas = uni.createCanvasContext('myCanvas', that);
console.log('canvas',canvas);
// 绘制图片到 Canvas
try {
canvas.drawImage(url, 0, 0, scaledWidth, scaledHeight, () => {
console.log('图片绘制成功');
}, (error) => {
console.error('图片绘制失败:', error);
});
} catch (e) {
console.error('canvas.drawImage 异常:', e);
}
},
fail: (err) => {
console.error('getImageInfo failed:', err);
},
});
},
我在手机上放入已有的一张全黑图片1.png,执行uni.getImageInfo可以获得图片的宽高,相信图片已经加载,但执行canvas.drawImage方法即不会报错,也不会提示绘制成功,而canvas一直是空白状态。
不明白究竟是哪里出了差错?
注:我的Hbuilder是4.24版本,UI框架式uview是1.8.3版本,lime-signature的版本是1.4.6
1 个回复
7***@qq.com (作者)
已找到原因,是因为页面中引入了tabs组件,lime-signature组件被安排在了tabs组件中,tab在获得焦点前里面的元素宽高都是auto,canvas的height和weight也没有得到渲染。导致canvas还没有得到渲染就执行了加载图片代码。在l-signature内的onMessage函数中添加渲染结束触发加载图片的代码,既可以将图片显示出来。