Canvas是HTML5新增的组件,它就像一块幕布,可以用JavaScript在上面绘制各种图表、动画等。

没有Canvas的年代,绘图只能借助Flash插件实现,页面不得不用JavaScript和Flash进行交互。有了Canvas,我们就再也不需要Flash了,直接使用JavaScript完成绘制。

一个Canvas定义了一个指定尺寸的矩形框,在这个范围内我们可以随意绘制:

由于浏览器对HTML5标准支持不一致,所以,通常在内部添加一些说明性HTML代码,如果浏览器支持Canvas,它将忽略内部的HTML,如果浏览器不支持Canvas,它将显示内部的HTML:

Current Price: 25.51

在使用Canvas前,用canvas.getContext来测试浏览器是否支持Canvas:

你的浏览器不支持Canvas

你的浏览器不支持Canvas

'use strict';

----

var canvas = document.getElementById('test-canvas');

if (canvas.getContext) {

console.log('你的浏览器支持Canvas!');

} else {

console.log('你的浏览器不支持Canvas!');

}

getContext('2d')方法让我们拿到一个CanvasRenderingContext2D对象,所有的绘图操作都需要通过这个对象完成。

var ctx = canvas.getContext('2d');

如果需要绘制3D怎么办?HTML5还有一个WebGL规范,允许在Canvas中绘制3D图形:

gl = canvas.getContext("webgl");

本节我们只专注于绘制2D图形。

绘制形状

我们可以在Canvas上绘制各种形状。在绘制前,我们需要先了解一下Canvas的坐标系统:

Canvas的坐标以左上角为原点,水平向右为X轴,垂直向下为Y轴,以像素为单位,所以每个点都是非负整数。

CanvasRenderingContext2D对象有若干方法来绘制图形:

'use strict';

var

canvas = document.getElementById('test-shape-canvas'),

ctx = canvas.getContext('2d');

----

ctx.clearRect(0, 0, 200, 200); // 擦除(0,0)位置大小为200x200的矩形,擦除的意思是把该区域变为透明

ctx.fillStyle = '#dddddd'; // 设置颜色

ctx.fillRect(10, 10, 130, 130); // 把(10,10)位置大小为130x130的矩形涂色

// 利用Path绘制复杂路径:

var path=new Path2D();

path.arc(75, 75, 50, 0, Math.PI*2, true);

path.moveTo(110,75);

path.arc(75, 75, 35, 0, Math.PI, false);

path.moveTo(65, 65);

path.arc(60, 65, 5, 0, Math.PI*2, true);

path.moveTo(95, 65);

path.arc(90, 65, 5, 0, Math.PI*2, true);

ctx.strokeStyle = '#0000ff';

ctx.stroke(path);

绘制文本

绘制文本就是在指定的位置输出文本,可以设置文本的字体、样式、阴影等,与CSS完全一致:

'use strict';

var

canvas = document.getElementById('test-text-canvas'),

ctx = canvas.getContext('2d');

----

ctx.clearRect(0, 0, canvas.width, canvas.height);

ctx.shadowOffsetX = 2;

ctx.shadowOffsetY = 2;

ctx.shadowBlur = 2;

ctx.shadowColor = '#666666';

ctx.font = '24px Arial';

ctx.fillStyle = '#333333';

ctx.fillText('带阴影的文字', 20, 40);

Canvas除了能绘制基本的形状和文本,还可以实现动画、缩放、各种滤镜和像素转换等高级操作。如果要实现非常复杂的操作,考虑以下优化方案:

通过创建一个不可见的Canvas来绘图,然后将最终绘制结果复制到页面的可见Canvas中;

尽量使用整数坐标而不是浮点数;

可以创建多个重叠的Canvas绘制不同的层,而不是在一个Canvas中绘制非常复杂的图;

背景图片如果不变可以直接用标签并放到最底层。

练习

请根据从163获取的JSON数据绘制最近30个交易日的K线图,数据已处理为包含一组对象的数组:

window.drawStock = function (data) {

var

canvas = document.getElementById('stock-canvas'),

MAX_X = canvas.width,

MAX_Y = canvas.height,

ctx = canvas.getContext('2d');

var low = data.reduce(function (prev, x) {

return x.low < prev.low ? x : prev;

});

var high = data.reduce(function (prev, x) {

return x.high > prev.high ? x : prev;

});

var chg = high.high - low.low;

// index range:

var lowest = Math.floor(low.low - chg * 0.1);

var highest = Math.floor(high.high + chg * 0.1 + 1);

var calcY = function (idx) {

return MAX_Y * (highest - idx) / (highest - lowest);

};

var drawAtX = function (x, k) {

var

tmp,

y1 = calcY(k.open),

y2 = calcY(k.close);

if (y1 > y2) {

tmp = y1;

y1 = y2;

y2 = tmp;

}

ctx.fillStyle = (k.open > k.close) ? '#00ff00' : '#ff0000';

ctx.fillRect(x, calcY(k.high), 1, calcY(k.low) - calcY(k.high));

ctx.fillRect(x-2, y1, 5, y2 - y1);

};

ctx.clearRect(0, 0, MAX_X, MAX_Y);

ctx.font = '12px serif';

ctx.textAlign = 'right';

ctx.fillStyle = '#000000';

ctx.fillText(String(Math.floor(high.high)), 40, 15);

ctx.fillText(String(Math.floor(low.low)), 40, MAX_Y - 20);

var i, x;

for (i=0; i

x = i * 8 + 50;

drawAtX(x, data[i]);

}

};

'use strict';

window.loadStockData = function (r) {

var

NUMS = 30,

data = r.data;

if (data.length > NUMS) {

data = data.slice(data.length - NUMS);

}

data = data.map(function (x) {

return {

date: x[0],

open: x[1],

close: x[2],

high: x[3],

low: x[4],

vol: x[5],

change: x[6]

};

});

window.drawStock(data);

}

window.drawStock = function (data) {

----

var

canvas = document.getElementById('stock-canvas'),

width = canvas.width,

height = canvas.height,

ctx = canvas.getContext('2d');

console.log(JSON.stringify(data[0])); // {"date":"20150602","open":4844.7,"close":4910.53,"high":4911.57,"low":4797.55,"vol":62374809900,"change":1.69}

ctx.clearRect(0, 0, width, height);

ctx.fillText('Test Canvas', 10, 10);

----

};

// 加载最近30个交易日的K线图数据:

var js = document.createElement('script');

js.src = 'http://img1.money.126.net/data/hs/kline/day/history/2015/0000001.json?callback=loadStockData&t=' + Date.now();

document.getElementsByTagName('head')[0].appendChild(js);

python canvas教程_Canvas相关推荐

  1. Python学习教程:Python爬虫抓取技术的门道

    Python学习教程:Python爬虫抓取技术的门道 web是一个开放的平台,这也奠定了web从90年代初诞生直至今日将近30年来蓬勃的发展.然而,正所谓成也萧何败也萧何,开放的特性.搜索引擎以及简单 ...

  2. 给深度学习入门者的Python快速教程 - 番外篇之Python-OpenCV

    转载自:https://zhuanlan.zhihu.com/p/24425116 本篇是前面两篇教程:给深度学习入门者的Python快速教程 - 基础篇 给深度学习入门者的Python快速教程 - ...

  3. Python基础教程,Python入门教程

    Python 是一门上手简单.功能强大.通用型的脚本编程语言.Python 类库极其丰富,这使得 Python 几乎无所不能,网站开发.软件开发.大数据分析.网络爬虫.机器学习等都不在话下. 这套 P ...

  4. Python入门教程出炉:Day21-30_Web前端概述

    Python入门教程出炉:Day21-30_Web前端概述 [说明]:本文使用的部分插图来自Jon Duckett先生的HTML and CSS: Design and Build Websites一 ...

  5. python简明教程word版-计算机开放电子书归档 2018

    97 Things Every Programmer Should Know A Java Reference (UCB CS61b Textbook) AI Cheat Sheet Advanced ...

  6. Python培训教程:Python有哪些比较重要的内置函数?

    学习Python技术或者参加Python工作的小伙伴们应该都知道,在Python编程语言中会经常出现很多内置函数,很少有人清楚这些函数,但是它的功能是不可小觑的,下面小编就为大家详细介绍一下Pytho ...

  7. Python培训教程分享:10款超好用的Python开发工具

    学会Python技术后,我们在参加工作的时候如果能有辅助工具的话,那么会很大程度的提高我们的工作效率,那么Python都有哪些好用的开发工具呢?下面小编就为大家详细的介绍一下10款超好用的Python ...

  8. Python培训教程分享:Python异常机制

    ​ 在学习Python技术的时候,我们经常会遇到一些异常,例如导致程序在运行过程中出现的中断或退出,我们都称之为异常,大多数的异常都不会被程序处理,而是以错误信息的形式展现出来.本期Python培训教 ...

  9. Python培训教程分享:有哪些值得使用的爬虫开源项目?

    相信很多同学在学习Python技术的时候,都有学习到Python爬虫技术,爬虫技术在各大互联网公司都是非常常见的,可以帮助我们获取各种网站的信息,比如微博.B站.知乎等,本篇Python培训教程分享为 ...

最新文章

  1. Nginx+Firebug 让浏览器告诉你负载均衡将请求分到了哪台服务器
  2. Android控件扫光动画,完美起航-AndroidTV控件获得焦点的扫光效果
  3. mysql的limit和or_面试官:谈谈MySQL的limit用法、逻辑分页和物理分页
  4. 面对想法简单客户的有效需求分析
  5. guid怎么做到唯一_怎么做成为一个好女人呢?
  6. 将表达式树转换成中缀表达式☆
  7. Ajax:前台利器—Ajax
  8. Web API-DOM事件高级
  9. MongoDB University课程M103 Basic Cluster Administration 学习笔记
  10. 微信公众号开发之网页授权
  11. 基于51单片机智能小车的设计与实现
  12. Tableau5——地图,仪表板
  13. win7突然提示“windows无法连接到xxx”、thinkpad键盘触摸板失效解决
  14. 【阿里天猫精灵专题】TB-02 RGB冷暖灯控制
  15. 强基计划 数学相关书籍 推荐
  16. Java实现word文档转换为pdf,jodconverter
  17. html输入日期算出星座,通过日期计算星座
  18. 运城学院计算机课,主讲教师
  19. MySQL的COUNT语句暗藏玄机
  20. 以用户的角度看待应用推广渠道

热门文章

  1. Fat Jar说明【官方】
  2. GreenDao Currently only single FK columns are supported: ToOne ‘dpObjectsDB‘
  3. Tiller pods can‘t connect to k8s apiserver,dial tcp 10.254.0.1:443: no route to host
  4. GAN深度强化学习1
  5. (Erlang语言)运行时中的无锁队列及其在异步线程中的应用
  6. linux内核中的address_space 结构解析
  7. echarts x轴换行
  8. hive小文件过多问题解决
  9. 东南亚的招聘骗局,程序员请注意!
  10. Java Kafka 消费积压监控