Angular Canvas 仅绘制最后一次迭代

Posted

技术标签:

【中文标题】Angular Canvas 仅绘制最后一次迭代【英文标题】:Angular Canvas only drawing last iteration 【发布时间】:2021-12-21 23:55:22 【问题描述】:

    我想用有角度的画布制作一个棋盘。但它只是绘制最后一次迭代。

    我已经尝试过 onload 功能。

    这是我的代码:

     createBoard(): void 
    
     let row = 8;
     let col = 8;
     let x = 1;
     let y = 'a';
     let posx = 0;
     let posy = 0;
     let ctx = this.canvas.nativeElement.getContext('2d');
    
       for(let i = 0; i < row; i++)
         posx = 0;
         for(let j = 0; j < col; j++) 
           let img = new Image();
    
           img.onload = function() 
             ctx.drawImage(img, posx, posy, 75, 75);
           
    
           if ((i + j) % 2 == 0)
           
             img.src = "assets/img/Boardsquare_light_normal.png";
           
           else
           
             img.src = "assets/img/Boardsquare_dark_normal.png";
           
           y = this.nextChar(y);
           posx += 75;
         
         x += 1;
         y = 'a';
         posy += 75;
       
    

【问题讨论】:

尝试使用ngOnInitViewChild('canvas',static:true) canvas:ElementRef 我已经在用了 【参考方案1】:

您需要两个图像 img1 和 img2。由于您需要在绘制之前加载两个图像,您可以使用 rxj zip 运算符和 rxjs fromEvent 运算符

fromEvent,就像

formEvent(img1,'load').subscribe(_=>
     ...
)

//its equal than
img1.onLoad=function()
 ...

Observables 的好处是你可以组合、合并、改变……(我知道一开始有点难,但是一点知识是必要的,记住在 Angular 中所有的都是 Observables)

zip,在所有 observables 发出后,将值作为数组发出。

所以你可以写一些像

zip([fromEvent(img1,'load'),fromEvent(img2,'load')]).subscribe(_=>
  for(let i = 0; i < row; i++)
    posx = 0;
    for(let j = 0; j < col; j++) 
      if ((i + j) % 2 == 0)
        ctx.drawImage(img1, posx, posy, 75, 75);
      else
        ctx.drawImage(img2, posx, posy, 75, 75);
      posx += 75;
    
    posy += 75;
  
)
img1.src='https://picsum.photos/id/100/75/75';
img2.src='https://picsum.photos/id/235/75/75'

你可以看到fool stackblitz

【讨论】:

以上是关于Angular Canvas 仅绘制最后一次迭代的主要内容,如果未能解决你的问题,请参考以下文章

jQuery-UI 对话框仅显示 for 循环的最后一次迭代 [重复]

使用@font-face 将文本绘制到 <canvas> 第一次不起作用

在 Angular.js 上的 HTML5 Canvas 中的背景图像上绘制一个矩形

jQuery-UI对话框仅显示for循环的最后一次迭代[duplicate]

Canvas之绘制基本形状

Canvas之绘制基本形状