`

canvas画布变形效果

阅读更多

HTML5的变形效果实现,包括:移动,缩放,旋转,自定义变形,裁剪,镜像,变形重置等等操作

下面依次讲解:

 

①移动 / 位移

使用context上下文的translate方法,我们可以控制图形的位置移动,相关方法如下:

context.translate(100, 100); //x轴和y轴移动距离,这里上线文分别移动100个像素

使用translate方法,可以有效的控制context的起始点位置,因为context位置变化,导致绘制图形位置也变化,因此可以方便的在合适位置绘制图形

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>HTML5画布图形位移</title>
</head>
<body>

<!-- 添加canvas标签,并加上红色边框以便于在页面上查看 -->
<canvas id="mycanvas" width="400" height="300"></canvas>
<script type="text/javascript">
    /*相关Javascript*/

    var canvas = document.getElementById('mycanvas');
    context = canvas.getContext('2d'),
            elementwidth = 100,
            elementheight = 100;
    //为了实现位移效果,使用如下方法:
    context.translate(100, 100);
    //然后绘制图形,这里我们生成一个矩形
    context.fillStyle = 'orange';
    context.fillRect(0, 0, elementwidth, elementheight); //这个矩形左上角坐标(0, 0),宽度和高度均为100px
    //注意:translate在你绘制图形之前调用
</script>
</body>
</html>

 

②缩放

使用context上下文的scale方法,我们可以控制图形的缩放,相关方法如下:

 

 

context.scale(50%, 50%); //x轴和y轴缩放比例
 使用scale方法,可以有效的控制context的缩放,因为context缩放变化,导致绘制图形也变化
注意:要在绘制图形之前控制缩放 

③旋转

使用context上下文的rotate方法,实现图形旋转效果

context.rotate(Math.PI/4); //顺时针旋转45度

 使用rotate方法,可以有效的控制context的旋转,因为context旋转变化,导致绘制图形也发生变化

 

④自定义变形

使用画布的自定义变形方法可以实现大家需要的变形方式,如下:

 /*
   * 相关参数说明如下:context.transform(a,b,c,d,e,f);
   * a: 水平缩放
   * b: 水平倾斜
   * c: 垂直倾斜
   * d: 垂直缩放
   * e: 水平位移
   * f: 垂直位移
   */

 例子:context.transform(1, 0.5, 0.5, 1, 100, 100);

 注意:变形只影响调用transform方法以后的图形绘制

 

.⑤阴影效果

 

//绘制文字阴影
context.scale(1, -1); 
//再添加一些倾斜效果
context.transform(1, 0, -0.7, 0.7, 0, 0);
//旋转了360°
context.rotate(Math.PI*2)
 拓展:

 

(1)scale() 方法标注画布的用户坐标系统

scale(sx, sy)

scale() 方法为画布的当前变换矩阵添加一个缩放变换。缩放通过独立的水平和垂直缩放因子来完成。例如,传递一个值 2.0 和 0.5 将会导致绘图路径宽度变为原来的两倍,而高度变为原来的 1/2。指定一个负的 sx 值,会导致 X 坐标沿 Y 轴对折,而指定一个负的 sy 会导致 Y 坐标沿着 X 轴对折

例如:scale(1,-1)则是类似阳光照射--垂直阴影

 

(2)rotate() 方法旋转画布的坐标系统

rotate(angle) //旋转的量,用弧度表示。正值表示顺时针方向旋转,负值表示逆时针方向旋转。

描述:

          rotate() 方法通过指定一个角度,改变了画布坐标和 Web 浏览器中的 <Canvas> 元素的像素之间的映射,使得任意后续绘图在画布中都显示为旋转的。它并没有旋转 <Canvas> 元素本身。注意,这个角度是用弧度指定的。

提示:如需把角度转换为弧度,请乘以 Math.PI 并除以 180

 文字阴影例子:

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>HTML5画布图形位移</title>
    <style type="text/css">
        /*界面CSS*/
        body{
            margin:0;
            padding:0;
        }
        #mycanvas{
            background: #E4E4E4; /* 画布背景色 */
        }
    </style>
</head>
<body>

<!-- 定义canvas元素 -->

<canvas id="mycanvas" width="400" height="300"></canvas>
<script type="text/javascript">
    /*画布相关JS*/
    //获取context
    var canvas = document.getElementById('mycanvas'),
            context = canvas.getContext('2d');
    //执行位移操作
    context.translate(200, 100);
    //绘制文字到画布
    context.font = "30pt microsoft yahei,Arial,sans-serif";
    context.textAlign = "center";
    context.fillStyle = "orange";
    //绘制正常文字
    context.fillText("Hello, gbtags!", 0, 0);
    //继续位移
    context.translate(0, 40);
    //绘制文字阴影
    context.scale(1, -1);
//    context.rotate(Math.PI*2)这里旋转了360°
    //再添加一些倾斜效果
    context.transform(1, 0, -0.7, 0.7, 0, 0);
    //最后添加阴影文字
    context.textAlign = "center";
    context.fillStyle = "#BFBFBF";
    context.fillText("Hello, gbtags!", 0, 0);
</script>
</body>
</html>

 

 ⑥重置变形

前面我们学习了transform(变形)方法,这里介绍setTransform(重置变形)方法,它可以帮助你重置你使用transform方法生成的变形效果,代码如下:

//调用reset,重置context上下文
context.setTransform(1,0,0,1,0,0); 
//这里我们使用setTransform方法来重置以前的变形,
//以上设置setTransform参数值为(1,0,0,1,0,0)即可保证重置画布的变形

 例子:

<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title>canvas重置变形</title>
    <script type = "text/javascript" src="./jquery.min.js"></script>
    <style type="text/css">
        /*界面CSS*/

        body{
            margin:0;
            padding:0;
        }

        #mycanvas{
            background: #E4E4E4; /* 画布背景色 */
        }

    </style>
</head>
<body>
<!-- 定义canvas元素 -->

<canvas id="mycanvas" width="400" height="300"></canvas>
<script>
    /*画布相关JS*/
    var canvas = document.getElementById('mycanvas'),
            context = canvas.getContext('2d'),
            elementwidth = 100,
            elementheight = 100;

    context.translate(100, 100); //将context位置移动到100, 100

    //绘制一个矩形
    context.fillStyle = 'orange';
    context.fillRect(0, 0, elementwidth, elementheight);

    //调用reset,重置context上下文
    context.setTransform(1,0,0,1,0,0); //这里我们使用setTransform方法来重置以前的变形

    //再次绘制一个矩形
    context.fillStyle = 'black';
    context.fillRect(0, 0, elementwidth, elementheight);

    //现在看到使用setTransform方法的作用了吧,可以帮助我们重置context

</script>
</body>
</html>

 

 ⑦重置变形

使用context的save和restore(回复)方法可以准确的控制变形状态的保存和恢复,相关代码如下:

 

<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title>canvas重置变形</title>
    <script type = "text/javascript" src="./jquery.min.js"></script>
    <style type="text/css">
        /*界面CSS*/

        body{
            margin:0;
            padding:0;
        }

        #mycanvas{
            background: #E4E4E4; /* 画布背景色 */
        }

    </style>
</head>
<body>
<!-- 定义canvas元素 -->

<canvas id="mycanvas" width="400" height="300"></canvas>
<script>
    /*画布JS*/

    var canvas = document.getElementById('mycanvas'),
            context = canvas.getContext('2d'),
            elementwidth = 50,
            elementheight = 50;

    //保存初始变形状态
    context.save();

    //位移变形
    context.translate(100, 100);
    //保存位移变形状态
    context.save();

    //旋转变形
    context.rotate(-Math.PI/4);
    //保存旋转变形状态
    context.save();

    //缩放变形
    context.scale(2, 2);

    //开始绘制图形
    //第一个图形包含所有变形状态:即,位移+旋转+缩放
    context.fillStyle = 'orange';
    context.fillRect(0, 0, elementwidth, elementheight);

    //恢复到旋转状态点
    context.restore();

    //第二个图形包含除了缩放以外的所有变形状态:即,位移+旋转
    context.fillStyle = 'green';
    context.fillRect(0, 0, elementwidth, elementheight);

    //恢复到位移状态点
    context.restore();

    //第三个图形只包含位移变形状态:即,位移
    context.fillStyle = 'black';
    context.fillRect(0, 0, elementwidth, elementheight);

    //恢复到初始状态点,没有任何变形状态
    context.restore();

    //第四个图形不包含任何的变形状态
    context.fillStyle = 'red';
    context.fillRect(0, 0, elementwidth, elementheight);
</script>
</body>
</html>

 变形状态的保存和恢复遵循“栈”原理,即先入的后出,后入的先出,也就是先显示出来最终结果。类似一个圆桶里放置一层一层的物品,然后一层一层取出的原理类似。

 

拓展:

(1) fillStyle 属性来设置用于填充绘图的颜色、渐变或模式。fillRect() 方法绘制“已填色”的矩形。默认的填充颜色是黑色。

context.fillRect(x,y,width,height);

 

参数 描述
x 矩形左上角的 x 坐标
y 矩形左上角的 y 坐标
width 矩形的宽度,以像素计
height 矩形的高度,以像素计

 

 

.

分享到:
评论

相关推荐

    WebGL/ThreeJS Sprite、SpriteMaterial通过精灵模型和Canvas画布Demo

    在本Demo中,我们将深入探讨WebGL和Three.js中的Sprite和SpriteMaterial,以及如何结合Canvas画布进行更复杂的图形操作。 首先,让我们了解Sprite。在Three.js中,Sprite是一种特殊的几何体,它只由一个二维平面...

    Android应用源码之(Canvas画布)(-IT计算机-毕业设计.zip

    以下是Canvas画布相关的知识点详解: 1. **Canvas基本概念**: - Canvas是Android中的一个类,它提供了在各种Surface上绘制图形的能力,如Bitmap、Window等。 - 在Android中,我们通常先创建一个Bitmap对象,然后...

    canvas背景效果-可用于首页,登录页等动态背景

    Canvas是一个基于矢量图形的画布,通过JavaScript进行操作。通过这个画布,开发者可以使用路径、矩形、圆形、文本、图像等元素来创建和修改图形。Canvas API提供了大量的绘图方法,如`fillRect()`、`strokeRect()`、...

    html5 canvas绘制虚幻扭曲背景动画特效

    首先,Canvas API提供了一个二维渲染上下文,通过JavaScript代码来控制画布上的图形绘制。开发者可以使用`&lt;canvas&gt;`标签在HTML文档中创建一个画布,然后通过JavaScript获取到2D渲染上下文,例如: ```html &lt;canvas ...

    html5 canvas拖动的流体图片动画效果.zip

    为了实现流体感,可能还需要额外的技术,如模糊效果、颜色渐变或者扭曲变形等。这些可以通过Canvas的滤镜或者自定义的绘图算法来实现。例如,可以使用`createImageData()`和`putImageData()`方法来处理像素数据,...

    html5 canvas彩虹心形变形动画特效

    7. 变形动画:动画效果是通过定时改变图形的某些属性(如位置、大小、颜色等)并重绘Canvas来实现的。在JavaScript中,可以使用`requestAnimationFrame()`函数来平滑地更新每一帧。 8. 粒子系统:如果项目中包含...

    android利用Paint在Canvas上实现竖排写字

    - 可以通过设置Paint的`paint.setTextAlign(Paint.Align.RIGHT)`使文本右对齐,再配合`canvas.translate()`方法改变画布的坐标原点,使得每次绘制文本时都会向左移动一定的距离,从而达到竖排的效果。 4. **步骤...

    canvas基础简单易懂教程(完结,多图).doc

    Canvas 的标签属性只有两个,width 和 height,表示的是 Canvas 画布的宽度和高度,不要用 CSS 来设置,而是用属性来设置,画布会失真变形。 Canvas 的绘制功能 Canvas 提供了多种绘制功能,包括绘制矩形、绘制...

    H5图像扭曲、自由拉伸实现代码

    在H5开发中,我们经常需要对图像进行各种操作,比如扭曲、自由拉伸和变形,以实现丰富的视觉效果。本教程将详细讲解如何利用HTML5的Canvas API、JavaScript以及OpenGL ES 2.0(WebGL)来实现这些功能。 首先,`...

    html5 canvas彩虹心形变形动画特效.zip

    在这个案例中,可能有一个自定义的插件用于处理心形的动画逻辑,如平滑的变形效果。插件通常包含一个或多个函数,可以通过调用`$.fn.pluginName`来使用。 `jQuery特效`是指使用jQuery库创建的各种视觉效果,包括...

    HTML5 canvas创建gooey效果抖动窗口的jquery插件 6种.zip

    3. **Gooey效果实现**:在canvas上实现gooey效果,通常需要使用复杂的数学算法来模拟物体的变形和流动。这可能涉及到向量运算、贝塞尔曲线、粒子系统等技术。开发者可能会使用requestAnimationFrame进行平滑动画,以...

    Canvas圆形万花筒动画效果.zip

    在“万花筒”效果中,圆形通常会被多次复制并进行旋转、缩放等变形,以模拟镜子反射的效果。这可以通过`ctx.save()`和`ctx.restore()`来保存和恢复当前的绘图状态,以及使用`ctx.translate(x, y)`、`ctx.rotate...

    html5 canvas实现响应鼠标的酷炫粒子图形变形动画效果源码.zip

    在HTML5 Canvas中,我们可以使用`&lt;canvas&gt;`元素来创建画布,然后通过JavaScript的Canvas API进行绘图。主要涉及的方法有`getContext()`用于获取2D渲染上下文,`beginPath()`用于开始一个新的路径,`moveTo()`和`line...

    html5 canvas彩色碎片组合球形旋转动画特效

    这款“html5 canvas彩色碎片组合球形旋转动画特效”利用了Canvas API来实现一种动态视觉效果,使用户可以通过鼠标操作与之互动。 1. **HTML5 Canvas基本概念** HTML5 Canvas是一个基于矢量图形的画布,通过...

    canvas 验证码

    3. **扭曲和变形**:为了增加验证码的破解难度,我们需要对绘制的字符进行扭曲和变形。这可以通过在Canvas上应用位移、旋转、缩放等变换实现。例如,可以为每个字符设置不同的起点、角度和缩放比例,使得字符看起来...

    HTML5 Canvas六角星变色变形旋转动画特效.zip

    在这个"HTML5 Canvas六角星变色变形旋转动画特效.zip"压缩包中,包含了一个利用HTML5 Canvas API实现的六角星动态变换效果。这个特效可能包含了以下几个关键知识点: 1. **HTML5 Canvas基础**:Canvas是一个基于...

    html5 canvas炫酷全屏彩色几何图形变形旋转动画特效.zip

    Canvas元素通常通过`&lt;canvas&gt;`标签在HTML中定义,它的`id`属性用于JavaScript中获取并操作Canvas画布。 `js`文件夹中很可能包含了实现动画效果的主要JavaScript代码。这些代码可能使用了jQuery库,一个广泛使用的...

    12. 画布开发1Canvas绘图1.rar

    5. **动画制作**:通过在paint()方法中加入时间相关的逻辑,例如使用定时器,可以创建动态效果,使图形随着时间变化而移动或变形。 6. **优化绘图**:由于J2ME运行在资源有限的移动设备上,有效的绘图优化至关重要...

    画布验证码

    5. **绘制文字**:将随机字符串以扭曲、倾斜、加粗等变形方式绘制到canvas上,可以使用`ctx.fillText()`方法。 6. **添加噪声线和点**:为了增加验证码的复杂性,可以在画布上随机绘制一些线条和点,模拟真实图像中...

    html5 Canvas酷炫粒子图形变形动画特效.zip

    首先,Canvas API是HTML5引入的一个重要特性,它提供了一块可编程的画布,通过JavaScript来绘制图形。在这个项目中,开发者可能使用了`canvas.getContext('2d')`来获取2D渲染上下文,然后通过一系列的绘图方法,如`...

Global site tag (gtag.js) - Google Analytics