python canvas教程_Canvas
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相关推荐
- Python学习教程:Python爬虫抓取技术的门道
Python学习教程:Python爬虫抓取技术的门道 web是一个开放的平台,这也奠定了web从90年代初诞生直至今日将近30年来蓬勃的发展.然而,正所谓成也萧何败也萧何,开放的特性.搜索引擎以及简单 ...
- 给深度学习入门者的Python快速教程 - 番外篇之Python-OpenCV
转载自:https://zhuanlan.zhihu.com/p/24425116 本篇是前面两篇教程:给深度学习入门者的Python快速教程 - 基础篇 给深度学习入门者的Python快速教程 - ...
- Python基础教程,Python入门教程
Python 是一门上手简单.功能强大.通用型的脚本编程语言.Python 类库极其丰富,这使得 Python 几乎无所不能,网站开发.软件开发.大数据分析.网络爬虫.机器学习等都不在话下. 这套 P ...
- Python入门教程出炉:Day21-30_Web前端概述
Python入门教程出炉:Day21-30_Web前端概述 [说明]:本文使用的部分插图来自Jon Duckett先生的HTML and CSS: Design and Build Websites一 ...
- python简明教程word版-计算机开放电子书归档 2018
97 Things Every Programmer Should Know A Java Reference (UCB CS61b Textbook) AI Cheat Sheet Advanced ...
- Python培训教程:Python有哪些比较重要的内置函数?
学习Python技术或者参加Python工作的小伙伴们应该都知道,在Python编程语言中会经常出现很多内置函数,很少有人清楚这些函数,但是它的功能是不可小觑的,下面小编就为大家详细介绍一下Pytho ...
- Python培训教程分享:10款超好用的Python开发工具
学会Python技术后,我们在参加工作的时候如果能有辅助工具的话,那么会很大程度的提高我们的工作效率,那么Python都有哪些好用的开发工具呢?下面小编就为大家详细的介绍一下10款超好用的Python ...
- Python培训教程分享:Python异常机制
在学习Python技术的时候,我们经常会遇到一些异常,例如导致程序在运行过程中出现的中断或退出,我们都称之为异常,大多数的异常都不会被程序处理,而是以错误信息的形式展现出来.本期Python培训教 ...
- Python培训教程分享:有哪些值得使用的爬虫开源项目?
相信很多同学在学习Python技术的时候,都有学习到Python爬虫技术,爬虫技术在各大互联网公司都是非常常见的,可以帮助我们获取各种网站的信息,比如微博.B站.知乎等,本篇Python培训教程分享为 ...
最新文章
- Nginx+Firebug 让浏览器告诉你负载均衡将请求分到了哪台服务器
- Android控件扫光动画,完美起航-AndroidTV控件获得焦点的扫光效果
- mysql的limit和or_面试官:谈谈MySQL的limit用法、逻辑分页和物理分页
- 面对想法简单客户的有效需求分析
- guid怎么做到唯一_怎么做成为一个好女人呢?
- 将表达式树转换成中缀表达式☆
- Ajax:前台利器—Ajax
- Web API-DOM事件高级
- MongoDB University课程M103 Basic Cluster Administration 学习笔记
- 微信公众号开发之网页授权
- 基于51单片机智能小车的设计与实现
- Tableau5——地图,仪表板
- win7突然提示“windows无法连接到xxx”、thinkpad键盘触摸板失效解决
- 【阿里天猫精灵专题】TB-02 RGB冷暖灯控制
- 强基计划 数学相关书籍 推荐
- Java实现word文档转换为pdf,jodconverter
- html输入日期算出星座,通过日期计算星座
- 运城学院计算机课,主讲教师
- MySQL的COUNT语句暗藏玄机
- 以用户的角度看待应用推广渠道
热门文章
- Fat Jar说明【官方】
- GreenDao Currently only single FK columns are supported: ToOne ‘dpObjectsDB‘
- Tiller pods can‘t connect to k8s apiserver,dial tcp 10.254.0.1:443: no route to host
- GAN深度强化学习1
- (Erlang语言)运行时中的无锁队列及其在异步线程中的应用
- linux内核中的address_space 结构解析
- echarts x轴换行
- hive小文件过多问题解决
- 东南亚的招聘骗局,程序员请注意!
- Java Kafka 消费积压监控