安卓 canvas组件draw函数的回调不执行

安卓 canvas组件draw函数的回调不执行

canvas遮挡了底部按钮,canvas在组件的组件内,按钮在页面

方法一:
cover-view包裹页面按钮,ios没问题,安卓还是被canvas遮挡;又把按钮放到组件内,嵌套在canvas内还是被遮挡;

方法二:
2、canvas转图片,ios没问题,安卓draw()的回调不执行,下面的代码只能打印到‘开始画’,然后就是fail了。

很多人碰到canvas的draw()回调不执行的问题

setTimeout(() => {
  console.log('开始画');
  ctx.draw(true, () => {
    console.log('开始转换');
    wx.canvasToTempFilePath({
      x: 0,
      y: 0,
      width: 690,
      height: 552,
      canvasId: canvasId,
      success: res => {
        console.log('success', res.tempFilePath)
      },
      fail: err => {
       // eslint-disable-next-line
       console.log('fail', err, err.stack);
      }
    }, this);
  });
}, 4000);

解决方案:

  • canvas放在组件内 draw() 回调不执行,放在 page内可以执行
  • 出现这个问题,放在page里draw回调可以执行,放在组件里就不行

转载来自微信开放社区

Canvas 第二次draw回调失效,图片不显示

想要多次保存文件,但是图不是相同的,实际场景是要画3张不同的图,实际场景是根据接口返回的数据 canvas生成三张不同样式的名片 用户选择喜欢的样式保存图片到相册。

ctx.draw(false, () => {
  drawed.call(this);
});

ctx.draw(true, () => {
  drawed.call(this);
});

画图的API用起来感觉一次操作没完的时候,进行第二次操作有会问题。之前我碰见的是 canvas 转数组的API,不能连续调用。。也是必须一次转换完成之后,才能进行第二次。如果有必要的话,你也可以考虑用多个canvas试试,看能不能同时进行

解决方案:

  • 递归


const app = getApp()

Page({
    data: {
        imgList:[]
    },
    onReady: function() {
        this.ctx = wx.createCanvasContext("canvas")
        this.list = ["red","yellow","blue"]
        this.index = 0
        this.drawFn()
    },
    drawFn: function(){
        if(this.index{
                wx.canvasToTempFilePath({
                    canvasId: 'canvas',
                    success:res=>{
                        console.log(res)
                        this.data.imgList.push(res.tempFilePath)
                        this.setData({
                            imgList: this.data.imgList
                        })
                        this.index++
                        this.drawFn()
                    }
                }, this)
            })
        }
    }
})

转载自 微信开放社区

画布canvas.draw方法callback真机下不执行的问题解决

CanvasContext.draw(boolean reserve, function callback) 一些场景中部分真机 callback 回调未触发的问题分析与解决

ctx.setFillStyle('#F83');
ctx.fillRect(0, 0, 400, 800);
ctx.draw(true,()=>{//第一次调用draw方法
  if (hasImage) {
    wx.chooseImage({
      count: 1,
      sizeType: ['original', 'compressed'],
      sourceType: ['album', 'camera'],
      success (res) {
        const tempFilePaths = res.tempFilePaths
        ctx.drawImage(tempFilePaths[0], 10, 10, 300, 300); //做了一个画图动作
        ctx.draw(true, drawAfterToTempFile); //第二次调用draw方法,真机下drawAfterToTempFile方法会被执行
        }
      })
  } else { //完成最后绘制
    //部分真机下drawAfterToTempFile回调不会被执行
    ctx.draw(true, drawAfterToTempFile);//第二次调用draw方法
    //猜测由于第二次调用draw方法与第一次调用之间画布没有任何其它动作,所以第二次draw方法并没有实际执行到触发callback回调的地方,导致callback看似失效。

    //修改方法一:在第二次调用draw方法之前执行一些动作,例如:ctx.moveTo(0,0);ctx.fill();
    //修改方法二:既然第二次调用draw方法没有任何绘制动作,那就直接调用执行drawAfterToTempFile()就行了,没必要包一个draw方法。
  }
});
var drawAfterToTempFile = function() {
  wx.canvasToTempFilePath({
    canvasId: "myCanvasId",
    success(res) {
      console.log('绘制图片存为临时文件:', res.tempFilePath)
    },
    fail(err) {
      console.log('绘制图片存为临时文件失败:', err);
    }
  }, _this)
}

转载自微信开放社区

最终解决问题的是,最后的这个方法,使canvasContext发生需要draw的变更。特此记录

2019-08-23

于上海

你可能感兴趣的:(安卓 canvas组件draw函数的回调不执行)