·您当前的位置:主页 > 技术教程 > Html5技术 >

[html5]一个用html5的canvas写的“转盘”

时间:2014-12-19 13:48酷播
在一些不支持flash的设备中,如果要使用网页需要对一些图表数据进行展示,Canvas能帮上大忙。[html5]一个用html5的canvas写的“转盘”

在一些不支持flash的设备中,如果要使用网页需要对一些图表数据进行展示,Canvas能帮上大忙。

比如需要将股票价格的走势支持ipad、iphone等移动设备的访问,有一个基于prototype的插件可以满足类似的需求,官网网址>>

还有一个站点,针对canvas开发的一套完整的api,也是很强劲,官网地址>>

一个用canvas写的“转盘”,点击在线预览示例效果:

  1. <input type="button" value="开始旋转" onclick="spin();" style="float: left;" /> <meta http-equiv="Content-Type" content="text/html;charset=utf-8" />  <canvas id="wheelcanvas" width="500" height="500"></canvas>  <script type="application/javascript">  
  2.   var colors = ["#B8D430", "#3AB745", "#029990", "#3501CB", 
  3.                "#2E2C75", "#673A7E", "#CC0071", "#F80120", 
  4.                "#F35B20", "#FB9A00", "#FFCC00", "#FEF200"]; 
  5.   var restaraunts = ["北京", "上海", "天津", "南京", 
  6.                      "杭州", "深圳", "武汉", "济南", 
  7.                      "重庆", "大连", "合肥", "郑洲"]; 
  8.    
  9.   var startAngle = 0
  10.   var arc = Math.PI / 6; 
  11.   var spinTimeout = null
  12.    
  13.   var spinArcStart = 10
  14.   var spinTime = 0
  15.   var spinTimeTotal = 0
  16.    
  17.   var ctx; 
  18.    
  19.   function draw() { 
  20.     drawRouletteWheel(); 
  21.   } 
  22.    
  23.   function drawRouletteWheel() { 
  24.     var canvas = document.getElementById("wheelcanvas"); 
  25.     if (canvas.getContext) { 
  26.       var outsideRadius = 200
  27.       var textRadius = 160
  28.       var insideRadius = 125
  29.        
  30.       ctx = canvas.getContext("2d"); 
  31.       ctx.clearRect(0,0,500,500); 
  32.        
  33.        
  34.       ctx.strokeStyle = "black"
  35.       ctx.lineWidth = 2
  36.        
  37.       ctx.font = 'bold 12px sans-serif'
  38.        
  39.       for(var i = 0; i < 12; i++) { 
  40.         var angle = startAngle + i * arc; 
  41.         ctx.fillStyle = colors[i]; 
  42.          
  43.         ctx.beginPath(); 
  44.         ctx.arc(250, 250, outsideRadius, angle, angle + arc, false); 
  45.         ctx.arc(250, 250, insideRadius, angle + arc, angle, true); 
  46.         ctx.stroke(); 
  47.         ctx.fill(); 
  48.          
  49.         ctx.save(); 
  50.         ctx.shadowOffsetX = -1; 
  51.         ctx.shadowOffsetY = -1; 
  52.         ctx.shadowBlur    = 0
  53.         ctx.shadowColor   = "rgb(220,220,220)"
  54.         ctx.fillStyle = "black"
  55.         ctx.translate(250 + Math.cos(angle + arc / 2) * textRadius, 250 + Math.sin(angle + arc / 2) * textRadius); 
  56.         ctx.rotate(angle + arc / 2 + Math.PI / 2); 
  57.         var text = restaraunts[i]; 
  58.         ctx.fillText(text, -ctx.measureText(text).width / 2, 0); 
  59.         ctx.restore(); 
  60.       }  
  61.        
  62.       //Arrow 
  63.       ctx.fillStyle = "black"
  64.       ctx.beginPath(); 
  65.       ctx.moveTo(250 - 4, 250 - (outsideRadius + 5)); 
  66.       ctx.lineTo(250 + 4, 250 - (outsideRadius + 5)); 
  67.       ctx.lineTo(250 + 4, 250 - (outsideRadius - 5)); 
  68.       ctx.lineTo(250 + 9, 250 - (outsideRadius - 5)); 
  69.       ctx.lineTo(250 + 0, 250 - (outsideRadius - 13)); 
  70.       ctx.lineTo(250 - 9, 250 - (outsideRadius - 5)); 
  71.       ctx.lineTo(250 - 4, 250 - (outsideRadius - 5)); 
  72.       ctx.lineTo(250 - 4, 250 - (outsideRadius + 5)); 
  73.       ctx.fill(); 
  74.     } 
  75.   } 
  76.    
  77.   function spin() { 
  78.     spinAngleStart = Math.random() * 10 + 10; 
  79.     spinTime = 0
  80.     spinTimeTotal = Math.random() * 3 + 4 * 1000; 
  81.     rotateWheel(); 
  82.   } 
  83.    
  84.   function rotateWheel() { 
  85.     spinTime += 30; 
  86.     if(spinTime >= spinTimeTotal) { 
  87.       stopRotateWheel(); 
  88.       return; 
  89.     } 
  90.     var spinAngle = spinAngleStart - easeOut(spinTime, 0, spinAngleStart, spinTimeTotal); 
  91.     startAngle += (spinAngle * Math.PI / 180); 
  92.     drawRouletteWheel(); 
  93.     spinTimeout = setTimeout('rotateWheel()', 30); 
  94.   } 
  95.    
  96.   function stopRotateWheel() { 
  97.     clearTimeout(spinTimeout); 
  98.     var degrees = startAngle * 180 / Math.PI + 90; 
  99.     var arcarcd = arc * 180 / Math.PI; 
  100.     var index = Math.floor((360 - degrees % 360) / arcd); 
  101.     ctx.save(); 
  102.     ctx.font = 'bold 30px sans-serif'
  103.     var text = restaraunts[index] 
  104.     ctx.fillText(text, 250 - ctx.measureText(text).width / 2, 250 + 10); 
  105.     ctx.restore(); 
  106.   } 
  107.    
  108.   function easeOut(t, b, c, d) { 
  109.     var ts = (t/=d)*t; 
  110.     var tc = ts*t; 
  111.     return b+c*(tc + -3*ts + 3*t); 
  112.   } 
  113.    
  114.   draw(); 
  115. </script>   

 

微信付费直播
酷播云免费在线视频整体解决方案
参与开学季云视频优惠,拿GET2017教育科技大会VIP门票
进入开学季,保利威视推出云视频优惠,云视频套餐、流量超实惠大放“价”就是现在,还可以免费获取GET2017教育科技大会VIP门票哦!