Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用于Javascript上动画的cancelAnimationFrame_Javascript_Animation_Html5 Canvas - Fatal编程技术网

用于Javascript上动画的cancelAnimationFrame

用于Javascript上动画的cancelAnimationFrame,javascript,animation,html5-canvas,Javascript,Animation,Html5 Canvas,您好,我正在尝试创建一个矩形,它从画布的侧面开始生长,直到填满整个画布,一旦完成,它会收缩回原始状态,我采用的方法是使用requestAnimationFrame/cancelAnimationFrame,出于某种原因,我不确定cancelAnimationFrame是否正常。我的代码如下: <script> function grRectangle(){ var canvas = document.getElementById("pa

您好,我正在尝试创建一个矩形,它从画布的侧面开始生长,直到填满整个画布,一旦完成,它会收缩回原始状态,我采用的方法是使用requestAnimationFrame/cancelAnimationFrame,出于某种原因,我不确定cancelAnimationFrame是否正常。我的代码如下:

<script>

  function grRectangle(){

                    var canvas = document.getElementById("paper");
                    var context= canvas.getContext("2d");
                    //var forpi = Math.PI * 2;

                  //context.fillStyle = "black";
                  context.fillRect(0,0,canvas.width,canvas.height);
                  var posX = 200;
                  var posY = 100;
                  var color = 0;

                  function draw(){

                  context.fillStyle = 'hsl('+  color++ + ',100%,50%)';
                  context.beginPath();
                  context.rect(0,0,posX,posY);
                  context.fill();

                  posX = posX +  0.9;
                  posY = posY + 0.9;
                  if(posX < canvas.width ){

                   requestAnimationFrame(draw);
                  }  if (posX >= canvas.width){
                     posX = posX -  0.9;
                   posY = posY - 0.9;
                    cancelAnimationFrame(draw);

                  }     


    }

  draw();

  };


</script>

<body  onload= "grRectangle();" >
  <h1>Growing Rectangle</h1>
  <canvas id = "paper" width="800" height="600">


  </canvas>

非常感谢您的任何帮助

在我看来,您编写的代码实际上并不需要取消动画帧。我不确定你认为它确切的作用是什么,但似乎你误解了它

cancelAnimationFrame方法用于防止执行之前对requestAnimationFrame的调用,前提是该调用尚未执行。很少有情况下你需要这样做

在你的例子中,我将把每帧的增长常数0.9放入一个变量中。当矩形大小达到上限时,只需将其更改为-0.9,它就会再次变小。当它达到下限时,再次将其更改为0.9,它将再次增长


但是,您不会看到这种收缩,因为您没有擦除画布。每一帧都是在前一帧之上绘制的。必须在绘图循环开始时擦除画布。要做到这一点,请将用黑色矩形填充画布的代码移动到绘图循环中,记住将填充样式设置为黑色。

您描述了代码应该执行的操作,但忘记了描述实际行为:它正在执行什么操作?