Canvas 彩色像素滚动条动画 案例分析

最近在学习canvas学习过程中记录下我个人对canvas用法的理解与分析,之前没有用canvas做案例的时候 就只知道canvas有一些属性,但是用到的时候才知道自己知道的canvas是那么少。下面我就分析一下今天我研究一天的canvas案例吧。多有不足之处 请看到的同学批评指正。大概就是类似图片样式滚动显示效果。

1、HTML代码部分 写进<canvas></canvas>标签

2、用javascript代码控制canvas画布,下面是代码部分 代码的解析我就直接在代码展示区域注释了

particle_no = 25;
首先 缓动函数 requestAnimationFrame 的作用:requestAnimationFrame是什么? 以前我们做动画需要一个定时器,每间隔多少毫秒就做出一些改变。现在有个好消息:浏览器厂商已经决定提供一个专门做动画的方法,即requestAnimationFrame(),而且基于浏览器的层面也能更好的进行优化。但是呢,这只是一个做动画的基础API,即不基于DOM元素的style变化,也不基于canvas,或者WebGL。所以,具体的动画细节需要我们自己写。 

我们为什么要用它? 对于同时进行的n个动画,浏览器能够进行优化,把原本需要N次reflow和repaint优化成1次,这样就实现了高质量的动画。举个例子,现在有基于JS的动画,还有基于CSS的transitions,或者SVG SMIL. Plus,如果浏览器的某个tab正在运行这样一个动画,然后你切到另一个tab,或者干脆最小化,总之就是你看不见它了,这时浏览器就会停止动画。这将意味着更少的CPU,GPU和更少的内存消耗,这样电池的使用寿命就大大延长了。

window.requestAnimFrame = (function(){
  return  window.requestAnimationFrame ||
    window.webkitRequestAnimationFrame ||
    window.mozRequestAnimationFrame    ||
    window.oRequestAnimationFrame      ||
    window.msRequestAnimationFrame     ||
    function( callback ){
    window.setTimeout(callback, 1000 / 60);
  };
})();
//获取canvas标签,并将其设置为2d动画模式
var canvas = document.getElementsByTagName("canvas")[0];
var ctx = canvas.getContext("2d");
定义计数器和碎片数组,初始化canvas标签的宽度和高度
var counter = 0;
var particles = [];
var w = 400, h = 200;
canvas.width = w;
canvas.height = h;
重置函数主要是初始化canvas画布的状态。
function reset(){
  ctx.fillStyle = "#272822";//画布的填充颜色
  ctx.fillRect(0,0,w,h);//画布的绘制范围 坐标从(0,0)开始 宽为w 高为h

  ctx.fillStyle = "#171814";//画布中进度条的填充颜色
  ctx.fillRect(25,80,350,25);//进度条的绘制起始点级宽度和高度
}
进度条方法
function progressbar(){
  this.widths = 0;
  this.hue = 0;
  进度条的绘制方法
  this.draw = function(){
    ctx.fillStyle = ‘hsla(‘+this.hue+‘, 100%, 40%, 1)‘;canvas画布中填充颜色使用 hsla clolor
    ctx.fillRect(25,80,this.widths,25);                canvas画布的绘制范围
    var grad = ctx.createLinearGradient(0,0,0,130);    黑色矩形渐变绘制
    grad.addColorStop(0,"transparent");
    grad.addColorStop(1,"rgba(0,0,0,0.5)");
    ctx.fillStyle = grad;                              填充canvas画布中的矩形进度条的颜色
    ctx.fillRect(25,80,this.widths,25);
  }
}
//碎片的制作方法
function particle(){//提起碎片的位置
  this.x = 23 + bar.widths;
  this.y = 82;
  //碎片在x轴方向的移动速度
  this.vx = 0.8 + Math.random()*1;
  this.v = Math.random()*5;   //不知道这个变量是什么作用
  this.g = 1 + Math.random()*3;  //应该是碎片竖直方向的降落速度
  this.down = false;
  //碎片的绘制方法
  this.draw = function(){
    ctx.fillStyle = ‘hsla(‘+(bar.hue+0.3)+‘, 100%, 40%, 1)‘;//根据hue变化的填充色
    var size = Math.random()*2;//碎片的随机大小 最大不会超过2像素
    ctx.fillRect(this.x, this.y, size, size);//碎片的绘制
  }
}

bar = new progressbar();
//canvas的绘制方法
function draw(){
  reset();
  counter++

  bar.hue += 0.8;

  bar.widths += 2;//当当前进度填充的宽度超过进度条的宽度之后执行
  if(bar.widths > 350){
    if(counter > 215){//在此不太明白215是怎么计算出来的
      reset();
      bar.hue = 0;
      bar.widths = 0;
      counter = 0;
      particles = [];
    }
    else{
      bar.hue = 126;
      bar.widths = 351;
      bar.draw();
    }
  }
  else{
    bar.draw();
    for(var i=0;i<particle_no;i+=10){
      particles.push(new particle());
    }
  }
  update();
}
//进度填充更新
function update(){
  for(var i=0;i<particles.length;i++){
    var p = particles[i];
    p.x -= p.vx;
    if(p.down == true){
      p.g += 0.1;
      p.y += p.g;
    }
    else{
      if(p.g<0){
        p.down = true;
        p.g += 0.1;
        p.y += p.g;
      }
      else{
        p.y -= p.g;
        p.g -= 0.1;
      }
    }
    p.draw();
  }
}
//递归调用绘制函数 draw()
function animloop() {
  draw();
  requestAnimFrame(animloop);
}

animloop();
时间: 2024-08-26 12:16:29

Canvas 彩色像素滚动条动画 案例分析的相关文章

彩色TabBar切换动画实现

彩色TabBar切换动画实现 无意间看到一个彩色TabBar切换的设计图,感觉很不错,有空就把他实现了. 环境信息 Mac OS X 10.10.4 Xcode 6.4 iOS 8.4 效果图: 源码下载地址: https://github.com/saitjr/TColorfulTabBar.git 一.实现分析 看到这个彩色切换效果的时候,我第一个反应就是在TabBar上有一个彩色的View,然后每个色块的显示都是通过mask来显示的.最终,我的具体实现也是根据这个思路来的. 1. 设计思想

微软必应词典案例分析

1.微软必应词典案例分析 1.1微软必应词典功能性BUG说明 声明:以下版本和运行环境如下: 运行环境:Android 5.0.2 LRX22G MIUI 8.0.1.0(LHMCNDG) 必应词典软件版本:5.2.2 1.1.1:BUG-1-悬浮窗错误弹出 软件测试BUG特征 与其他软件存在使用冲突 重现步骤 0.安装讯飞输入法1.打开必应词典->我的->设置->勾选悬浮窗口->打开微信->在对话框中输入讯飞输入法自带的emoji表情,例如破涕为笑 测试结果 弹出“本地暂无

HTML5 Canvas核心技术—图形、动画与游戏开发.pdf8

第6章 精灵 精灵(sprite),它是一种可以集成入动画之中的图像对象,赋予它们各种行为,精灵并非Canvas API的一部分,,但都是从它衍生而来 本章将会实现三种设计模式:策略模式(精灵与绘制器解耦).命令模式(精灵的动作).享元模式(一个实例表示多个精灵) painter属性是一个指向Painter对象的引用,使用paint(sprite,context)方法来绘制精灵,behaviors属性指向一个对象数组,数组中每个对象都会以execute(sprite,context,time)方

HTML5 Canvas核心技术—图形、动画与游戏开发.pdf1

canvas元素可以说是HTML5元素中功能最强大的一个,它真正的能力是通过Canvas的context对象(绘图上下文)表现出来的 fillText()方法使用fillStyle属性来填充文本中的字符,strokeText()方法使用strokeStyle属性描绘字符的轮廓线,fillStyle属性和strokeStyle属性可以是CSS格式的颜色.渐变色或是图片 fillText()与strokeText()方法都需要3个参数:要绘制的文本内容,以及在canvas中显示文本的横.纵坐标 注意

HTML5 Canvas核心技术—图形、动画与游戏开发.pdf7

性能 运行putImageData()比drawImage()慢,同等条件下优先考虑drawImage() 操作图像数据需要遍历大量数据,应该注意几点: 1)避免在循环体中直接访问对象属性,应当保存在局部变量中 2)应该用循环计数器遍历完整的像素,而非像素分量(每4个一组) 3)逆向遍历与移位技巧效果并不好 4)不要频繁使用getImagedata() 视频处理 var video=document.getElementById('video'); //A <video>element ...

HTML5 Canvas核心技术—图形、动画与游戏开发.pdf3

路径与子路径 在某一时刻,canvas之中只能有一条路径存在,Canvas规范称之为“当前路径”(current path),这条路径却可以包含很多子路径(subpath),子路径是由两个或者更多点组成的 context.beginPath(); context.rect(10,10,100,100); context.stroke(); context.beginPath(); //清除上次调用rect()方法所创建的路径 context.rect(50,50,100,100); contex

HTML5 Canvas核心技术—图形、动画与游戏开发.pdf6

操作图像的像素:getImageData() putImageData() ImageData对象 调用getImageData()方法实际是获取了一个指向ImageData对象的引用,返回的对象包含3个属性:1)width以设备像素为单位的图像数据宽度 2)height以设备像素为单位的图像数据高度 3)data包含各个设备像素数值的数组 width和height都是只读的无符号长整数,data属性包含的每个数组元素都表示图像数据中相应的像素值,每个值包含的颜色分量都是含有8个二进制位的整数(

CSS3-3D制作案例分析实战

一.前言 上一节,介绍了基础的CSS3 3D动画原理实现,也举了一个小小的例子来演示,但是有朋友跟我私信说想看看一些关于CSS3 3D的实例,所以在这里为了满足一下大家的需求,同时也为了以后能够更好的巩固CSS3 3D的知识,所以在这里写下这篇博文,希望能够帮助你更好的理解3D的制作和实现原理,同时也欢迎各位小伙伴对文中的错误给予指正 二.入门案例分析 这里先说一说我的规划,我打算先从入门级的案例入手,然后依次递推,最后要达到的效果是,理解完所有的例子的设计思路,基本上CSS3-3D制作就能够随

HTML5 Canvas彩色小球碰撞运动特效

脚本简介 HTML5 Canvas彩色小球碰撞运动特效是一款基于canvas加面向对象制作的运动小球动画特效. 效果展示 http://hovertree.com/texiao/html5/39/ 效果图如下: 代码如下: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>HTML5 Canvas彩色小球碰撞运动特效