小程序版本:Image元素的加载能不能外放加载方法以适配更多平台?
业务是需要适配抖音小程序,目前遇到的问题是,new Image不会成功加载(甚至在网络控制台都看不到发起请求)。猜测是image内部使用了不兼容的请求api,例如wx.downloadFile或者wx.request。希望外放加载方法,让开发者自定义,例如tt.downloadFile,即可适配其他平台的小程序了。
查看源码,发现不是修改加载图片api这么简单。小程序的画布drawImage要求传入img/video标签或者canvas画布。抖音小程序的OffscreenCanvas没有createImage方法。我尝试修改源码中的loadImage方法,使用普通canvas来创建img,以临时测试手动返回一个canvas画布,发现在微信小程序中能正常渲染图片,在抖音小程序中,渲染出来的图片尺寸是对的,但是内容是一片黑色。唉,抖音小程序这阉割版真头疼....
loadImage(src) {
return new Promise((resolve, reject) => {
const query = uni.createSelectorQuery();
query
.select("#myCanvas")
.fields({
node: true,
},(res)=>{
var canvas = res.node;
// const img = Platform.canvas.view.createImage();
const img =canvas.createImage();
img.onload = () => {
// resolve(img); 直接返回img,渲染也是一片黑色
const offcanvas = tt.createOffscreenCanvas({type: '2d'});
offcanvas.width = img.width;
offcanvas.height = img.height;
const canvasCtx = offcanvas.getContext("2d");
canvasCtx.drawImage(img, 0, 0);
resolve(offcanvas); // 返回画布,渲染也是一片黑色,微信小程序正常。
};
img.onerror = (error) => { reject(error); };
img.src = Platform.image.getRealURL(src);
})
.exec((res) => {
});
});
},
建议用webview组件方式跨多个小程序平台开发,原生的各平台差异大,坑太多,需要花很长时间适配,还不一定能适配的好
建议用webview组件方式跨多个小程序平台开发,原生的各平台差异大,坑太多,需要花很长时间适配,还不一定能适配的好
我也想用webview啊,我都写好h5版本的业务了,后面发现抖音小程序审核时明确标明了,我们小程序所属的类目,不允许使用webview(心里再次吐槽抖音的傻逼策略)。作者大佬,还有没有别的办法可以尝试一下,比如我自己获取图片的imageData,通过putImageData的方式手动塞入数据到leafer元素?或者Canvas元素是否可以drawImage(头条的离屏canvas)
就是这种坑让人头疼,我估计是不支持绘制离屏canvas(因为你上面的那个示例变成了黑色的,说明他这块的支持就有问题)
就是这种坑让人头疼,我估计是不支持绘制离屏canvas(因为你上面的那个示例变成了黑色的,说明他这块的支持就有问题)
我尝试使用Leafer的Canvas元素来绘制图片,图片已经可以绘制出来了,但是缩放会导致图片消失。我感觉这个bug应该是leafer层面的,因为抖音和微信小程序都会出现。 代码如下:
const canvas= new Canvas({
x: 100,
y: 100,
width: 100,
height: 100,
editable: true
})
const { context } = canvas
const image = skyCanvas.createImage()
image.src = 'https://caidan-1318352346.cos.ap-guangzhou.myqcloud.com/assets/3ee5f13fb09879ecb5185e440cef6eb9.png~tplv-uwbnlip3yd-webp.jpg'
image.onload = () => {
console.log("image",image)
context?.drawImage(image,0,0)
canvas.paint()
}
this.app.tree.add(canvas)
视频: https://caidan-1318352346.cos.ap-guangzhou.myqcloud.com/assets/leafer-miniapp.mp4
查看了一下leafer的源码,基本都是使用OffscreenCanvas作为元素底层的绘制,算了,傻屌抖音小程序的太监版OffscreenCanvas,没有offCanvas.createImage()方法,也没有offCanvas.toDataURL()方法,即便渲染出来了,图片也导出不了。
看看这傻屌政策: