本文主要用到的知识

  本文主要用到了Canvas API中的drawImage方法,下面对此方法略做介绍。

  在Canvas API中绘制图像用drawImage方法,这是一个重载方法,定义如下:

context.drawImage(image,x,y);
context.drawImage(image,x,y,w,h);
context.drawImage(image,sx,sy,sw,sh,dx,dy,dw,dh);

  第一个方法有三个参数,第一个参数为要绘制的图像(还可以是video元素),x和y为该图像在画布中的起始坐标。

  第二个方法有五个参数,前三个跟第一个方法意义一样,w和h指绘制时的图像宽度和高度,可以用来进行图像缩放。

  第三个方法有九个参数,第一个参数跟前二个方法意义相同,后八个参数中前四个在源图像上一取一个矩形,后四个参数用于在画布上定义一个矩形,整个方法的作用就是把源图像上部分区域(第二到五个参数定义的部分)复制到画布上(后四个参数定义的部分)。

  关于这三个方法的更详细的请参考:https://developer.mozilla.org/en/Canvas_tutorial/Using_images

  本文主要利用了第三个方法完成绘制。

源代码

<!DOCTYPE html>
<html>
<head><meta charset="UTF-8"><title>用动画的形式切换图片</title><script type="text/javascript">var width, height;var context, image, functionId;var drawLeft, drawWidth;var drawTop, drawHeight;var spaceWidth, spaceHeight;var speed=5000;var images = ["http://i.6.cn/cvbnm/4e/7e/bb/75f251a8e2ae935d598f17b4f8275060.jpg", "http://i.6.cn/cvbnm/4a/6e/fb/805175016e502c483b75276f29801df3.jpg", "http://i.6.cn/cvbnm/6a/72/18/1787a3b2754ef48e374bbd14635f5c36.jpg", "http://i.6.cn/cvbnm/94/55/6c/b1ba743ba617be2891fa06b67d795511.jpg", "http://i.6.cn/cvbnm/02/1b/04/8018ee9e5756ac6b30f27d7ad6396b03.jpg", "http://i.6.cn/cvbnm/85/ea/d1/65f15857b971afb3b6e38b5fcdadc9c0.jpg"];function selectFrom(iFirstValue, iLastValue) {var iChoices = iLastValue - iFirstValue + 1;return Math.floor(Math.random() * iChoices + iFirstValue);}function showPicture(effects) {var count = 0;for (var o in effects) {count++;}var canvas = document.getElementById('canvas');context = canvas.getContext('2d');width = canvas.width;height = canvas.height;var currImage = 0;image = new Image();image.src = images[currImage];context.drawImage(image, 0, 0, width, height);currImage++;if (count > 0) {setInterval(function () {var rand =  selectFrom(0, count - 1);image.src = images[currImage];currImage++;if (currImage == images.length) {currImage = 0;}var index = 0;for (var effect in effects) {if (index++ == rand) {effects[effect]();break;}}}, speed);}}window.onload=function(){showPicture({leftToRight: function () {context.fillStyle = "#EEEEFF";context.fillRect(0, 0, width, height);drawWidth = 0;functionId = self.setInterval("drawleftToRight()", 10);},topToBottom: function () {context.fillStyle = "#EEEEFF";context.fillRect(0, 0, width, height);drawHeight = 0;functionId = self.setInterval("drawtopToBottom()", 10);},hcenter: function () {context.fillStyle = "#EEEEFF";context.fillRect(0, 0, width, height);drawLeft = width / 2;drawWidth = 0;functionId = self.setInterval("drawhcenter()", 10);},vcenter: function () {context.fillStyle = "#EEEEFF";context.fillRect(0, 0, width, height);drawTop = height / 2;drawHeight = 0;functionId = self.setInterval("drawvcenter()", 10);},hwindow: function () {context.fillStyle = "#EEEEFF";context.fillRect(0, 0, width, height);spaceWidth = width / 10;drawWidth = 0;functionId = self.setInterval("drawhwindow()", 50);},vwindow: function () {context.fillStyle = "#EEEEFF";context.fillRect(0, 0, width, height);spaceHeight = height / 10;drawHeight = 0;functionId = self.setInterval("drawvwindow()", 50);},hvwindow: function () {context.fillStyle = "#EEEEFF";context.fillRect(0, 0, width, height);spaceHeight = height / 10;spaceWidth = width / 10;drawWidth = 0;drawHeight = 0;functionId = self.setInterval("drawhvwindow()", 50);}});}function drawleftToRight() {context.drawImage(image, 0, 0, drawWidth, image.height, 0, 0, drawWidth, image.height);drawWidth = drawWidth + 2;if (drawWidth > width) {window.clearInterval(functionId);}}function drawtopToBottom() {context.save();context.drawImage(image, 0, 0, image.width, drawHeight, 0, 0, image.width, drawHeight);drawHeight = drawHeight + 2;if (drawHeight > height) {window.clearInterval(functionId);}context.restore();}        function drawhcenter() {context.save();context.drawImage(image, drawLeft, 0, drawWidth, image.height, drawLeft, 0, drawWidth, image.height);drawLeft = drawLeft - 1;drawWidth = drawWidth + 2;if (drawLeft <= 0) {window.clearInterval(functionId);}context.restore();}        function drawvcenter() {context.save();context.drawImage(image, 0, drawTop, image.width, drawHeight, 0, drawTop, image.width, drawHeight);drawTop = drawTop - 1;drawHeight = drawHeight + 2;if (drawTop <= 0) {window.clearInterval(functionId);}context.restore();}function drawhwindow() {for (i = 0; i < 10; i++) {context.drawImage(image, 0 + i * spaceWidth, 0, drawWidth, image.height, 0 + i * spaceWidth, 0, drawWidth, image.height);}drawWidth += 1;if (drawWidth - 1 > spaceWidth) {window.clearInterval(functionId);}}function drawvwindow() {context.save();context.clearRect(0, 0, width, height);for (i = 0; i < 10; i++) {context.drawImage(image, 0, 0 + i * spaceHeight, image.width, drawHeight, 0, 0 + i * spaceHeight, image.width, drawHeight);}drawHeight += 1;if (drawHeight - 1 > spaceHeight) {window.clearInterval(functionId);}context.restore();}function drawhvwindow() {context.save();context.clearRect(0, 0, width, height);for (i = 0; i < 10; i++) {for (j = 0; j < 10; j++) {context.drawImage(image, 0 + j * spaceWidth, 0 + i * spaceHeight, drawWidth, drawHeight, 0 + j * spaceWidth, 0 + i * spaceHeight, drawWidth, drawHeight);}}drawHeight += height / width;drawWidth += 1;if (drawHeight > spaceHeight) {context.drawImage(image, 0, 0, width, height);window.clearInterval(functionId);}context.restore();}</script>
</head>
<body><h1>用动画的形式切换图片</h1><canvas id="canvas" width="192px" height="255px"></canvas>
</body>
</html>

代码解析

  drawleftToRight():效果为从左向右显示,主要把第四个参数和第八个参数从0逐渐增加到图片的宽度

  drawtopToBottom():效果为从上向下显示,主要把第五个参数和第九个参数从0逐渐增加到图片的高度

  drawhcenter():效果为从中间水平向两边显示,主要把第二、六个参数从图像宽度的一半减小到0,第四、八个参数从0增加到图像宽度

  drawvcenter():效果为从中间向上下两边显示,跟上一个类似

  drawhwindow():效果为水平方向百叶窗,跟drawhcenter方法原理类似,只是这里是从多个地方进行的

  drawvwindow():效果为垂直方面百叶窗,跟drawvcenter方法原理类似,只是这里是从多个地方进行的

  drawhvwindow():效果为百叶窗,是drawhwindow()跟drawvwindow()的组合

  欢迎大家补充和完善。

  由于图片是放在其他网站上,所以加载比较慢,显的不是那么流畅,大家使用时可以换为本地图片,效果更佳。

转载于:https://www.cnblogs.com/jscode/archive/2012/04/11/2442982.html

HTML5编程实战之二:用动画的形式切换图片相关推荐

  1. html5中切换图片怎么做,HTML5编程实战之二:用动画的形式切换图片

    用动画的形式切换图片 varwidth, height;varcontext, image, functionId;vardrawLeft, drawWidth;vardrawTop, drawHei ...

  2. 52 jQuery-使用slideToggle()方法的动画效果自动切换图片的高度

    1.效果图 2.HTML代码 <!DOCTYPE html> <html> <head><meta charset="utf-8"> ...

  3. C#多线程编程实战(二)

    1.1 简介 为了防止一个应用程序控制CPU而导致其他应用程序和操作系统本身永远被挂起这一可能情况,操作系统不得不使用某种方式将物理计算分割为一些虚拟的进程,并给予每个执行程序一定量的计算能力.此外操 ...

  4. java并发编程实战(二)

    java并发编程中常常会用到两种容器来存放一些数据,这些数据需要保证能在多线程下正常访问.常见的容器分为两类:同步容器和并发容器.在java并发编程实战一书中的第五章也有讲解. 什么是同步容器以及优劣 ...

  5. QGIS 3.14|地震数据动画效果实战(二)动画设置篇

     01 设置图层Temporal属性 在QGIS 3.14中,图层的属性对话框首次加入了 Temporal标签页,提供图层的时间设置. 右键点击[图层]面板中的"quake2020" ...

  6. 基于引擎开发HTML5游戏实战(二)---游戏剧本

    STEP2 设计游戏情节 体验基于引擎开发游戏之后,让我深切感受到,游戏=情节+美工+引擎,编程技术在里面不是决定性因素.一个游戏成功与否很关键的一点是导演和编剧,这和电影电视很类似.当然,两个小时之 ...

  7. java并发编程实战(二)-并发工具类

    14 | Lock和Condition(上):隐藏在并发包中的管程 并发编程领域,有两大核心问题:一个是互斥,即同一时刻只允许一个线程访问共享资源:另一个是同步,即线程之间如何通信.协作 Java S ...

  8. C#多线程编程实战(二):线程同步

    2.1 简介 竞争条件:多个线程同时使用共享对象.需要同步这些线程使得共享对象的操作能够以正确的顺序执行 线程同步问题:多线程的执行并没有正确的同步,当一个线程执行递增和递减操作时,其他线程需要依次等 ...

  9. HTML5+CSS3实战(二)——照片墙效果

    现在的前端做的越来越炫酷了,各种特效让人眼花缭乱. 前几天逛网站的时候,看见有个照片墙的效果不错,就想着自己也做做看. 首先上图: 照片呈不规则的角度摆放,当鼠标放在照片上时,照片会放大: 鼠标离开照 ...

最新文章

  1. 为什么现在大家喜欢用3*3小卷积?
  2. mysql seconds_behind_master_MySQL 复制延迟 Seconds_Behind_Master 究竟是如何计算的
  3. WTL 出现的SetMsgHandled和IsMsgHandled 错误
  4. wxpython安装_01Python安装教程与特色介绍
  5. 笔记-项目质量管理-6σ管理法
  6. Matlab subs函数的用法
  7. 解决 web.xml is missing and failOnMissingWebXml is set to true 报错
  8. 关于request.getRequestDispatcher()的两个方法
  9. JavaScript学习笔记(二)--流程控制语句
  10. SQL 2005 新功能
  11. Oracle ERP权限管理
  12. 做基础产品的体会【转载】
  13. matlab的repmat函数和mean函数,sum函数
  14. 谷歌金山词霸合作版下载
  15. 怎么把电脑图片转文字?只需这几步就可以截图转文字
  16. Tricore学习-芯片启动流程
  17. 邮箱正则不能超过50位_投资超50亿元的安吉景区,在悬崖顶荡秋千,超过160斤不能玩...
  18. Web网站中利用JavaScript中ActiveXObject对象获取硬件信息(显示器数量、分辨率)从而进行单双屏跳转...
  19. 搜狗输入法自定义短语使用小技巧
  20. android和harmonyos对比,HarmonyOS真的是安卓换壳吗?它究竟是一个怎样的系统?

热门文章

  1. go 调用其他文件函数_一文读懂Go中软件包概念
  2. Nodejs之WebSocket
  3. Python3快速入门----(3) dict(字典结构)
  4. Vue学习(vuex)-学习笔记
  5. Windows10+GPU版 pytorch 安装
  6. trident API指南
  7. SpringCloud底层原理
  8. Mongodb固定集合
  9. 【mark】linux 终端命令行下的快捷键(自己已验证所有)
  10. Sencha Architect 安装与使用