由于公司业务需要,要用canvas,实现一些比较炫酷的效果,所以这段时间领导让学canvas,正好个人想用canvas做个网站宠物,给以后自己的个人博客用,所以两全其美,就开始了。
需要的基础知识:
(1)html5 css3 javascript 这三个里面主要是要用js 个人觉得以前学的够用,就不复习了,直接上手。
(2)一些数学公式 三角函数 sin cos神马的 重力 a=mv² 用到了再复习
记下今天要记住的点吧
1. canvas的元素大小和绘图面积大小,尽量不要使用css修改canvas的元素大小,因为当css指定的元素大小和绘图面积大小不一 致时,浏览器会自动调整canvas的绘图面积大小 至与 css指定的canvas的元素大小一致,会导致和效果不一样。
2. 性能调试工具
chrome develope tools,jsperf.com javacript的性能调制工具
这是今天做的一个小案例 small clock
html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>canvas练习</title>
</head>
<style type="text/css">
body{
background:#dddddd;
}
#canvas_scene{
margin:10px;
padding:10px;
background:#ffffff;
border:thin inset#aaaaaa;
/*width:600px;*/
/*height:500px;*/
}
</style>
<body>
<canvas id="canvas_scene">
你的浏览器不支持canvas
</canvas>
</body>
<!-- <script type="text/javascript" src="sample.js"></script> -->
<script type="text/javascript" src="./20160422p_1.js"></script>
</html>
js
var canvas = document.getElementById('canvas_scene');
// canvas.width = 500;
// canvas.height = 300;
context = canvas.getContext('2d');
//设置一些配置常量
FONT_HEIGHT = 10;
MARGIN = 100;
HAND_TRUNCATION = canvas.width/25;
HOUR_HAND_TRUNCATION = canvas.width/10;
NUMERAL_SPACING = 20;
RADIUS = canvas.width/2-MARGIN;
HAND_RADIUS = RADIUS+NUMERAL_SPACING;
//画圆
function drawCircle()
{
context.beginPath();
context.arc(canvas.width/2,canvas.height/2,RADIUS,0,Math.PI*2,true);
context.stroke();
}
//画时钟上的数字
// function drawNumerals()
// {
// var numerals = [1,2,3,4,5,6,7,8,9,10,11,12];
// angle = 0;
// numeralWith = 0;
// numerals.forEach(function(numeral){
// angle = 0;
// numeralWidth = context.measureText(numeral).width;
// context.fillText(numeral,
// canvas.width/2+Math.cos(angle)*(HAND_RADIUS)-numeralWidth/2,
// canvas.height/2+Math.sin(angle)*(HAND_RADIUS)+FONT_HEIGHT/3
// );
// });
// }
function drawNumerals(){
var numerals=[1,2,3,4,5,6,7,8,9,10,11,12],
angle=0,
numeralWidth=0;
numerals.forEach(function(numeral){
angle=Math.PI/6*(numeral-3); //一个小时走多少角度(没有理解)
numeralWidth=context.measureText(numeral).width; //字体宽度
context.fillText(numeral, //绘制
canvas.width/2+Math.cos(angle)*(HAND_RADIUS)-
numeralWidth/2,
canvas.height/2+Math.sin(angle)*(HAND_RADIUS)+
FONT_HEIGHT/3);
});
}
//画表中心
function drawCenter()
{
context.beginPath();
context.arc(canvas.width/2,canvas.height/2,2,0,Math.PI*2,true);
context.fill();
}
//画指针(需要重新理解下)
function drawHand(loc,isHour)
{
var angle = (Math.PI*2)*(loc/60)-Math.PI/2,
handRadius = isHour?RADIUS-HAND_TRUNCATION-HOUR_HAND_TRUNCATION:RADIUS-HAND_TRUNCATION;
context.moveTo(canvas.width/2,canvas.height/2);
context.lineTo(canvas.width/2+Math.cos(angle)*handRadius,
canvas.height/2+Math.sin(angle)*handRadius);
context.stroke();
}
// function drawHand(loc, isHour) {
// var angle = (Math.PI*2) * (loc/60) - Math.PI/2,
// handRadius = isHour ? RADIUS - HAND_TRUNCATION-HOUR_HAND_TRUNCATION
// : RADIUS - HAND_TRUNCATION;
// context.moveTo(canvas.width/2, canvas.height/2);
// context.lineTo(canvas.width/2 + Math.cos(angle)*handRadius,
// canvas.height/2 + Math.sin(angle)*handRadius);
// context.stroke();
// }
function drawHands()
{
var date = new Date,
hour = date.getHours();
hour = hour>12?hour-12:hour;
drawHand(hour*5+(date.getMinutes()/60)*5,true,0.5);
drawHand(date.getMinutes(),false,0.5);
drawHand(date.getSeconds(),false,0.2);
}
function drawClock()
{
context.clearRect(0,0,canvas.width,canvas.height);
drawCircle();
drawCenter();
drawHands();
drawNumerals();
}
// drawNumerals();
// drawCircle();
// drawCenter();
// drawHand(12,0);
// drawHands();
context.font=FONT_HEIGHT+'px Arial';
loop=setInterval(drawClock,1000);
虽然是个简单的案例但是还有些地方没看懂,比如画指针的地方,指针角度的计算过程(sin cos 弧度角 高中学的都还给老师了明天再复习下)
今天先到这里