canvas 基础

低版本的ie不支持html5,需要引入excanvas.js来让ie支持canvas.

检测支持canvas

<canvas id="canvas" width="150" height="200" >
你的浏览器不支持canvas
</canvas>
var canvas = document.getElementById('canvas');
if(canvas.getContext) alert('支持canvas');

api

绘制矩形

var canvas = document.getElementById('canvasnode');
var ctx = canvas.getContext('2d');
ctx.fillRect(x, y, width, height); //绘制填充矩形 需先设置ctx.fillStyle = #a00;
ctx.strokeRect(x, y, width, height); //绘制描边矩形 需先设置ctx.strokeStyle = #ccc, ctx.lineWidth = 2;
ctx.clearRect(x, y, width, height); //清除矩形区域 ~常用来不断的清空画布和重绘来实现动画效果

注:canvas的尺寸最好通过 标签内的width, height设置,用css设置的话效果类似放大了画布和画布上的内容

绘制路径

ctx.beginPath(); //开始路径
路径是以一组子路径(直线、弧线等)的形式存储的,每次调用beginPath(),子路径组都会被重置,然后可以绘制新的图形 ctx.closePath(); //闭合路径 会尝试用直线连接当前端点和开始端点来闭合路径,若路径本身已闭合或只有1个点 则closePath()什么也不做,闭合路径不是必须的。 ctx.stroke(); //描边路径 ctx.fill(); //填充 开放路径将自动闭合,而无需调用ctx.closePath(); ctx.moveTo(x, y); //移动画笔 ctx.lineTo(x, y); //从当前上下文点画直线 ctx.arc(x, y, radius, startAngle, endAngle, antiClockwise); //绘制弧线或圆 角度(圆周上的每个点对应一个角度,顺时针方向增大 0.5* Math.PI为半圆的下端点,0*Math.PI为半圆的右端点)

绘制曲线 贝塞尔和二次方曲线

quadraticCurveTo(cx, cy, x, y); //3个点(上下文点 1个控制点 1个端点)
bezierCurveTo(cx1, cy1, cx2, cy2, x, y); //4个点 (上下文点 2个控制点 1个端点)

canvas中使用图像

//创建图片
var img = new Image();
img.onload = function(){
context.drawImage(img, 100,100);
}
img.src = url;
~~ or img.src = dataUrl; 注意dataUrl方式加载的图片优点:图片即时显示不用http请求;缺点:不能被缓存
//如:img.src = 'data:image/gif;base64,R01GOD....' //drawImage()渲染图片到canvas上。
drawImage(imageObj, x, y); //从哪个位置开始渲染图片 //图片缩放
drawImage(imageObj, x, y, width, height); //从哪个位置以多大尺寸渲染图片 width, height指图片的大小 图片切片 可以只渲染图片的一部分都canvas上 有点CSS sprite的味道
对图片裁切(切片)后,以指定的位置和大小渲染到画布
drawImage(imageObj, sx, sy, sWidth, sHeight, dx, dy, dWidth, dHeight); //切片开始位置,切片大小, 目标放置位置, 目标大小

半透明

context.globalAlpha = 0.3; //全局透明度
context.strokeStyle = 'rgba(255,0,0,0.3)'; //半透明颜色实现半透明度
context.fillStyle = 'rgba(255,0, 0, 0.3)';

线型 笔刷设置

ctx.lineWidth = "3"; //线条大小
ctx.lineCap = 'round'/'square'/'butt'; //线段端点样式
ctx.lineJoin = 'round'/'bevel'/'miter'; //两线段连接处的样式
ctx.miterLimit = "10"; //lineJoin = 'miter' 时,线段延长相交的最大值

渐变

var grd = context.createLinearGradient(x1, y1, x2, y2); //创建线性渐变 指定渐变起点和终点
var grd = context.createRadialGradient(x1, y1, r1, x2, y2, r2); //创建径向渐变 指定2个圆 创建渐变对象后,就可以用addColorStop()方法添加色标了。
grd.addColorStop(pos, color); pos:0~1的值

图案 图案填充

var pat = context.createPattern(image, type); // type: repeat / repeat-x /repeat-y / no-repeat
如:
var img = new Image();
img.onload = function(){
var ptn = context.createPattern(img, 'repeat');
}
img.src = url;

阴影

context.shadowOffsetX = 2;
context.shadowOffsetY = 2;
context.shadowBlur = 2
context.shadowColor = 'rgba(0,0,0,0.5)';

保存和恢复canvas的状态

canvas状态栈, 调用context.save(),则当前状态入栈,调用context.restore()则顶端状态出栈,成为当前状态。

context.save()
context.restore()
canvas状态包括:
strokeStyle, fillStyle, globalAlpha, lineWidth, lineCap, lineJoin, miterLimit, shadowOffsetX, shadowOffsetY, shadowBlur, shadowColor

移动 translate

context.translate(x, y); //移动canvas的原点到新的位置

旋转 rotate

context.rotate(angle); //旋转canvas

缩放 scale

context.scale(xZoom, yZoom);

变形 transform 变换矩阵

context.transform(m11, m12, m21, m22, dx, dy);
变换矩阵为:
m11 m21 dx
m12 m22 dy
0 0 1

组合 compositing, 图形的组合

通常我们绘制多个图形时,总是一个图形绘制在另一个图形上,这样是不够的,图形的堆叠被绘制顺序限制

context.globalCompositeOperation = ..
~~ 当前绘制的图形是source, 之前存在的图形为destination
source-over: 默认值 新图形覆盖在旧的内容上。
destination-over: 原有内容在上面
source-in: 新图形与原有内容重叠部分,显示新图形的,其余部分透明
destination-in:
source-out: 新图形与原有内容不重叠部分,显示新图形的,其余部分透明
destination-out:
source-atop:新图形与原有内容重叠部分会被绘制,并覆盖在上面
destination-atop:新图形与原有内容重叠部分会被绘制,原有内容覆盖在上面
lighter: 两图形重叠部分加色
darker: 两图形重叠部分减色
xor: 重叠部分变透明
copy: 新图形被保留 其他的清除。

裁切路径 clip

context.beginPath();
context.arc(0, 0, 60, 0, 2 * Math.PI, true);
context.clip(); //绘制路径 然后裁切,从而控制绘图的范围

基本动画

canvas的动画是通过不断的重绘来实现的
绘制动画帧常用的操作
清空canvas
context.clearRect(x,y,width,height);

保存状态

context.save()

context.restore()

setTimeout, setInterval实现不断重绘

canvas 基础知识的更多相关文章

  1. canvas基础知识

    canvas基础知识 ## CanvasDOM对象 #### 获取绘图环境```canvas.getContext();``` #### 设置宽和高```canvas.width = 500;canv ...

  2. canvas API ,通俗的canvas基础知识(四)

    今天要讲的内容是canvas的转换功能,前面的内容没用看的同学可以出门右转,先看看前面的基础知识,废话不多说,开始进入正题吧! 何为转换功能?熟悉css3的同学都知道,css3里面有transform ...

  3. canvas 基础知识整理(二)

    html部分: <canvas id="myCanvas" width="800" height="800" ></can ...

  4. canvas 基础知识整理(一)

    canvas这个 HTML 元素是为了客户端矢量图形而设计的.它自己没有行为,但却把一个绘图 API 展现给客户端 JavaScript 以使脚本能够把想绘制的东西都绘制到一块画布上. html的基本 ...

  5. canvas API ,通俗的canvas基础知识(一)

    在没学canvas的时候,觉得canvas是这么的神秘,这么的绚丽,这么的高深,用canvas做出来的效果是如此的炫酷,能做的事情如此的宽广,简直让我心生敬畏之心,时常感叹:我要是得此技能,必定要上天 ...

  6. 第157天:canvas基础知识详解

    目录 一.canvas简介 1.1 什么是canvas?(了解) 1.2 canvas主要应用的领域(了解) 二.canvas绘图基础 2.0 sublime配置canvas插件(推荐) 2.1 Ca ...

  7. canvas API ,通俗的canvas基础知识(六)

    这篇是canvas API系列的首尾之作,这篇以后,所有的canvas的属性和方法就将完了,哦,不对,应该是大部分常用的,还有部分不常用的属性和方法,因为种种原因,就不介绍了,后期的重点就是多写一点c ...

  8. canvas API ,通俗的canvas基础知识(五)

    前几期讲的都是路径图形的绘图,这节我们要讲的是如何在画布上操作图片,因为图形画不了漂亮妹子(画图高手忽略不计),想画美女怎么办?跟我来: 想要在画布中插入一张图片,我们需要的方法是这位大侠: draw ...

  9. canvas API ,通俗的canvas基础知识(三)

    全文说到了三角形,圆形等相关图形的画法,不熟悉的同学可以出门右转,先看看前文,接下来继续我们的图形——曲线. 学过数学,或者是比较了解js 的同学都知道贝塞尔曲线,当然,在数学里面,这是一门高深的学问 ...

随机推荐

  1. Android DatePicker和TimePicker

    监测日期改变的监听器:      OnDateChangedListener和OnTimeChangedListener()           当用户改变Datepicker里的年.月.日时,将触发 ...

  2. hadoop笔记之Hive的管理(CLI方式)

    Hive的管理(一) Hive的管理(一) Hive的启动方式 CLI(命令行)方式 Web界面方式 远程服务启动方式 CLI方式 1. 进入命令行方式 直接输入<HIVE_HOME>/b ...

  3. cv2.imread BGR模式

    openCV 的cv2.imread()导入图片时是BGR通道顺序,这与Matplotlib的显示,或者读取图片的通道不同,如果需要可以转换为RGB模式,以下代码显示不同之处,但BGR在许多地方使用, ...

  4. PowerShell入门(一):PowerShell能干什么?

    原文链接:http://www.cnblogs.com/ceachy/archive/2013/01/30/WhatCanPowerShellDo.html PowerShell能干什么呢?就像序言中 ...

  5. 在VHDL中,“传输延迟”和“惯性延迟”

    传输延迟就是最容易理解的从输入变化到输出变化之间的延迟.对应语法是transport例如 b <= transport a after 20ns 惯性延迟考虑了电容效应,即如果输入是(相对)窄的 ...

  6. 数据仓库(七):Oracle Warehouse Builder(OWB)创建数据仓库

    本文简述使用OWB创建数据仓库的一般过程.Oracle的OWB是目前最好的三大ETL产品之一.OWB不但可以可以完成数据的抽取.转换和加 载,还能帮助用户在Oracle数据库中创建ROLAP(Rela ...

  7. 强制删除正在连接的Oracle用户,以删除SDE用户为例

    . 有时候想强制删除一个已经连接的Oracle用户,不能直接删除,可以用Kill会话信息. 比如今天想删除一个被连接的SDE用户,可以用以下方法删除一个“正在被连接”的用户. 1.查看所有用户的会话信 ...

  8. WEB Application Development Integrator : 应用设置

    1.1.       系统安装 应用 Oracle EBS WEB Application Development Integrator WEB ADI在Oracle EBS 11.5.10.* 版本 ...

  9. Android中pendingIntent的深入理解

    pendingIntent字面意义:等待的,未决定的Intent.要得到一个pendingIntent对象,使用方法类的静态方法 getActivity(Context, int, Intent, i ...

  10. VB6关于判断模态窗体的问题

    模态窗体也有人叫模式窗体,是否为模态窗体由Show方法的参数决定: 语法 object.Show style, ownerform Show 方法的语法包含下列部分: 部分 描述 object 可选的 ...