- 浏览: 306847 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
开发小菜:
支持IE9以下的吗?
HTML5+CSS3+JQuery打造自定义视频播放器 -
攻城使:
开发Html5必须得下载么,我用dw编写,把文件复制到myec ...
html5开发 myeclipse安装aptana插件 -
疾风鹰狼:
...
根据判断浏览器类型屏幕分辨率自动调用不同CSS的代码 -
sardodo:
你好,我想问下,导入例子中的.dae格式模型是可以看到旋转的小 ...
c3dl 初步认识 -
BIOHAZARDX:
下载学习,初学者膜拜一下。
html5 实现动画(三)
在 Canvas 中,所有基本图形都是以路径为基础的,也就是说,我们在调用 2dContext 的 lineTo、rect 等方法时,其实就是往已经的 context 路径集合中再添加一些路径点,在最后使用 fill 或 stroke 方法进行绘制时,都是依据这些路径点来进行填充或画线。
在每次开始绘制路径前,都应该使用 context.beginPath() 方法来告诉 Context 对象开始绘制一个新的路径,否则接下来绘制的路径会与之前绘制的路径叠加,在填充或画边框时就会出现问题。在绘制完成路径后,可以直接使用 context.closePath() 方法来关闭路径,或者手动关闭路径。另外,如果在填充时路径没有关闭,那么 Context 会自动调用 closePath 方法将路径关闭。
基本路径方法
1. beginPath, closePath
这两个方法在前面已经介绍过,分别用来通知 Context 开始一个新的路径和关闭当前的路径。
在 Canvas 中使用路径时,应该要保持一个良好的习惯,每次开始绘制路径前都要调用一次 beginPath 方法,否则画出来的效果难看不说,还会严重影响性能。
在下面这张图中,左边的图形在每次绘制矩形前都调用了一次 beginPath 来清除之前的路径并重新开始绘制新的路径,而后面的图形则就只在绘制所有图形前调用了一次 beginPath 来清除路径,因此,虽然这里是使用的边框色是 #666,但是右边的图形颜色比左边的深一些,因为每次使用 stroke 绘制边框时,会把之前的路径再次绘制一遍,叠加起来颜色就比原来深一些。
<canvas id="canvas" width="500" height="500"></canvas>
<script type="text/javascript">
var canvas = document.getElementById("canvas");
var ctx = canvas.getContext("2d");
ctx.strokeStyle = "#666";
function useBeginPath() {
for (var i = 0; i < 5; ++i) {
ctx.beginPath();
ctx.rect(10 + i*20, 10 + i*20, 210 - i*40, 210 - i*40);
ctx.stroke();
}
}
function notUseBeginPath() {
ctx.beginPath();
for (var i = 0; i < 5; ++i) {
ctx.rect(240 + i*20, 10 + i*20, 210 - i*40, 210 - i*40);
ctx.stroke();
}
}
useBeginPath();
notUseBeginPath();
</script>
提示:您可以先修改部分代码再运行
在 Context 中路径数较少时,如果不考虑显示效果,性能上还可以接受,但是如果 Context 中的路径数很多时,在开始绘制新路径前不使用 beginPath 的话,因为每次绘制都要将之前的路径重新绘制一遍,这时性能会以指数下降。
因此,除非有特殊需要,每次开始绘制路径前都要调用 beginPath 来开始新路径。
2. 移动与直线 moveTo, lineTo, rect
<canvas id="canvas" width="500" height="500"></canvas>
<script type="text/javascript">
var canvas = document.getElementById("canvas");
var ctx = canvas.getContext("2d");
ctx.beginPath();
ctx.moveTo(10, 10);
ctx.lineTo(110,110);
ctx.lineTo(10, 110);
ctx.lineTo(10, 10);
ctx.stroke();
ctx.beginPath();
ctx.rect(120, 10, 100, 100);
ctx.stroke();
</script>
提示:您可以先修改部分代码再运行
void moveTo(in float x, in float y);
在 Canvas 中绘制路径,一般是不需要指定起点的,默认的起点就是上一次绘制路径的终点,因此,如果需要指定起点的话,就需要使用 moveTo 方法来指定要移动到的位置。
void lineTo(in float x, in float y);
lineTo 方法则是绘制一条直接路径到指定的位置。在调用完 lineTo 方法后,Context 内部的绘制起点会移动到直线的终点。
void rect(in float x, in float y, in float w, in float h);
rect 方法用来绘制一个矩形路径,通过参数指定左上角位置以及宽和高。在调用 rect 后,Context 的绘制起点会移动到 rect 绘制的矩形的左上角。
rect 方法与后面要介绍的 arc 方法与其他路径方法有一点不同,它们是使用参数指定起点的,而不是使用 Context 内部维护的起点。
3. 曲线 arcTo, arc, quadraticCurveTo, bezierCurveTo
void arcTo(in float x1, in float y1, in float x2, in float y2, in float radius);
按照 WHATWG 文档的说明,这个方法是画一个与两条射线相切的的圆弧,两条射线其中一条为穿过 Context 绘制起点,终点为 (x1, y1),另外一条为穿过 (x2, y2),终点为 (x1, y1),这条圆弧为最小的与这两条射线相切的圆弧。在调用完 arcTo 方法后,将 圆弧与 射线 (x1, y1)-(x2, y2) 的切点添加到当前路径中,做为下次绘制的起点。
在测试中发现,Firefox 和 Opera 目前对这个方法的支持并不好,只有 Chrome 和 Safari 4 能绘制出正确的路径。
图中的的两条灰色直线是偏移 4 个像素后的两条射线所在的位置。
<canvas id="canvas" width="500" height="500"></canvas>
<script type="text/javascript">
var canvas = document.getElementById("canvas");
var ctx = canvas.getContext("2d");
ctx.beginPath();
ctx.strokeStyle = "#000";
ctx.translate(200, 200);
ctx.moveTo(10, 10);
ctx.arcTo(110, 60, 10, 110, 30);
ctx.stroke();
ctx.beginPath();
ctx.strokeStyle = "#999";
ctx.moveTo(10, 6);
ctx.lineTo(114, 60);
ctx.lineTo(10, 114);
ctx.stroke();
</script>
提示:您可以先修改部分代码再运行
void arc(in float x, in float y, in float radius, in float startAngle, in float endAngle, in boolean anticlockwise);
arc 方法用来绘制一段圆弧路径,通过圆心位置、起始弧度、终止弧度来指定圆弧的位置和大小,这个方法也不依赖于 Context 维护的绘制起点。而在画圆弧时的旋转方向则由最后一个参数 anticlockwise 来指定,如果为 true 就是逆时针,false 则为顺时针。
void quadraticCurveTo(in float cpx, in float cpy, in float x, in float y);
quadraticCurveTo 方法用来绘制二次样条曲线路径,参数中 cpx 与 cpy 指定控制点的位置,x 和 y 指定终点的位置,起点则是由 Context 维护的绘制起点。
void bezierCurveTo(in float cp1x, in float cp1y, in float cp2x, in float cp2y, in float x, in float y);
bezierCurveTo 方法用来绘制贝塞尔曲线路径,它与 quadraticCurveTo 相似,不过贝塞尔曲线有两个控制点,因此参数中的 cp1x, cp1y, cp2x, cp2y 用来指定两个控制点的位置,而 x 和 y 指定绺的位置。
<canvas id="canvas" width="500" height="500"></canvas>
<script type="text/javascript">
var canvas = document.getElementById("canvas");
var ctx = canvas.getContext("2d");
ctx.translate(10, 10);
ctx.beginPath();
ctx.arc(50, 50, 50, 0, Math.PI, true);
ctx.stroke();
// quadraticCurveTo
ctx.beginPath();
ctx.strokeStyle = "#000";
ctx.moveTo(110, 50);
ctx.quadraticCurveTo(160, 0, 210, 50);
ctx.stroke();
ctx.beginPath();
ctx.strokeStyle = "red";
ctx.moveTo(110, 50);
ctx.lineTo(160, 0);
ctx.lineTo(210, 50);
ctx.stroke();
// bezierCurveTo
ctx.beginPath();
ctx.strokeStyle = "#000";
ctx.moveTo(220, 50);
ctx.bezierCurveTo(250, 0, 280, 10, 320, 50);
ctx.stroke();
ctx.beginPath();
ctx.strokeStyle = "red";
ctx.moveTo(220, 50);
ctx.lineTo(250, 0);
ctx.lineTo(280, 10);
ctx.lineTo(320, 50);
ctx.stroke();
</script>
提示:您可以先修改部分代码再运行
4. fill, stroke, clip
fill 与 stroke 这两个方法很好理解,分别用来填充路径与绘制路径线条。
clip 方法用来给 Canvas 设置一个剪辑区域,在调用 clip 方法之后的代码只对这个设定的剪辑区域有效,不会影响其他地方,这个方法在要进行局部更新时很有用。默认情况下,剪辑区域是一个左上角在 (0, 0),宽和高分别等于 Canvas 元素的宽和高的矩形。
在画这个图时,虽然两次都是使用 fillRect(0, 0, 100, 100) 填充了一个 100x100 大小矩形,但是显示的结果却是第二次填充的只是中间的一小块,这是因为在两次填充之间使用 clip 方法设定了剪辑区域,这样第二次填充时只会影响到所设定的中间那一小部分区域。
<canvas id="canvas" width="500" height="500"></canvas>
<script type="text/javascript">
var canvas = document.getElementById("canvas");
var ctx = canvas.getContext("2d");
ctx.translate(10, 10);
// fill a green rectangle
ctx.fillStyle = "green";
ctx.fillRect(0, 0, 100, 100);
// set the clipping region
ctx.beginPath();
ctx.rect(30, 30, 40, 40);
ctx.clip();
ctx.stroke();
// fill a yellow rectangle
ctx.fillStyle = "yellow";
ctx.fillRect(0, 0, 100, 100);
</script>
提示:您可以先修改部分代码再运行
5. clearRect, fillRect, strokeRect
这三个方法并不是路径方法,而是用来直接处理 Canvas 上的内容,相当于 Canvas 的背景,调用这三个方法也不会影响 Context 绘图的起点。
要清除 Canvas 上的所有内容时,可以直接调用 context.clearRect(0, 0, width, height) 来直接清除,而不需要使用路径方法绘制一个与 Canvas 同等大小的矩形路径再使用 fill 方法去清除。
发表评论
-
iframe 高度自适应
2011-11-03 17:07 1359转自:http://apps.hi.baidu.com/sha ... -
WordPress 博客添加新浪微博挂件:
2011-06-22 14:07 14701.点击链接http://t.sina ... -
HTML5 影音 ( Video ) 概論
2011-05-25 16:25 10481 Video介紹 引用我翻譯文檔《在HTML5頁面 ... -
HTML5 Audio Loops
2011-05-19 16:49 1281One of the neatest things abo ... -
处理火狐自动播放视频
2011-05-18 17:54 1441版权声明:转载时请 ... -
教你用HTML5开发iPhone应用程序
2011-05-13 17:38 1179你一整年都像现在一样沮丧,这我知道。所有铁杆Objecti ... -
很给力,20个HTML5视频播放器及代码
2011-05-09 14:45 1963本文来源: http://www.uleadesi ... -
HTML 5 Video概述
2011-05-09 13:32 1004本文来自:http://www.xlnv.ne ... -
支持移动平台的Html5播放器
2011-05-09 13:25 2900本文转自:http://www.riameeting ... -
HTML5 API简介一(Canvas,Audio/Video,Geolocation)
2011-05-09 13:22 1554本文来自:http://www.myext.cn/web ... -
HTML5资源
2011-05-09 11:56 1200JS APIs: 选择器 W3C草案:Selecto ... -
HTML5 Audio/Video 标签,属性,方法,事件
2011-05-09 11:53 1415本文转自:http://directguo.com/blo ... -
DIV实现隐藏与显示
2011-05-06 15:23 742css中display属性的参考值: display:n ... -
HTML5+CSS3+JQuery打造自定义视频播放器
2011-05-06 12:57 6720简介HTML5的<video> ... -
HTML 5 <video> preload 属性
2011-05-06 12:54 1119设置为预加载的 video 元素: <vide ... -
HTML5 – Video
2011-05-06 12:51 1041在HTML5以前若我們要在網頁中播放影片時,需要使用Act ... -
超過 23 個開源的 HTML5 影音播放器與框架
2011-05-06 12:03 7519超過 23 個開源的 HTML5 影音播放器與框架 - ... -
Building a better HTML5 video player with Glow
2011-05-06 11:51 1066Last year I wrote a post (Bu ... -
Ambilight для тэга video
2011-05-06 11:49 769В некоторых топовых моделях т ... -
怎样用js+html5实现视频的播放控制
2011-05-06 11:46 1395html5 代码: <video width ...
相关推荐
3. Canvas API:Canvas API是HTML5中的一个重要特性,它允许JavaScript创建和操作图形。Canvas API涉及绘制图形(如矩形、圆形、路径等)、设置样式、处理事件等。 4. SVG:可缩放矢量图形(Scalable Vector ...
"html基础------简单易学"这个主题旨在为初学者提供一个易理解的HTML学习路径,通过简单明了的解释,帮助他们快速掌握常用HTML标记。 HTML由一系列的元素组成,这些元素通常被称为标签。每个标签都有其特定的功能,...
HTML5图形化编辑是现代网页开发中的一个重要领域,它利用HTML5的新特性,如Canvas、SVG和WebGL等,提供了一种在浏览器中创建、编辑和展示图形的强大方式。随着前端技术的飞速发展,HTML5图形化编辑工具已经成为了...
HTML5 Canvas是Web开发中的一个关键技术,它提供了一个在网页上绘制图形的API,使得开发者可以直接在浏览器中创建丰富的交互式2D图形、动画以及游戏。"HTML5 Canvas核心技术—图形、动画与游戏开发"这本书深入浅出地...
HTML5 Canvas是Web开发中的一个强大工具,它允许开发者在网页上进行动态图形绘制,创造出丰富的视觉效果。这个技术尤其适合创建几何图形动画特效,给用户带来互动且引人入胜的体验。以下是对HTML5 Canvas绘制几何...
HTML5,即超文本标记语言的第五次重大修改版,是构建现代网页的基础技术之一。它为网页添加了多媒体、图形以及更高级的交互功能,同时提供了更好的搜索引擎优化和辅助工具支持。下面我们将详细介绍HTML5中的常用命令...
### HTML5与JavaScript动画:深度解析与应用技巧 #### 基础概念与技术要点 **HTML5动画**,作为现代网页设计中的一个重要组成部分,它不仅提升了用户体验,还为开发者提供了更加灵活和强大的表现手段。结合...
**HTML5基础知识与Web简介** **1. Web的诞生** Web的起源可以追溯到1989年,当时由蒂姆·伯纳斯-李(Tim Berners-Lee)创建了第一个Web服务器和第一个Web客户端,这标志着World Wide Web(WWW)的诞生。WWW成为了...
HTML5引入了许多新特性,比如`<canvas>`用于绘制图形,`<audio>`和`<video>`用于多媒体播放,以及`<form>`中的新输入类型,如`<input type="email">`用于电子邮件输入验证。 在学习这些源代码时,还可以了解到如何...
HTML5 Canvas是现代Web开发中的一个关键特性,它允许开发者在网页上绘制2D图形,创建复杂的动画效果以及构建互动式游戏。这本书《HTML5 Canvas核心技术图形动画与游戏开发》全面探讨了Canvas API的各个方面,旨在...
HTML5和SVG(Scalable Vector Graphics)是现代网页开发中的重要技术,它们结合JavaScript可以创建出丰富的交互式图形和动态视觉效果。本压缩包"js+html5 svg创建点路径生成器工具代码.zip"提供了这样一个工具,允许...
1. **Canvas元素**:HTML5中的 `<canvas>` 标签是图形绘制的基础,它提供了一个二维绘图表面,可以通过JavaScript进行操作。 2. **绘图API**:Canvas API提供了丰富的绘图方法,如`fillRect()`用于填充矩形,`...
总结来说,这个项目涵盖了高德地图Web服务的路径规划,ArcGIS JS的图层管理和图形渲染,以及天地图的集成。通过这个实践,开发者不仅可以学习到GIS应用开发的基本流程,还能深入了解不同地图服务之间的交互与整合。
HTML5 Canvas是一个强大的绘图工具,允许开发者在网页上进行动态图形绘制,为网页带来了丰富的交互性和视觉效果。 **HTML5 Canvas** HTML5 Canvas是HTML5标准的一部分,它提供了一个2D渲染上下文,通过JavaScript ...
本系列教程将深入探讨HTML5的框架、背景以及实体,帮助你全面掌握这一现代Web开发的基础。 1. **HTML5框架** - **Bootstrap**:是最受欢迎的前端框架之一,提供了响应式设计和丰富的组件库,简化了页面布局和样式...
通过学习《HTML5 Canvas核心技术 图形、动画与游戏开发》,读者将掌握如何利用Canvas进行复杂图形绘制、流畅动画制作,以及开发互动性游戏的基础知识。这本书适合对游戏开发有兴趣的初学者,也对有经验的开发者提供...
HTML5 Canvas是Web开发中的一个强大工具,它允许开发者在网页上进行动态图形绘制,创造出丰富的交互式用户体验。"html5-canvas-web-图片涂鸦"这个主题涉及到的知识点主要集中在如何利用HTML5的Canvas API来实现图片...
传统的HTML4只能通过标签插入静态图片,而HTML5则引入了Canvas元素,这是一个基于矢量图形的画布,允许开发者通过JavaScript动态绘制图形,包括对图像进行各种操作,如裁剪、旋转、滤镜效果,甚至创建3D效果。...
### HTML5 Canvas核心技术:图形、动画与游戏开发 #### 第1章 基础知识 - **1.1 canvas元素** - **1.1.1 canvas元素的大小与绘图表面的大小**:`canvas`元素是HTML5中新增的一个用于绘制图形的标签。它本身并不...
HTML5 Canvas是Web开发中的一个强大工具,它允许开发者在网页上进行动态图形绘制,创建丰富的交互式用户体验,包括动画和游戏。这个“HTML5 Canvas核心技术图形、动画与游戏开发完整源码”压缩包可能包含了多个示例...