7***@qq.com
7***@qq.com
  • 发布:2024-08-28 16:29
  • 更新:2024-08-30 08:45
  • 阅读:97

#插件讨论# 【手写板-签名签字-lime-signature 陌上华年】在安卓app中使用时,里面的canvas加载图片问题

分类:uni-app

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

2024-08-28 16:29 负责人:无 分享
已邀请:
7***@qq.com

7***@qq.com (作者)

已找到原因,是因为页面中引入了tabs组件,lime-signature组件被安排在了tabs组件中,tab在获得焦点前里面的元素宽高都是auto,canvas的height和weight也没有得到渲染。导致canvas还没有得到渲染就执行了加载图片代码。在l-signature内的onMessage函数中添加渲染结束触发加载图片的代码,既可以将图片显示出来。

要回复问题请先登录注册