canvas translate()方法实例及效果

canvas中很多的变换效果常用的就是translate()、rotate()和scale()
今天就来说一下translate()
translate(x,y)方法重新映射画布上的 (0,0) 位置。也就是画布的平移
参数:x:X轴的偏移量
y:Y轴的偏移量
因为位置的平移是针对画布的,所以一般,我们绘制的图形都会受到平移的影响

特别注意:clearRect()也会受到平移的影响,所有在使用平移方法之后,如果要用clearRect一定要计算清楚

说了这么多,还是看写个例子吧

<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title>平移变换</title>
    <style>
        canvas{
            border: 1px solid #000;
        }
    </style>
</head>
<body>
    <canvas width="800" height="600"></canvas>
    <script>
        var canvas=document.querySelector('canvas');
        var ctx=canvas.getContext('2d');
        ctx.translate(50,50);
        ctx.strokeRect(0,0,300,200);
        ctx.strokeStyle='red';
        ctx.strokeRect(0,0,400,300);
    </script>
</body>
</html>

实例显示效果:
这里写图片描述

我们看到一个什么情况呢?就是两个矩形坐标设置的初始坐标轴都是(0,0)但是我们看到,内部的这两个矩形都没有从初始值开始,就是因为我们使用了translate(50,50);重新应设置canvas画布的位置,所有就看到两个矩形的初始点就向右向下平移了50px;
上面写道,因为位置的平移是针对画布的,所以一般,我们绘制的图形都会受到平移的影响

那具体代码怎么写呢?看看下面的代码吧

<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title>平移变换</title>
    <style>
        canvas{
            border: 1px solid #000;
        }
    </style>
</head>
<body>
    <canvas width="800" height="600"></canvas>
    <script>
        var canvas=document.querySelector('canvas');
        var ctx=canvas.getContext('2d');
        ctx.save();//保存了初始的状态
        ctx.translate(50,50);
        ctx.strokeRect(0,0,300,200);
        ctx.restore();//恢复初始的状态
        ctx.strokeStyle='red';
        ctx.strokeRect(0,0,400,300);
    </script>
</body>
</html>

实例显示效果:
这里写图片描述

我们看到这个红色的矩形恢复了原始的状态,起始点从(0,0)开始画了一个宽为400,长为300的矩形,就是因为我们用了save()和restore()方法

那么如果我们不想要图片受到translate方法的影响,那么我们就可以用到canvas save()和restore()保存和恢复来实现

下面我们在来看一个例子,我们上面说因为translate()平移是针对的画布,所以在使用clearRect也会受到平移的影响,而且一定要计算清楚,那么如何计算,具体是多少才行呢?

<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title>平移变换</title>
    <style>
        canvas{
            border: 1px solid #000;
        }
    </style>
</head>
<body>
    <canvas width="800" height="600"></canvas>
    <script>
        var canvas=document.querySelector('canvas');
        var ctx=canvas.getContext('2d');
        ctx.translate(50,50);
        ctx.strokeRect(0,0,300,200);
        ctx.clearRect(0,0,canvas.width,canvas.height); //一般我们清除的初始坐标都为(0,0)
    </script>
</body>
</html>

实例显示效果:
这里写图片描述

咦??啥情况??还剩下两条虚线,这就涉及到另外一个概念了
canvas 中的
线宽默认为1px时,是以默认的法线为基准向上向下延伸1px的虚影
线宽设置为2px时,是以默认的法线为基准向上向下延伸1px的实线
线宽默认为3px时,是以默认的法线为基准向上向下延伸1px的实线,在向上向下延伸1px的虚影
线宽默认为4px时,是以默认的法线为基准向上向下延伸2px的实线

这里写图片描述
这就画一张图吧,就是线宽为默认1px时,默认以红线按照小箭头的方向,向内向外延伸了1px的虚影,一般我们清除的时候都是canvas(0,0,canvas.width,canvas.height)从(0,0)点开始以canvas的宽和高清除,但是我们看到,刚才法线只清除了内部的1px,剩下了外部的1px虚影未清除,所以导致上图出现的bug,怎么解决这个问题呢?

直接让canvas(-1,-1,canvas.width,canvas.height),起始点以(-1,-1)开始画一个矩形进行清除就可以了
如下代码:

<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title>平移变换</title>
    <style>
        canvas{
            border: 1px solid #000;
        }
    </style>
</head>
<body>
    <canvas width="800" height="600"></canvas>
    <script>
        var canvas=document.querySelector('canvas');
        var ctx=canvas.getContext('2d');
        ctx.translate(50,50);
        ctx.strokeRect(0,0,300,200);
        ctx.clearRect(-51,-51,canvas.width,canvas.height);  
    </script>
</body>
</html>

显示效果如下:
这里写图片描述

ok,因为清除了画布中的所有内容所以画布中什么也没有显示,铛铛这就是我们想要的效果啦

so?为啥横纵坐标成了-51,-51了?因为横纵坐标还用translate平移了50px,所以清除的时候除了既要考虑到线宽还要考虑到横纵坐标的偏移量

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值