详解通过HTML5 Canvas实现图片的平移及旋转变化的方法

2020-04-21 23:03:40易采站长站整理

        context.fillRect(0,0,800,600);   
  
        context.fillStyle = "#00AAAA";   
        context.fillRect(100,100,200,100);   
  
        context.fillStyle = "red";   
        context.translate(100,100);   
        context.fillRect(100,100,200,100);   
  
        context.fillStyle = "green";   
        context.translate(200,200);   
        context.fillRect(100,100,200,100);   
  
    };   
</script>   
</body>   
</html>  

运行结果:
2016322113015232.jpg (850×500)

这里的绿色矩形并没有如我们所愿在(300,300)位置处,而是跑到了(400,400)这里。为什么呢?想必大家已经知道了答案——Canvas是基于状态的绘制。在我们第一次平移之后,坐标系已经在(100,100)处了,所以如果继续平移,这个再基于新坐标系继续平移坐标系。那么要怎么去解决呢?很简单,有两个方法。

第一,在每次使用完变换之后,记得将坐标系平移回原点,即调用translate(-x,-y)。

第二,在每次平移之前使用context.save(),在每次绘制之后,使用context.restore()。

切记,千万不要再想着我继续紧接着第一次平移之后再平移translate(100,100)不就行了,这样你自己的坐标系就会乱套,根本找不到自己的坐标系原点在哪,在多次变换或者封装函数之后,会坑死你。所以一定要以最初状态为最根本的参照物,这是原则性问题。这里我建议使用第二种方法,而且在涉及所有图形变换的时候,都要这么处理,不仅仅是平移变换。

具体使用如下。

JavaScript Code复制内容到剪贴板

<!DOCTYPE html>   
<html lang="zh">   
<head>   
    <meta charset="UTF-8">   
    <title>平移变换</title>   
    <style>   
        body { background: url("./images/bg3.jpg") repeat; }  
        #canvas { border: 1px solid #aaaaaa; display: block; margin: 50px auto; }