创造运用浅谈canvas的设计艺术

知道<canvas>吗?如果你不熟悉<canvas>,学习他的最好方法是去看一个简单的例子。下面的HTML和JavaScript将在<canvas>域内生成一个橙色的矩形区域。推荐学习相关HTML高级教程

<canvas id="example1" width="400" height="300"></canvas>
// get the canvasvar canvas = document.getElementById(‘example1‘);// 
get the "2d" contextvar context = canvas.getContext(‘2d‘);//
 change fill style to orangecontext.fillStyle = ‘#ff7700‘;// 
draw an orange rectanglecontext.fillRect(0, 0, 400, 300);
你总是通过找到web文档中的元素,然后选择“context”开始canvas绘画。在本例中, context是2 d, 因为我们想用canvas 画二维形状。选择一个context之后,canvas API包含了很多有用的绘图功能,如填充样式,形状,中风,阴影,和大量的其他特性,允许我们给 图片做出奇特的改变。我们的编写的脚本的结果看起来是 这样的 。
<canvas>的伟大之处就是它是一个JavaScript  API,这意味着我们可以利用所有的JavaScript变量,事件,循环 等等的特点。让我们应用我们的脚本使用一个简单的JavaScript循环在我们的canvas区域创建一个网格的小区域。
<canvas id="example2" width="400" height="300"></canvas>
// get the canvas and contextvar canvas = document.getElementById(‘example2‘);
var context = canvas.getContext(‘2d‘);// orange fill stylecontext.fillStyle = ‘#ff7700‘;// 
create squares in a loopfor(var x = 0; x < canvas.width; x += 25){  for(var y = 0; y 
< canvas.height; y += 25){    context.fillRect(x, y, 20, 20);  }}
短短几行JavaScript, 在我们的canvas区域能够产生192个方块。在我看来,这是<canvas>的真正价值。它允许我们利用web浏览器的处理能力来生成数学几何和图纸。再加上一点工作和大量的创造力,我们甚至可以利用这种力量的实现 艺术效果。
动画

在我们继续这个话题之前,我们需要了解如何使用<canvas>创建一个动画。这是一个有点更难做的事情。首先,请理解,以阻碍web浏览器 性能的方式使用canvas API是很容易的。在canvas上绘画是需要处理器密集型的工作,特别是如果你不断更新动画之类的图纸。缓解任何性能问 题,我将使用一个新功能叫做requestAnimationFrame,允许我们的web浏览器来决定更新canvas的频率, 同时在我们的web文 档保持最佳性能。这不是在所有浏览器都可用的, 但幸运的是保罗爱尔兰曾写过一个出色的poly-fill将此功能添加到旧版本的web浏览器。他在他的博客写下了这个脚本和web浏览器这个的特性。

为了简便起见,我不打算在我的代码示例中包含保罗的脚本,但是你应该在自己的代码中使用它。使用requestAnimationFrame,我们可以在我们的脚本中创建一个基本的“动画循环”。它看上去是 这样的
<canvas id="example3" width="400" height="300"></canvas>
// get the canvasvar canvas = document.getElementById(‘example3‘);var context = 
canvas.getContext(‘2d‘);context.fillStyle = ‘#ff7700‘;var time = false;//
 box positionvar x = -100;// animation loopvar loop = function(){  // 
get time since last frame  var now = new Date().getTime();  
var d = now - (time || now);  time = now;   // clear previously 
drawn rectangles  context.clearRect(0, 0, canvas.width, canvas.height); 
 // draw new rectangle  context.fillRect(x, 100, 100, 100); 
 // advance horizontal position  x += 0.1 * d;
  // reset horizontal position  if(x > canvas.width){    x = -100;  }    //
 request next frame  requestAnimationFrame(loop);};// first frameloop();
当在canvas元素中使用动画, 所有绘画应由一个可重复的函数完成。在示例中,使用loop()函数在我们的canvas上画一个正方形。 requestAnimationFrame函数基于可用的处理能力告诉浏览器时自动选择什么时候绘制下一个框架,结果是我们的loop()函数一遍又一 遍的运行, 从左到右推进我们的橙色盒子前进。请注意,我们使用d变量(delta)来确定帧之间的时间,以毫秒为单位。这是使我们的动画速度正常的一个 重要的增加项。没有它,我们的动画在有好一点的处理器的计算机上会跑的更快,几年后当电脑获得更多的处理能力,我们的动画可以跑的更快之快,以至于混淆或 误导用户。使用delta变量,我们可以每毫秒指定一个速度。在我们的示例中, 方块的位置每毫秒前进0.1 * d,或0.1像素,转化后即为每秒 100像素。无论您的处理器的速度是多少, 动画总是花同样多的时间完成。
艺术元素
既然我们了解canvas元素以及如何使用它创建动画,我们可以在这些基础上加上一些艺术创造力来创造更有意思的东西。在下一个示例中,我们将在canvas元素中随机生成彩色圆圈并且和给他们随机轨迹。通过使用渐变画圆圈而不是纯色,我们的“北极光”脚本变得生动起来。
<canvas id="example4" width="400" height="300" style="#0e74a2;"></canvas>
// get the canvasvar canvas = document.getElementById(‘example4‘);var context = 
canvas.getContext(‘2d‘);var time = false;// create an empty array of "circles"var circles 
= [];// animation loopvar loop = function(){  // get time since last frame  var now = new Date().getTime();  
var d = now - (time || now);  time = now;  // clear the canvas  context.clearRect(0, 0, canvas.width,
 canvas.height);  // draw circles  for(var i = 0; i < circles.length; i++){    
circles[i].update(d);    circles[i].draw();  }  // request next frame  requestAnimationFrame(loop);};// 
circle objectvar circle = function(options){  // configuration  var circle = this;  circle.settings = 
{    x: 0,    y: 0,    radius: 20,    orientation: 0, 
   vector: { x: 0, y: 0 },    speed: 1,    color: { red: 0, green: 0, blue: 0, alpha: 1 }  }; 
 // merge options into settings  var newsettings = {};  
for(var attrname in circle.settings){ newsettings[attrname] 
= circle.settings[attrname]; }  for(var attrname in options){ newsettings[attrname] = options[attrname]; }  
circle.settings = newsettings;  // update circle  circle.update = function(d){    // update position  
  circle.settings.x += circle.settings.vector.x * circle.settings.speed * d;   
 circle.settings.y += circle.settings.vector.y * circle.settings.speed * d;    // bounce  
  if(circle.settings.x < 0 && circle.settings.vector.x < 0 || circle.settings.x >
 canvas.width && circle.settings.vector.x > 0){

circle.settings.vector.x = circle.settings.vector.x * -1;    }

if(circle.settings.y < 0 && circle.settings.vector.y < 0 || circle.settings.y > 
canvas.height && circle.settings.vector.y > 0){      
circle.settings.vector.y = circle.settings.vector.y * -1; 
   }  };  // draw circle  circle.draw = function(){    // gradient fill    var gradient =
 context.createRadialGradient(circle.settings.x, circle.settings.y, 
circle.settings.radius / 10, circle.settings.x, circle.settings.y, circle.settings.radius);  
  gradient.addColorStop(0, ‘rgba(‘ + circle.settings.color.red + ‘, ‘ + circle.settings.color.green
 + ‘, ‘ + circle.settings.color.blue + ‘, ‘ + circle.settings.color.alpha + ‘)‘);    
gradient.addColorStop(1, ‘rgba(‘ + circle.settings.color.red + ‘, ‘ + circle.settings.color.green 
+ ‘, ‘ + circle.settings.color.blue + ‘, ‘ + circle.settings.color.alpha / 50 + ‘)‘);   
 context.fillStyle = gradient;     // draw    context.beginPath();    
context.arc(circle.settings.x, circle.settings.y, circle.settings.radius, 0, 2 * Math.PI, false);  
  context.fill();   };};// create new circlesvar newcircles = function(){  // remove old circles  circles 
= [];    // create 5 new circles  for(var i = 0; i < 5; i++){    // create a new circle    
var newcircle = new circle({      x: Math.floor(Math.random() * canvas.width),  
    y: Math.floor(Math.random() * canvas.height),     
 radius: Math.floor(Math.random() * canvas.width),    
  orientation: Math.floor(Math.random() * 360),     
 vector: {        x: Math.random() / 40,   
     y: Math.random() / 40      },      speed: Math.random(),   
   color: {      
  red: 100 + Math.floor(Math.random() * 155),        
green: 100 + Math.floor(Math.random() * 155),    
    blue: 100 + Math.floor(Math.random() * 155),       
 alpha: 0.1 + Math.random()      }    });   
     // add new circle to circles array    
circles.push(newcircle);     
}};// generate new circleswindow.addEventListener(‘click‘, newcircles, false);
window.addEventListener

(‘touchend‘, newcircles, false);newcircles();// first frameloop();

在这个窗口每次单击,新的随机圆圈将会出现。
我们才刚刚开始理解和利用<canvas>的力量。我渴望了解这个行业如何采用它以及SVG等技术构建惊奇和艺术的web内容。在我的下一篇 文章中,我将展示如何采用此代码使用键盘快捷键和动画来创建一个简单的基于canvas的游戏,让你可以在web浏览器中玩这种游戏。还有更多HTML教程视频供你学习没请登录e良师益友网。

时间: 2024-08-06 00:42:33

创造运用浅谈canvas的设计艺术的相关文章

浅谈商城活动设计

如题:浅谈商城活动设计 标题改成“浅谈商城活动的数据库设计”可能更加合理. 文章背景 为什么要吐槽,为什么要写这篇文章 本来我在弄大数据搜索,自己玩的不亦说乎,虽然感觉数据库设计不合理,但我可以数据清洗,弄到自己的搜索引擎里,自己随便玩,所以当时感觉在烂的数据库设计和我关系不大,只要我把数据清洗好,弄到自己的引擎里我的搜索正常,准确,问题不大.但忽然有一天老大跑来说ERP对接需要你来lead一下,然后一两个月带着捣乱的产品妹妹,和没有经验开发弟弟搞了ERP的简单对接,然后老大又说咱们商城库存总有

浅谈android架构设计

到目前为止,android开发在网络上或者社区上没有公认的或者统一的开发框架,好多框架都是基于对方法的封装.今天在这浅谈两年来对android开发的理解,主要是思想上的理解,希望对大家有帮助. 我认为android开发可以从两个方面去总结架构的设计,在这里对于实现只做陈述: 一,就是大多数人的设计思路,对方法的封装. 在这里我根据开发的习惯对工程进行包的设计: 1. http:网络请求方法封装.这里建议采用线程+Handler的模式,把Http 中get方法和post两种请求方式分开,对于正常的

iOS 浅谈架构 架构设计的方法论

摘要:iOS客户端应用架构看似简单,但实际上要考虑的事情不少.本文作者将以系列文章的形式来回答iOS应用架构中的种种问题,本文是其中的第一篇,主要讲架构设计的通识和方法论等,同时还讨论了大家关心的架构分层.是否要有common文件夹等问题. 缘由 之前安居客iOS app的第二版架构大部分内容是我做的,期间有总结了一些经验.在将近一年之后,前同事zzz在微信朋友圈上发了一个问题:假如问你一个iOS or Android app的架构,你会从哪些方面来说呢? 当时看到这个问题正好在乘公车回家的路上

APP开发设计应以人为本!浅谈APP交互设计原则

为什么APP开发设计需要原则?设计原则其实就是对一些设计过程中基于人类的认知规律对设计做出的一些指导性原则,并且对已经成为行业共识的设计经验做个总结,用来指导设计师界定问题.提高效率. 先就APP开发设计 http://www.czwew.com 常州紫竹云科技产品经理分享交互设计的时候最为大家所认可的几条设计原则:可学习性.一致性.简洁性.流畅性.及时反馈.除了这么六个?还有其他的吗?你放心,如果需要还有更多. 一.经常用的设计原则有哪些? 1.可学习性   目标用户在已有的知识和经验基础上,

浅谈Java六大设计原则

笔者刚接触设计原则的时候,觉得一头雾水,不知道他有什么用.在经历了一段时间的代码加上了解Java设计模式之后.笔者忽然觉得自己以前写的代码就是一堆*.所以,笔者认为设计原则和设计模式对于软件编程设计(非码农)来说是至关重要的事情.相信很多学习编程的人,和我有同样的感受. 我对设计模式和设计原则的理解是:如果把程序员比作武侠,那么设计模式就是修炼内功的易筋经,设计原则就是修炼内功的心法总纲,而具体的技术实现(代码编写)就是罗汉拳.如果你只想自保,那么会罗汉拳就可以了(能够用代码实现功能),不过如果

浅谈canvas绘画王者荣耀--雷达图

背景: 一日晚上下班的我静静的靠在角落上听着歌,这时"滴!滴!"手机上传来一阵qq消息.原来我人在问王者荣耀的雷达图在页面上如何做出来的,有人回答用canvas绘画.那么问题来了,已经好久没有使用canvas绘画了东西. SO,就想自己画一个canvas雷达图,顺便重新回顾一下canvas的知识点. 王者荣耀雷达图的基本构成. 聊天记录当中的雷达图不是特别清楚,所以我这边截图了自己的一个战绩雷达图. 是不是有被我的战绩吓到了,害不害怕! 好了扯远了,让我们回到正题上来. 通过截图上面的

浅谈网络游戏的设计--——服务器端编程(3)

机器学习是一项经验技能,经验越多越好.在项目建立的过程中,实践是掌握机器学习的最佳手段.在实践过程中,通过实际操作加深对分类和回归问题的每一个步骤的理解,达到学习机器学习的目的. 预测模型项目模板不能只通过阅读来掌握机器学习的技能,需要进行大量的练习.本文将介绍一个通用的机器学习的项目模板,创建这个模板总共有六个步骤.通过本文将学到: 端到端地预测(分类与回归)模型的项目结构. 如何将前面学到的内容引入到项目中. 如何通过这个项目模板来得到一个高准确度的模板. 章哦链徒俪偬勒呕池挛局乙囱兄谖闭棕

浅谈:中国式设计智能手机有望引领未来

在中国市场上,庞大的潜在市场用户基数.便利的供应链管理和更为低廉的人力成本等等因素,都决定了中国市场是最适合智能手机生产的最佳选择.在过去几年的发展过程中,无数智能手机品牌相继崛起和苹果将iPhone代工厂设置于大陆区域的举措和现象,无一不在说明中国市场对于推进智能手机设备发展的重要性正日趋凸显. 1.中国智能手机发展之桎梏:"设计"阻滞创新 中国拥有智能手机发展的天时地利人和因素,但在设计方面,中国智能手机产业却一直备受诟病. 在功能机时代,独具创新的工业设计是当时手机产品的最大特色

从数组循环左移问题中浅谈考研算法设计的规范代码

问题:设将n(n>1)个整数存放到一维数组R中.设计一个算法,将R中的序列循环左移p(0<p<n)个位置,即将R中的数据由{X0,X1,...,Xn-1}变换为{Xp,Xp+1,...,Xn-1,X0,X1,...,Xp-1}.要求:写出本题的算法描述. 分析: 本题不难,要实现R中序列循环左移p个位置,只需先将R中前p个元素逆置,再将剩下的元素逆置,最后整体逆置操作即可.本题算法描述如下: 1 #include <iostream> 2 using namespace st