Canvas中的Context.clearRect不起作用

时间:2018-03-25 10:35:05

标签: javascript html5 canvas html5-canvas drawimage

如果我得到一张照片并希望将其画到右侧,那就可以了。但是当我添加clearRect()时,图片就会消失。如何使用正确的方法使用类似的代码,以便clearRect()起作用?

这是我的代码:

<html>
<head>
<style>
#canvas_id{
border:1px solid red;
 }
 </style>
 </head>
<body>

<canvas id="canvas_id"></canvas>
<script>
var canvas = document.getElementById( "canvas_id" );
var Context = canvas.getContext( "2d" );
var x1 = 10;
var x2 = 10;

var img = new Image();
img.src = "example.jpg";
img.onload = function(){ Context.drawImage( img, x1, x2,20,20); }

draw();

function draw(){
  window.requestAnimationFrame(draw);

 Context.clearRect(0,0,innerWidth,innerHeight);

 var Img = new Image();
 Img.src = "example.jpg";
 Img.onload = function(){ Context.drawImage( Img, x1, x2,20,20); }


 x1 = x1 +1;


}
</script>
</body>

如果我使用fillRect()而不是图像的矩形,则代码可以正常工作。

1 个答案:

答案 0 :(得分:0)

仅加载一次图像。

  • 即使在缓存时,加载图像也始终是异步的。
  • requestAnimationFrame回调将在之前调用下一个要绘制的画布。

以下是代码中发生的事情的示意图:

clearRect start_to_load_Img || ... img.loaded=>drawImage ... clearRect start_to_load_Img || etc.
                            ^                                                            ^
               render new frame to screen                                    render new frame to screen

正如您所看到的,每次图像加载在两帧之间时。但是在下一帧被传递到屏幕之前,你就可以清除它了。

所以固定代码看起来像

// load your image only once
var img = new Image();
img.src = "example.jpg";

draw();

function draw(){
  window.requestAnimationFrame(draw);

  Context.clearRect(0,0,innerWidth,innerHeight);
  if(img.naturalWidth) { // check it has loaded
    Context.drawImage(img, x1, x2,20,20);
  }
 ...