最近在学canvas做动画,于是就写个转盘练下手。
上个简陋的成果图(中间那个是转的指针,外面的圈是图片,懒得写了哈哈哈)

代码很简单,都注释了,直接上代码吧,嘤嘤嘤

html

<body>
<canvas id="canvas">您的浏览器不支持canvas</canvas>
<img src="./zp.jpg" alt="" id="img">
</body>

css

<style>
#canvas{
position: absolute;
left: 230px;
top: 230px;
}
#img{
width: 600px;
height: 600px;
}
</style>

js

  var canvas = document.getElementById('canvas');
var context = canvas.getContext('2d');
//设定画布和宽
canvas.width=140;
canvas.height=140;
var then = Date.now();
var now;//利用时间差来控制转盘最小转动时间
var first_deg=0;//用来记录转动的角度
var rotate_deg=0;//每次转动的角度,用来实现变速运动
var end_deg =85;//中奖角度
var speedUp = true;//判断是否在加速阶段
var f; // 因为canvas的rotate函数是根据左上角坐标(0,0)来旋转的,所以移动画布
context.translate(70,70);
function draw(){
context.clearRect(-70, -70, 70, 70);
context.beginPath();
context.arc(0, 0, 50, Math.PI / 180 * 0, Math.PI / 180 * 360, true);
context.moveTo(-50,0);
context.lineTo(50,0);
context.lineTo(0,-70);
context.rotate(rotate_deg*Math.PI/180);
context.closePath();
context.fillStyle='red';
context.fill();
}
// 将运动分为3段,加速,匀速,减速
function loop(){ //循环调用,产生动画效果
f = window.requestAnimationFrame(loop);
now = Date.now(); //开始加速转动,转到速度为20就不加速了,至于为什么是20,看起来舒服而已
if(rotate_deg<=20&&speedUp){
rotate_deg +=1;
}; //2s后开始减速(即最小转动时间),减速是为了视觉上的美观
if(now - then > 2000){ //如果下面设置的是固定角度,那这里的最小速度建议为1,因为每次转动角度过大,一圈很可能错过中奖的角度,导致转很多圈。
if(rotate_deg>=2){
speedUp = false;
rotate_deg -=1;
}
//设置中奖区间为+-5度(设置固定角度会让动画有点难看)
if(first_deg%360>=end_deg-5&&first_deg%360<=end_deg+5){
window.cancelAnimationFrame(f);//停止循环
//中奖操作
}
};
first_deg += rotate_deg;//记录转过的角度
draw();//绘制图形
}
loop();

最后

现在这个转盘比较大的问题就是,如果中奖区间比较小,那减速后转动的时间就长一些,最低速度转很久才停下。当区间大的时候一下子就停下了,减速效果不明显,视觉上看起来很奇怪。有大佬讲下怎么实现转动时长都一样吗?
代码写得很粗糙,实现方法也是自己刚想了就撸了,可能很多地方没考虑好,望谅解。

最新文章

  1. Java类中各种静态变量的加载顺序的学习
  2. MVC 知识点学习2
  3. ASP.net的url重写
  4. gcc的-D和-U参数:宏的设置与取消
  5. H5 技术
  6. 高斯混合模型参数估计的EM算法
  7. 动作之CCActionInstant(立即动作)家族
  8. 转: mysql create view 创建视图
  9. 一个UWSGI的例子
  10. .NET MVC与三层架构
  11. 201521123082《Java程序设计》第4周学习总结
  12. CSS(一) 引入方式 选择器 权重
  13. RPi Kernel Compilation
  14. nexus 10 救砖 安装lineage OS 15 并 root
  15. 可视化工具Grafana:简介及安装
  16. 谷歌chrome浏览器vue调试工具vue-devtools的安装
  17. input file 多张图片上传 获取地址 ——fileReader
  18. pro.antd.design
  19. 自学Python2.1-基本数据类型-字符串方法 下
  20. mysql 之各种 join 之间的关系

热门文章

  1. Oracle诊断:使用USER_SEGMENTS分配给表的物理空间大小
  2. Day3 01 枚举
  3. kvm中添加VNC密码
  4. UEFI手札
  5. mysql5.6.36 源码安装过程
  6. Hibernate入门简介
  7. UVALive 7325 Book Borders
  8. 券商VIP交易通道
  9. JS-在本页面禁止页面返回
  10. 【MM系列】SAP MM模块-组织结构介绍