JavaScript HTML5-Canvas - Drawing an Arc with SetInterval Causes Jagged Edges(JavaScript HTML5-Canvas - 使用 SetInterval 绘制弧会导致锯齿状边缘)
问题描述
我正在尝试绘制一个圆环图,到目前为止我已经成功了.问题是,当尝试通过将 stroke()
与 setInterval()
组合来为弧设置动画时,它可以工作,但看起来并不平滑,并且会产生锯齿状的边缘.我尝试在动画完成后使用 clearRect()
清除画布并重新添加动画的最终版本,但我一定是使用 clearRect()
错误,因为它什么也没做.如果您对如何使它看起来更好有任何想法,我将不胜感激.
I'm trying to draw a donut chart, and so far I've been successful. The problem is that when trying to animate the arc by combining stroke()
with setInterval()
, it works, but it does not look smooth, and produces jagged edges. I tried using clearRect()
to clear the canvas after the animation was done and re-add the final version of the animation, but I must have been using clearRect()
wrong, because it did nothing. If you have any ideas on how to get this looking good, I'd really appreciate it.
您可以在 jsfiddle 上查看我当前的代码:http://jsfiddle.net/4mJCy/ 及以下:
You can see my current code on jsfiddle: http://jsfiddle.net/4mJCy/ and below:
主体:
<canvas id="Donutchart" width="215" height="500" style="border:1px solid #000;">
Your browser does not support the HTML5 canvas tag. Please Upgrade to the latest version of Chrome, Firefox, or Safari.</canvas>
JavaScript:
JavaScript:
var canvas=document.getElementById("Donutchart");
var maincircle=canvas.getContext("2d");
maincircle.beginPath();
maincircle.arc(107,107,100,0,2*Math.PI);
maincircle.fillStyle="#FF0000";
maincircle.fill();
var currentEndAngle = 1.5;
var currentStartAngle = 1.5;
var pie1 = setInterval(draw, 15);
var counter = 0;
function draw(){
if(counter >= 101){
} else {
var startAngle = currentStartAngle * Math.PI;
var endAngle = (currentEndAngle) * Math.PI;
currentEndAngle = currentEndAngle + 0.01;
var counterClockwise = false;
var donutslice1=canvas.getContext("2d");
donutslice1.beginPath();
donutslice1.arc(107,107,75,startAngle,endAngle);
donutslice1.lineWidth = 50;
donutslice1.strokeStyle="#222";
donutslice1.stroke();
}
counter++;
}
var innercircle=canvas.getContext("2d");
innercircle.beginPath();
innercircle.arc(107,107,50,0,2*Math.PI);
innercircle.fillStyle="#FFF";
innercircle.fill();
推荐答案
锯齿是由于反复覆盖你的弧造成的.
The jaggies are caused by repeatedly over-writing your arcs.
相反,重构您的代码以在每个动画循环中清除画布.
Instead, refactor your code to clear the canvas with each animation loop.
一个演示:http://jsfiddle.net/m1erickson/xNLEQ/
类似这样的:
<!doctype html>
<html>
<head>
<link rel="stylesheet" type="text/css" media="all" href="css/reset.css" /> <!-- reset css -->
<script type="text/javascript" src="aHR0cDovL2NvZGUuanF1ZXJ5LmNvbS9qcXVlcnkubWluLmpz"></script>
<style>
body{ background-color: white; }
canvas{border:1px solid red;}
</style>
<script>
$(function(){
var canvas=document.getElementById("canvas");
var ctx=canvas.getContext("2d");
var currentEndAngle = 1.5;
var currentStartAngle = 1.5;
var pie1 = setInterval(draw, 15);
var counter = 0;
function draw(){
if(counter >= 101){
} else {
var startAngle = currentStartAngle * Math.PI;
var endAngle = (currentEndAngle) * Math.PI;
currentEndAngle = currentEndAngle + 0.01;
var counterClockwise = false;
ctx.clearRect(0,0,canvas.width,canvas.height);
// red
drawCircle(75,"#FF0000");
// gray
drawDonut(startAngle,endAngle);
}
counter++;
}
//
function drawDonut(startAngle,endAngle){
ctx.beginPath();
ctx.arc(107,107,75,startAngle,endAngle);
ctx.lineWidth = 50;
ctx.strokeStyle="#444";
ctx.stroke();
}
//
function drawCircle(radius,color){
ctx.beginPath();
ctx.arc(107,107,radius,0,2*Math.PI);
ctx.lineWidth = 50;
ctx.strokeStyle=color;
ctx.stroke();
}
}); // end $(function(){});
</script>
</head>
<body>
<canvas id="canvas" width=300 height=300></canvas>
</body>
</html>
这篇关于JavaScript HTML5-Canvas - 使用 SetInterval 绘制弧会导致锯齿状边缘的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:JavaScript HTML5-Canvas - 使用 SetInterval 绘制弧会导致锯齿状边缘


- 使用RSelum从网站(报纸档案)中抓取多个网页 2022-09-06
- Flexslider 箭头未正确显示 2022-01-01
- CSS媒体查询(最大高度)不起作用,但为什么? 2022-01-01
- 如何使用 JSON 格式的 jQuery AJAX 从 .cfm 页面输出查 2022-01-01
- Quasar 2+Apollo:错误:找不到ID为默认的Apollo客户端。如果您在组件设置之外,请使用ProvideApolloClient() 2022-01-01
- Css:将嵌套元素定位在父元素边界之外一点 2022-09-07
- addEventListener 在 IE 11 中不起作用 2022-01-01
- Fetch API 如何获取响应体? 2022-01-01
- 失败的 Canvas 360 jquery 插件 2022-01-01
- 400或500级别的HTTP响应 2022-01-01