canvas

标签

  1. <canvas width="600" height="400" id="canvas"></canvas>
  2. 不给宽高的话默认是300+150

怎么用

  1. //拿到canvas
  2. var canvas = document.getElementById("canvas");
  3. //创建画图工具
  4. var context = canvas.getContext("2d");

相关的api及用法

  1. //画线
  2. context.moveTo(100, 100);
  3. context.lineTo(300, 100);
  4. context.lineTo(300, 200);
  5. //画第二条线
  6. //画第二条线
  7. context.moveTo(100, 300);
  8. context.lineTo(300, 300);
  9. //最后要描边才会出效果
  10. context.stroke();
  11. //创建一张新的玻璃纸
  12. context.beginPath();
  13. //画第三条线
  14. context.moveTo(500, 100);
  15. context.lineTo(500, 300);
  16. //只要执行stroke,都会玻璃纸上的图形重复印刷一次
  17. context.stroke();
  18. //填充
  19. context.fill();
  20. //设置描边色
  21. context.strokeStyle = "red"; //颜色的写法和css写法是一样的
  22. context.stroke();
  23. //填充
  24. //设置填充色
  25. context.fillStyle = "yellowgreen";
  26. context.fill();
  27. //把路径闭合
  28. context.closePath();
  29. //设置线条的粗细, 不需要加px
  30. context.lineWidth = 15;
  31. //线条的头部的设置
  32. context.lineCap = "round"; //默认是butt, 记住round

非零填充原则

  1. 在由路径围成的区域内部,任意一个点, 拉一条射线。 看和这个射线相交的路径有几条。 路径的方向是顺时针,就是1. 如果逆时针,就是-1 把所有的值相加, 如果是0 就不填充, 如是非0 就填充

画矩形

  1. //直接传入 x, y, width, height, 就可以绘制一个矩形
  2. //画在玻璃纸上
  3. context.rect(100, 100, 200, 200);
  4. context.strokeStyle = "red";
  5. context.stroke();
  6. context.fillStyle = "yellow";
  7. context.fill();

  1. //直接创建一个填充的矩形
  2. //创建玻璃纸, 画矩形路径, 填充, 把玻璃纸销毁
  3. context.fillRect(100, 100, 200, 200);
  4. //黄色的边不会显示,是因为上面那一句,画完之后,就把玻璃纸销毁了
  5. context.strokeStyle = "yellow";
  6. context.stroke();
  7. //如果放在fillRect上面就可以实现

圆形绘制

  1. //x轴是0度开始
  2. //x, y: 圆心位置;radius: 半径的长度; startRadian, endRadian 代表的是起始弧度和结束弧度;dircetion代表的圆形的路径的方向,默认是顺时针(是否逆时针, 默认值是false),如果传true就是逆时针,最后一个参数是可以不传的, 默认就是顺时针
  3. context.arc(x, y, radius, startRadian, endRadian, direction);
  4. //从31度的地方,画到81度的地方
  5. context.arc(300, 200, 100, 31/180*Math.PI, 81/180*Math.PI);

画飞镖转盘

  1. var canvas = document.getElementById("canvas");
  2. var context = canvas.getContext("2d");
  3. for (var i = 0; i < 10; i++) {
  4. context.moveTo(320+i*20,200);
  5. // i % 2代表是奇数还是偶数, 偶数就逆时针, 奇数就顺时针
  6. context.arc(300, 200, 20 + i * 20, 0, 2*Math.PI, i%2==0);
  7. }
  8. context.fillStyle = "green";
  9. context.fill();
  10. context.stroke();

线性渐变

  1. //1. 需要创建出一个渐变对象
  2. // var gradient = context.createLinearGradient(100, 100, 300, 100);
  3. //参数代表哪个点到哪个点,这里写的是左上角到右下角的意思
  4. var gradient = context.createLinearGradient(100, 100, 300, 380);
  5. //2. 添加渐变颜色
  6. gradient.addColorStop(0, "red");
  7. gradient.addColorStop(0.5, "hotpink");
  8. gradient.addColorStop(1, "yellowgreen");
  9. //3. 将渐变对象设为填充色
  10. context.fillStyle = gradient;
  11. //4. 画一个矩形
  12. context.fillRect(100, 100, 200, 280);

径向渐变

  1. //1. 创建渐变对象
  2. //内圆
  3. var c1 = {x: 260, y: 160, r: 0};
  4. //外圆
  5. var c2 = {x: 300, y: 200, r: 120};
  6. var gradient = context.createRadialGradient(c1.x, c1.y, c1.r, c2.x, c2.y, c2.r);
  7. gradient.addColorStop(0, "red");
  8. gradient.addColorStop(0.3, "yellow");
  9. gradient.addColorStop(0.6, "green");
  10. gradient.addColorStop(1, "orange");
  11. //2. 把渐变对象设为填充色
  12. context.fillStyle = gradient;
  13. //3. 画圆并填充
  14. //内圆的部分是用0的位置填充的; 内圆的边到外圆的边所发生的渐变叫, 径向渐变
  15. context.arc(c2.x, c2.y, c2.r, 0, 2*Math.PI);
  16. context.fill();

径向渐变画球

  1. //1. 创建一个径向渐变
  2. c1 = {x: 240, y: 160, r: 0};
  3. c2 = {x: 300, y: 200, r: 120};
  4. var gradient = context.createRadialGradient(c1.x, c1.y, c1.r, c2.x, c2.y, c2.r);
  5. gradient.addColorStop(1, "gray");
  6. gradient.addColorStop(0, "lightgray");
  7. //2. 将渐变对象设为填充色
  8. context.fillStyle = gradient;
  9. //3. 画圆并填充
  10. context.arc(c2.x, c2.y, c2.r, 0, 2*Math.PI);
  11. context.fill();

径向渐变画彩虹

  1. //实现彩虹,给里面的圆一个半径80是关键
  2. var c1 = {x: 300, y: 200, r: 80};
  3. var c2 = {x: 300, y: 200, r: 150};
  4. var gradient = context.createRadialGradient(c1.x, c1.y, c1.r, c2.x, c2.y, c2.r);
  5. gradient.addColorStop(1, "red");
  6. gradient.addColorStop(6/7, "orange");
  7. gradient.addColorStop(5/7, "yellow");
  8. gradient.addColorStop(4/7, "green");
  9. gradient.addColorStop(3/7, "cyan");
  10. gradient.addColorStop(2/7, "skyblue");
  11. gradient.addColorStop(1/7, "purple");
  12. gradient.addColorStop(0, "white");
  13. //设为填充色
  14. context.fillStyle = gradient;
  15. //画圆并填充
  16. context.arc(c2.x, c2.y, c2.r, 0, 2*Math.PI);
  17. context.fill();
  18. //遮挡下半部分
  19. context.fillStyle = "white";
  20. context.fillRect(0, 200, 600, 200);

阴影效果

  1. //和css3相比, 阴影只能设一个, 不能设内阴影
  2. //水平偏移, 垂直的偏移, 模糊程度, 阴影的颜色
  3. //设置阴影的参数
  4. context.shadowOffsetX = 10;
  5. context.shadowOffsetY = 10;
  6. context.shadowBlur = 10;
  7. context.shadowColor = "yellowgreen";
  8. //画一个矩形
  9. context.fillStyle = "red";
  10. context.fillRect(100, 100, 300, 200);

绘制文字api

  1. //绘制文字
  2. //text就是要绘制的文字, x, y就是从什么地方开始绘制
  3. //context.strokeText("text", x, y)
  4. context.font = "60px 微软雅黑";
  5. //context.strokeText("hello, world", 100, 100);
  6. context.fillText("hello, world", 100, 100);

文字对齐方式

  1. 基线在文字的那个方向

水平方向

  1. //默认在left
  2. //关键api:context.textAlign = "left";
  3. context.textAlign = "left";
  4. context.fillText("left", 300, 120);
  5. context.textAlign = "center";
  6. context.fillText("center", 300, 190);
  7. context.textAlign = "right";
  8. context.fillText("right", 300, 260);

实现文字在画布的右上方

  1. 1. 先设置right
  2. 2. canvas.width,0即可
  3. context.font = "60px 微软雅黑";
  4. context.textAlign = "right";
  5. context.textBaseline = "top";
  6. context.fillText("hello, world", canvas.width, 0);

垂直方向

  1. //默认是top
  2. //关键api:context.textBaseline = "top";
  3. context.fillText("default", 50, 200);
  4. context.textBaseline = "top";
  5. context.fillText("top", 150, 200);
  6. context.textBaseline = "middle";
  7. context.fillText("middle", 251, 200);
  8. context.textBaseline = "bottom";
  9. context.fillText("bottom", 400, 200);

图片的绘制

3参模式: 将img从x, y的地方开始绘制, 图片有多大,就绘制多大,超出canvas的部分就不显示了

  1. //context.drawImage(img, x, y)
  2. var image = new Image();
  3. image.src = "./img/gls.jpg";
  4. //必须要等到图片加载出来,才能进行绘制的操作
  5. image.onload = function () {
  6. context.drawImage(image, 100, 200);
  7. }

5参模式(缩放模式), 就是将图片显示在画布上的某一块区域(x, y, w, h),如果这个区域的宽高和图片不一至,会被压缩或放大

  1. var image = new Image();
  2. image.src = "./img/gls.jpg";
  3. image.onload = function () {
  4. context.drawImage(image, 100, 100, 100, 100);
  5. }

图片绘制的九参模式, 就是把原图(img)中的某一块(imagex,imagey,imagew,imageh)截取出来, 显示在画布的某个区域(canvasx, canvasy, canvasw, canvash)

  1. //理解关键:
  2. //(imagex,imagey,imagew,imageh)
  3. //(canvasx, canvasy, canvasw, canvash)
  4. var image = new Image();
  5. image.src = "./img/gls.jpg";
  6. image.onload = function () {
  7. /*
  8. 参数的解释:
  9. image: 就是大图片本身
  10. 中间的四个参数, 代表从图片的150, 0的位置,截取 150 * 200的一块区域
  11. 后面的四个参数, 将刚才截取的小图, 显示画布上 100, 100, 150, 200的这个区域
  12. */
  13. context.drawImage(image, 150, 0, 150, 200, 100, 100, 150, 200);
  14. }

画布中的放大器实现

判断位置的关键api:

  1. context.rect(0, 0, 150, 100);
  2. canvas.onmousemove = function (event) {
  3. var x = event.offsetX;
  4. var y = event.offsetY;
  5. }

  1. //1. 加载图片
  2. var image = new Image();
  3. image.src = "./img/gls.jpg";
  4. image.onload = function () {
  5. //1. 先把大图画在右上角
  6. context.drawImage(image, 0, 0, 150, 100);
  7. //创建一个矩形的路径
  8. context.rect(0, 0, 150, 100);
  9. //2. 判断当前鼠标是否hover到上面的图片上了
  10. canvas.onmousemove = function (event) {
  11. //原图和左上角的图的比例是3: 1
  12. var x = event.offsetX;
  13. var y = event.offsetY;
  14. //if (x >= 0 && x<=150 && y >=0 && y <= 100) {}
  15. //当前 x, y这个点的位置,是否在玻璃纸上的路径的区域的内部
  16. if (context.isPointInPath(x, y) == true) {
  17. console.log("在内部");
  18. //比例要按照原图的比例来看,这里的小图是原图的1/3,所以*3
  19. x = x * 3 - 20;
  20. y = y * 3 - 20;
  21. //每一次在画之前,先把之前画的擦除
  22. //某300, 200, 300, 200这个区域的东西全部擦除
  23. context.clearRect(300, 200, 300, 200);
  24. //从x, y这个点,截取40*40的局部小图,显示在图布, 300, 200, 80, 80这个区域,就形成了一个放大的效果
  25. //这里40,40,是因为上面-20的宽和高的原因
  26. context.drawImage(image, x, y, 40, 40, 300, 200, 120, 120);
  27. }
  28. else {
  29. console.log("不在内部");
  30. }
  31. }
  32. }

简单的用计时器实现小人移动

  1. //1. 加载图片
  2. var image = new Image();
  3. image.src = "./img/DMMban.png";
  4. image.onload = function () {
  5. //第几行图片
  6. var yindex = 2;
  7. //某一行的第几张图片
  8. var xindex = 0;
  9. //小人的宽和高
  10. var w = image.width/4;
  11. var h = image.height/4;
  12. //小人水平方向的坐标x值
  13. var x = 0;
  14. //小人每一步走多远
  15. var speed = 10;
  16. var index = 0;
  17. setInterval(function () {
  18. index += 1;
  19. //循环切换图片
  20. xindex = index % 4;
  21. //边界的判断
  22. if (x >= canvas.width - w) {
  23. speed = -speed; //-10
  24. yindex = 1;
  25. }
  26. if (x < 0) {
  27. speed = -speed;
  28. yindex = 2;
  29. }
  30. context.clearRect(0, 0, canvas.width, canvas.height);
  31. context.drawImage(image, xindex * w, yindex * h, w, h, x, 200, w, h);
  32. //每走一步x要往前移动
  33. x += speed;
  34. }, 200);
  35. }

画布的缩放,平移,旋转api

  1. context.scale(0.5, 0.5);
  2. context.translate(300, 200);
  3. context.rotate(30/180*Math.PI);

canvas的常用api的更多相关文章

  1. html5 canvas常用api总结(一)

    1.监听浏览器加载事件. window.addEventListener("load",eventWindowLoaded,false); load事件在html页面加载结束时发生 ...

  2. html5 canvas常用api总结(三)--图像变换API

    canvas的图像变换api,可以帮助我们更加方便的绘画出一些酷炫的效果,也可以用来制作动画.接下来将总结一下canvas的变换方法,文末有一个例子来更加深刻的了解和利用这几个api. 1.画布旋转a ...

  3. canvas学习之API整理笔记(二)

    前面我整理过一篇文章canvas学习之API整理笔记(一),从这篇文章我们已经可以基本了解到常用绘图的API.简单的变换和动画.而本篇文章的主要内容包括高级动画.像素操作.性能优化等知识点,讲解每个知 ...

  4. Selenium Web 自动化 - Selenium常用API

    Selenium Web 自动化 - Selenium常用API 2016-08-01 目录 1 对浏览器操作  1.1 用webdriver打开一个浏览器  1.2 最大化浏览器&关闭浏览器 ...

  5. compass General 常用api学习[Sass和compass学习笔记]

    compass 中一些常用api 包括一些浏览器hack @import "compass/utilities/general" Clearfix Clearfix 是用来清除浮动 ...

  6. java基础3.0:Java常用API

    本篇介绍Java基础中常用API使用,当然只是简单介绍,围绕重要知识点引入,巩固开发知识,深入了解每个API的使用,查看JavaAPI文档是必不可少的. 一.java.lang包下的API Java常 ...

  7. 通过Canvas及File API缩放并上传图片完整示例

    <!DOCTYPE html> <html> <head> <title>通过Canvas及File API缩放并上传图片</title> ...

  8. C++ 中超类化和子类化常用API

    在windows平台上,使用C++实现子类化和超类化常用的API并不多,由于这些API函数的详解和使用方法,网上一大把.本文仅作为笔记,简单的记录一下. 子类化:SetWindowLong,GetWi ...

  9. node.js整理 02文件操作-常用API

    NodeJS不仅能做网络编程,而且能够操作文件. 拷贝 小文件拷贝 var fs = require('fs'); function copy(src, dst) { fs.writeFileSync ...

随机推荐

  1. javaee IO流打印一行的方式

    package Dayin; import java.io.BufferedReader; import java.io.FileNotFoundException; import java.io.F ...

  2. snv报错

    ERROR svn: E160028: Commit failed svn出现上面错误,先更新再提交即可解决.

  3. java中为什么不允许类多重继承,却允许接口多重继承

    首先看下面这一段代码:(底下有热心网友更正,jdk1.8之后情况确实有点变化,等改天有空继续更) interface a{ void b();}interface a1 extends a{ void ...

  4. 【转载】java实现HTTP请求的三种方式

    目前JAVA实现HTTP请求的方法用的最多的有两种:一种是通过HTTPClient这种第三方的开源框架去实现.HTTPClient对HTTP的封装性比较不错,通过它基本上能够满足我们大部分的需求,Ht ...

  5. python 从Excel中取值

    import openpyxl from openpyxl import load_workbook def open_file(file_path): workbook = load_workboo ...

  6. HTML学习笔记之基本介绍

    超文本标记语言 (Hyper Text Markup Language,HTML)不是一种编程语言,而是一种标记语言,用一套标记标签描述网页 HTML 标记标签又被称为 HTML 标签(HTML Ta ...

  7. javascript/jquery获取地址栏url参数的方法

    1.jquery获取url window.location.href; 2.通过javascript是如何获取url中的某个参数 function getUrlParam(name) { var re ...

  8. 继续聊WPF——Expander控件(1)

    这个控件最实用的地方,就是做导航栏. <StackPanel Margin="20,20" Width="100" Height="460&qu ...

  9. BABEL转码解惑

    众所周知,解决Nodejs异步问题的终极方案就是使用async/await方案,但是每次在项目中配置都会或多或少有些问题,每次都会被几个组件 babel-core babel-polyfill bab ...

  10. dubbo-源码阅读之bean装配过程(四)

    Spring自定义schema 我们再使用dubbo进行时 会经常看到这样的标签 <!--开启注解扫描--> <context:component-scan base-package ...