HTML canvas中translate()与rotate()的理解

首先,当我们在页面上初始化canvas时,相当于在上面放了一块画布,这块画布我们可以理解为上面有一个坐标系(如下图),左上角是原点,往右是X轴的正方向,往下是Y轴的正方向,我们在画布上绘制的内容都是基于这个坐标系完成,但是有时候我们需要对绘制的内容进行调整,例如将上面的一个图形旋转某个角度,或者在画布正中心画一个图形,我们就可以通过translate和rotate将坐标系进行移动之后再进行绘制.

还有,rotate的旋转是以原点为基准进行旋转,,这一点很重要

功能与参数介绍
函数 参数 描述
translate dx,dx 将坐标系在X轴和Y轴移动的距离
rotate angle 坐标系旋转的角度,顺时针为正,,逆时针为负
save 保存当前坐标系的状态
restore 恢复上一次坐标系状态

当我们不对画布进行旋转和移动的时候,在上面绘制一个矩形,是这样子的

可以看到此时是基于左上角进行绘制的,如果我们用translate将它向右和向下移动200px和100px呢

可以看到,画布位置没有改变,我们移动的只是坐标系,如果我们继续在上面绘制图形,仍然是以现在这个位置的坐标系为准,如果我们只想在这个位置画一次之后就恢复坐标系原始位置,我们应该在移动之前调用save()保存状态,绘制后调用restore()恢复.

如果我们想将最开始的矩形以自身中心旋转90°呢,想看代码和效果图

emmmm...没有计算好,导致有点跑偏,但是它还是以自己为中心转了90°,但是没事,不影响理解rorate和translate这两个函数配合的理解。
首先看红色框中的第一行代码,执行后坐标系是这样的

第二行代码旋转后是这样的

注意看此时X轴和Y轴已经改变,以及正方向的方向。第三行代码执行后如下

  • 为什么会往右上方跑呢?因为我们translate中的参数是负数,而此时坐标轴的正值方向是左边和下边,所以是往右边和上边跑
  • 为什么原点会跑出画布之外?因为X轴移动的距离是width/2,而竖直方向空间不足,就继续往上走了。

通过坐标系来说明这两个函数主要是因为最近做的一个项目中需要将画布上面绘制的图片以图片自身为中心旋转90°或者180°,而看了许多博客后比较少通过坐标系来讲解这两个函数,尝试了很久之后发现通过坐标系来理解虽然麻烦,但是感觉简单点。

原文地址:https://www.cnblogs.com/homehtml/p/11963714.html

时间: 2024-11-14 00:37:12

HTML canvas中translate()与rotate()的理解的相关文章

android canvas中rotate()和translate()两个方法详解

rotate()和translate() 1.看到这个题目的时候,有人会觉得这不就是一个对画布的旋转和平移的嘛,但是其中的细节的地方还是需要深究一下的. 例如:有个需求将TextView的文字竖直显示. 首先想到的方法就是将画布旋转90度,代码如下: 1 public class RotateTextView extends TextView { 2 public RotateTextView(Context context) { 3 super(context); 4 } 5 6 public

马尾图案之canvas的translate、scale、rotate的方法详解

1.translate(x,y):平移 将画布的坐标原点向左右方向移动x,向上下方向移动y.canvas的默认位置是在(0,0).  例子:画布原点假如落在(1,1),那么translate(10,10)就是在原点(1,1)基础上分别在x轴.y轴移动10,则原点变为(11,11).2.scale(x,y):扩大 x为水平方向的放大倍数,y为竖直方向的放大倍数.3.rotate(angel):旋转 angle指旋转的角度,顺时针旋转.4.transform():切变 所谓切变,其实就是把图像的顶部

canvas的translate、scale、rotate等方法

1.translate(x,y):平移,将画布的坐标原点向左右方向移动x,向上下方向移动y.canvas的默认位置是在(0,0). 例子:画布原点假如落在(1,1),那么translate(10,10)就是在原点(1,1)基础上分别在x轴.y轴移动10,则原点变为(11,11).2.scale(x,y):扩大.x为水平方向的放大倍数,y为竖直方向的放大倍数.3.rotate(angel):旋转.angle指旋转的角度,顺时针旋转. 4.transform():切变.所谓切变,其实就是把图像的顶部

HTML5 Canvas中的贝塞尔曲线

在HTML5提供的画布功能,也就是Canvas中,getContext() 方法可返回一个对象,该对象提供了用于在画布上绘图的方法和属性.本文以getContext("2d")中提供的方法为例,简要研究了其中用于绘制曲线路径的贝塞尔曲线. JavaScript中的getContext("2d")为我们提供了两种绘制贝塞尔曲线路径的方法,分别是quadraticCurveTo()用于绘制二次贝塞尔曲线和bezierCurveTo()用于绘制三次贝塞尔曲线. 什么是贝塞

在 Canvas 中绘制扇形

在 HTML5 Canvas 中,我们可以通过 arc 方法来绘制圆形: // context.arc(x, y, r, sAngle, eAngle, counterclockwise); var canvas = document.getElementById('canvas'); var ctx = canvas.getContext('2d'); ctx.arc(100, 100, 50, 0, 2 * Math.PI); ctx.fill(); 但如何绘制一个扇形呢?是不是简单地修改结

自定义控件三部曲之动画篇(一)——alpha、scale、translate、rotate、set的xml属性及用法

前言:这几天做客户回访,感触很大,用户只要是留反馈信息,总是一种恨铁不成钢的心态,想用你的app,却是因为你的技术问题,让他们不得不放弃,而你一个回访电话却让他们尽释前嫌,当最后把手机号留给他们以便随时沟通的时候,总会发来一条条的鼓励短信,让我不自主的开始内疚.哎,多么可爱的用户,多么无耐的现实. 相关文章: <Android自定义控件三部曲文章索引>:http://blog.csdn.net/harvic880925/article/details/50995268 一.概述 Android

Android自定义控件:动画类----alpha、scale、translate、rotate、set的xml属性及用法

一.概述 Android的animation由四种类型组成:C.scale.translate.rotate,对应android官方文档地址:<Animation Resources> 动画在XML配置文件中 alpha 渐变透明度动画效果 scale 渐变尺寸伸缩动画效果 translate 画面转换位置移动动画效果 rotate 画面转移旋转动画效果 动作定义文件应该存放在res/anim文件夹下,访问时采用R.anim.XXX.xml的方式,位置如图: 二.下面我们逐个讲讲每个标签的属性

三、在Canvas中使用WebGL

上一篇介绍了如何在<canvas>标签中绘制2d图形:接下来,我们看看如何在<canvas>中使用WebGL来绘制3d图形. 我们开始编写一个最短的WebGL程序:Hello WebGL;这个程序的功能非常简单,使用指定颜色清空<canvas>标签的绘图区下图显示了程序运行的效果,清空(用黑色)了<canvas>定义的矩形区域. 我们来看下代码,先看一下Hello WebGL.html: 1 <!doctype html> 2 <html&

Canvas中图片翻转的应用

很多时候拿到的素材都是单方向的,需要将其手动翻转来达到需求,比如下面这张图片: 它是朝右边方向的,但还需要一张朝左边方向的,于是不得不打开PS将其翻转然后做成雪碧图.如果只是一张图片还好说,但通常情况下图片可能有多个动作,这种情况下工作量就大大提升了,非常费时费力.好在canvas中提供了scale方法用于翻转图片.在canvas的说明文档中,scale被介绍成用于放大或缩小图片,比如 scale(2,1)是图片宽度放大两倍,scale(1,0.5)是图片高度缩小为0.5倍,但有一个情况很少被提