基础知识
- 屏幕尺寸问题:
- 浏览器坐标系
注意:在canvas中绘制图形是在canvas坐标系中,canvas样式显示是另一个概念 canvas的width、height属性是设置的坐标系的宽高,style的width、height设置的是显示大小(逻辑像素)
圆环效果图
圆环进度条代码
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>canvas</title>
<style>
</style>
</head>
<body>
<canvas id="canvas" width="500" height="500" style="background:#F7F7F7;">
<p>you browser not support canvas!</p>
</canvas>
<script>
let canvas = document.getElementById('canvas'), //获取canvas元素
context = canvas.getContext('2d'), //获取画图环境,指明为2d
centerX = canvas.width / 2, //Canvas中心点x轴坐标
centerY = canvas.height / 2, //Canvas中心点y轴坐标
r = 100, // 半径
rad = Math.PI * 2 / 100, //将360度分成100份,那么每一份就是rad度
colorArr = ['blue', 'yellow', 'red'], //渐变色
speed = 0.1; //加载的快慢就靠它了
//绘制变化外圈
function LinearCircle(n) {
let color = LinearGradient(n) // 获取颜色值
context.save();
context.beginPath();
context.strokeStyle = color;
context.lineWidth = 12;
context.arc(centerX, centerY, r, -Math.PI / 2, -Math.PI / 2 + n * rad, false);
context.stroke();
context.restore();
}
//绘制外圈
function whiteCircle() {
context.save();
context.beginPath();
context.strokeStyle = "#A5DEF1";
context.lineWidth = 12;
context.arc(centerX, centerY, r, 0, Math.PI * 2, false);
context.stroke();
context.closePath();
context.restore();
}
//百分比文字绘制
function text(n) {
context.save();
context.fillStyle = "#F47C7C";
context.font = "40px Arial";
context.textAlign = "center";
context.textBaseline = "middle";
context.fillText(n.toFixed(0) + "%", centerX, centerY);
context.restore();
}
/*
* 设置渐变色
*/
function LinearGradient(n) {
let ga = -Math.PI / 2 + n * rad;
// 找到圆环上的坐标
let gd = [
centerX + r * (1 - Math.cos(ga)), // x0
centerY + r * (1 + Math.sin(ga)), // y0
centerX + r * (1 + Math.cos(ga)), // x1
centerY + r * (1 - Math.sin(ga)) // y1
];
let lg = context.createLinearGradient.apply(context, gd);
for (var i = 0; i < colorArr.length; i++) {
var color = colorArr[i],
pos = i / (colorArr.length - 1);
lg.addColorStop(pos, color);
}
return lg;
}
//动画循环
(function drawFrame() {
window.requestAnimationFrame(drawFrame);
context.clearRect(0, 0, canvas.width, canvas.height);
whiteCircle();
text(speed);
LinearCircle(speed);
if (speed > 100) speed = 0;
speed += 0.1;
}())
</script>
</body>
</html>
圆弧效果图
圆弧代码
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>canvas</title>
<style>
</style>
</head>
<body>
<canvas id="canvas" width="500" height="500" style="background:#F7F7F7;">
<p>you browser not support canvas!</p>
</canvas>
<script>
let canvas = document.getElementById('canvas'), //获取canvas元素
context = canvas.getContext('2d'), //获取画图环境,指明为2d
centerX = canvas.width / 2, //Canvas中心点x轴坐标
centerY = canvas.height / 2, //Canvas中心点y轴坐标
r = 100, // 半径
rad = Math.PI / 100, //将360度分成100份,那么每一份就是rad度
colorArr = ['blue', 'yellow', 'red'], //渐变色
speed = 0.1, //加载的快慢就靠它了
start = -Math.PI, //起始点
end = 0; //结束点
//绘制变化外圈
function LinearCircle(n) {
let color = LinearGradient(n) // 获取颜色值
context.save();
context.beginPath();
context.strokeStyle = color;
context.lineWidth = 12;
context.arc(centerX, centerY, r,start, start + n * rad, false);
context.stroke();
context.restore();
}
//绘制外圈
function whiteCircle() {
context.save();
context.beginPath();
context.strokeStyle = "#A5DEF1";
context.lineWidth = 12;
context.arc(centerX, centerY, r, start, end, false);
context.stroke();
context.closePath();
context.restore();
}
//百分比文字绘制
function text(n) {
context.save();
context.fillStyle = "#F47C7C";
context.font = "40px Arial";
context.textAlign = "center";
context.textBaseline = "middle";
context.fillText(n.toFixed(0) + "%", centerX, centerY-25);
context.restore();
}
/*
* 设置渐变色
*/
function LinearGradient(n) {
let ga = start + n * rad;
// 找到圆环上的坐标
let gd = [
centerX + r * (1 + Math.cos(ga)), // x1
centerY + r * (1 - Math.sin(ga)), // y1
centerX + r * (1 - Math.cos(ga)), // x0
centerY + r * (1 + Math.sin(ga)), // y0
];
let lg = context.createLinearGradient.apply(context, gd);
for (var i = 0; i < colorArr.length; i++) {
var color = colorArr[i],
pos = i / (colorArr.length - 1);
lg.addColorStop(pos, color);
}
return lg;
}
//动画循环
(function drawFrame() {
window.requestAnimationFrame(drawFrame);
context.clearRect(0, 0, canvas.width, canvas.height);
whiteCircle();
text(speed);
LinearCircle(speed);
if (speed > 100) speed = 0;
speed += 0.1;
}())
</script>
</body>
</html>
注意:以上代码中context.save()、context.restore()必须要注意:它用来保存上下文的操作,否则会后面的会把前面的覆盖