canvas绘图总结——双缓冲绘图、拖动、缩放的实现

双缓冲

web中canvas绘图并未自带双缓冲绘图机制。为了使绘图更加流畅以及不出现闪屏的情况,思考使用双缓冲绘图来解决该问题。解决该问题最大的突破点在于canvas支持在canvas上绘制另一个canvas。实现方式如下:

var canvas = document.getElementById('canvas');
var context = canvas.getContext('2d');
var bufferCanvas = document.createElement('canvas');
bufferCanvas.width = canvas.width;
bufferCanvas.height = canvas.height;
var bufferContext = bufferCanvas.getContext('2d');

context.drawImage(bufferCanvas,0,0,canvas.widgth,canvas.height,0,0,canvas.width,canvas.height);

具有这个功能之后那么就可以在bufferCanvas上绘制我们需要绘制的图形,再将bufferCanvas绘制到canvas上即可。

函数描述如下:

拖动

具有双缓冲绘图之后,要实现拖动功能就变得简单很多了。图形绘制层分为两层,最外层的canvas看作视窗,缓冲bufferCanvas为实际绘图区域。那么为了实现拖动功能,实际上只需要改变将bufferCanvas绘制到canvas上的区域即可。使用drawImage的后面的参数即可修改显示在canvas上的区域。

为了实现此功能还需要将bufferCanvas的大小设置得比本身的canvas大,否则并不能达到拖动的本意。修改bufferCanvas大小并使其初始显示正中间内容,代码如下:

bufferCanvas.width = 5000;
bufferCanvas.height = 5000;

var x = bufferCanvas.width / 2 - canvas.width / 2;
var y = bufferCanvas.height / 2 - canvas.height / 2;
var w = canvas.width;
var h = canvas.height;

context.drawImage(bufferCanvas,x,y,w,h);

当进行拖动时,只需要改变x,y的值即可。其改变的距离取决于鼠标的位移,假设鼠标坐标mouseP(mX,mY)的位移到新坐标mouseNewP(newX,newY),则bufferCanvas需要在视窗中显示的区域的表示如下:

context.drawImage(bufferCanvas,x + (newX - mX),y + (newY - mY),w,h,0,0,w,h);

这样就可实现拖动功能,其拖动距离取决于鼠标的位移。

缩放

在有了拖动的经验后,缩放的原理就不难推导而出。所谓缩放就是改变获取bufferCanvas上的图像的大小但是不改变在canvas的显示的大小。假设在需要缩放的系数为s,那么缩放显示代码如下:

context.drawImage(bufferCanvas,x,y,w/s,h/s,0,0,w,h);

值得注意的是此处我们使用的并不是乘法而是除法,因为我们实际想要缩小图片其实是在bufferCanvas上获取更大的区域,将这块区域的限制在canvas中来达到视觉上的缩小的效果。反之,放大其实是在bufferCanvas上获取更小的区域,将这块区域填充到canvas中来达到视觉上的放大的效果。

 

参考网址:http://www.w3school.com.cn/tags/canvas_drawimage.asp

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Canvas是HTML5新增的一个用于绘制图形的标签,可以通过JavaScript来控制Canvas进行图形的绘制。在进行Canvas绘制时,可以通过调整画布的位置、大小和旋转角度等属性,来控制绘制出来的图形的位置和形态。 下面我们就来介绍一下Canvas画布的移动、缩放和旋转: 1. 画布移动 画布移动可以通过Canvas提供的translate方法来实现。translate方法接收两个数,分别表示x轴和y轴方向上的偏移量。偏移量为正值表示向右或向下移动,为负值表示向左或向上移动。 例如,我们可以通过下面的代码将画布向右移动50个像素,向下移动100个像素: ``` context.translate(50, 100); ``` 2. 画布缩放 画布缩放可以通过Canvas提供的scale方法来实现。scale方法接收两个数,分别表示x轴和y轴方向上的缩放比例。缩放比例为大于1的值表示放大,小于1的值表示缩小。 例如,我们可以通过下面的代码将画布在x轴和y轴方向上都放大2倍: ``` context.scale(2, 2); ``` 3. 画布旋转 画布旋转可以通过Canvas提供的rotate方法来实现。rotate方法接收一个数,表示旋转的角度,单位为弧度。 例如,我们可以通过下面的代码将画布旋转45度: ``` context.rotate(Math.PI / 4); ``` 需要注意的是,Canvas绘图的坐标系原点默认在画布的左上角,而移动、缩放和旋转操作都是相对于原点进行的。因此,在进行这些操作时,需要先将画布的原点移动到需要的位置,再进行操作。例如,如果需要将画布向右移动50个像素,需要先将原点移动到(50,0)的位置,再进行移动操作: ``` context.translate(50, 0); ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值