经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 大数据/云/AI » Hadoop » 查看文章
canvas探照灯效果的示例代码
来源:jb51  时间:2018/12/3 9:48:30  对本文有异议

canvas中的clip()方法用于从原始画布中剪切任意形状和尺寸。一旦剪切了某个区域,则所有之后的绘图都会被限制在被剪切的区域内(不能访问画布上的其他区域)

也可以在使用clip()方法前通过使用save()方法对当前画布区域进行保存,并在以后的任意时间通过restore()方法对其进行恢复

接下来使用clip()方法实现一个探照灯效果

  1. </iframe>
  2. <button id="btn">变换</button>
  3. <button id="con">暂停</button>
  4. <canvas id="canvas" width="400" height="290" style="border:1px solid black">当前浏览器不支持canvas,请更换浏览器后再试</canvas>
  5. <script> btn.onclick = function(){history.go();}
  6. con.onclick = function(){ if(this.innerHTML == '暂停'){ this.innerHTML = '恢复';
  7. clearInterval(oTimer);
  8. }else{ this.innerHTML = '暂停';
  9. oTimer = setInterval(fnInterval,50);
  10. }
  11. } var canvas = document.getElementById('canvas'); //存储画布宽高
  12. var H=290,W=400; //存储探照灯
  13. var ball = {}; //存储照片
  14. var IMG; //存储照片地址
  15. var URL = 'http://sandbox.runjs.cn/uploads/rs/26/ddzmgynp/chunfen.jpg'; function initial(){ if(canvas.getContext){ var cxt = canvas.getContext('2d'); var tempR = Math.floor(Math.random()*30+20); var tempX = Math.floor(Math.random()*(W-tempR) + tempR); var tempY = Math.floor(Math.random()*(H-tempR) + tempR)
  16. ball = {
  17. x:tempX,
  18. y:tempY,
  19. r:tempR,
  20. stepX:Math.floor(Math.random() * 21 -10),
  21. stepY:Math.floor(Math.random() * 21 -10)
  22. };
  23. IMG = document.createElement('img');
  24. IMG.src=URL;
  25. IMG.onload = function(){
  26. cxt.drawImage(IMG,0,0);
  27.   }//欢迎加入全栈开发交流圈一起学习交流:582735936
  28.   ]//面向1-3年前端人员
  29.   } //帮助突破技术瓶颈,提升思维能力
  30. }
  31. }
  32. } function update(){
  33. ball.x += ball.stepX;
  34. ball.y += ball.stepY;
  35. bumpTest(ball);
  36. } function bumpTest(ele){ //左侧
  37. if(ele.x <= ele.r){
  38. ele.x = ele.r;
  39. ele.stepX = -ele.stepX;
  40. } //右侧
  41. if(ele.x >= W - ele.r){
  42. ele.x = W - ele.r;
  43. ele.stepX = -ele.stepX;
  44. } //上侧
  45. if(ele.y <= ele.r){
  46. ele.y = ele.r;
  47. ele.stepY = -ele.stepY;
  48. } //下侧
  49. if(ele.y >= H - ele.r){
  50. ele.y = H - ele.r;
  51. ele.stepY = -ele.stepY;
  52. }
  53. } function render(){ //重置画布高度,达到清空画布的效果
  54. canvas.height = H; if(canvas.getContext){ var cxt = canvas.getContext('2d');
  55. cxt.save(); //将画布背景涂黑
  56. cxt.beginPath();
  57. cxt.fillStyle = '#000';
  58. cxt.fillRect(0,0,W,H); //渲染探照灯
  59. cxt.beginPath();
  60. cxt.arc(ball.x,ball.y,ball.r,0,2*Math.PI);
  61. cxt.fillStyle = '#000';
  62. cxt.fill();
  63. cxt.clip(); //由于使用了clip(),画布背景图片会出现在clip()区域内
  64. cxt.drawImage(IMG,0,0);
  65. cxt.restore();
  66.   }//欢迎加入全栈开发交流圈一起学习交流:582735936
  67.   ]//面向1-3年前端人员
  68.   } //帮助突破技术瓶颈,提升思维能力
  69. }
  70.  
  71. }
  72. initial();
  73. clearInterval(oTimer); function fnInterval(){ //更新运动状态
  74. update(); //渲染
  75. render();
  76. } var oTimer = setInterval(fnInterval,50);
  77. </script>

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持w3xue。

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号