给定一系列坐标(x, y)点, 实现将各个点按照先后顺序连接起来的动画。还有两个要求:

1.点与点之间直接用线段连接, 不用考虑曲线

2.动画支持暂停, 继续, 重头开始播放功能

这个功能该怎么实现呢,我们首先会想到HTML5点新功能canvas。废话少说直接上实现代码

 <!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>题2</title>
<style type="text/css">
textarea{
height: 100px;
}
.btns{
margin: 10px;
}
button{
width: 80px;
}
</style>
</head>
<body>
<canvas id="canvas" width="500" height="500"></canvas>
<div>
<label>坐标</label><textarea id="dots" type='text'></textarea>
<button id='change'>修改</button>
</div>
<br/>
<div class="btns">
<button id='start'>开始</button>
<button id='stop'>暂停</button>
<button id='continue'>继续</button>
</div>
<script>
//获取指定的canvas元素
var canvas = document.getElementById('canvas');
//调用canvas元素的getContext 方法访问获取2d渲染的上下文
var context = canvas.getContext('2d');
var dotarr = [{"x":280,"y":200},{"x":180,"y":150},{"x":100,"y":250},{"x":280,"y":300},{"x":180,"y":400},
{"x":80,"y":350}];
var isStop = false;
document.getElementById('dots').value=JSON.stringify(dotarr);
function drawline(dots){
for(var i in dots){
//context.clearRect(0, 0, canvas.width, canvas.height)
//window.requestAnimationFrame(drawline,canvas);
var dot=dots[i];
var todot=dots[i];
var time='';
localStorage.setItem('length',dots.length);
if((parseInt(i)+1)<dots.length){
todot=dots[parseInt(i)+1];
}
(function(dot,todot,time,i){
time=setTimeout(function(){
//context.clearRect(0, 0, canvas.width, canvas.height)
context.beginPath();
context.moveTo(dot.x,dot.y);
context.lineTo(todot.x,todot.y);
localStorage.setItem('index',i);
localStorage.setItem("t", time);
context.closePath();
context.stroke();
},(parseInt(i)+1)*1000);
})(dot,todot,time,i)
}
}
document.getElementById("change").onclick=function(){
dotarr=JSON.parse(document.getElementById('dots').value);
}
document.getElementById("start").onclick=function(){
context.clearRect(0, 0, canvas.width, canvas.height);
var t=parseInt(localStorage.getItem("t"));
var length=parseInt(localStorage.getItem('length'));
isStop=true;
for(var i=t;i<=(t+length);i++){
clearTimeout(i);
}
drawline(dotarr);
}
document.getElementById("stop").onclick=function(){
var t=parseInt(localStorage.getItem("t"));
var length=parseInt(localStorage.getItem('length'));
isStop=true;
for(var i=t;i<=(t+length);i++){
clearTimeout(i);
}
console.log('暂停'); }
document.getElementById("continue").onclick=function(){
if(isStop){
var index=parseInt(localStorage.getItem('index'));
var newdots=dotarr.slice(index+1);
console.log(newdots);
drawline(newdots);
isStop=false;
console.log('继续');
}
}
</script>
</body>
</html>

效果如下

每次点开始都会重绘整个动画,点击暂停和继续会在控制台打印日志,非暂停状态下点击继续无效。

@原创版权所有,要转载请注明出处,否则追究版权责任

canvas实现点连线动画的更多相关文章

  1. 神奇的canvas——点与线绘制的绚丽动画效果

    代码地址如下:http://www.demodashi.com/demo/11636.html 前言 之前在某网站上看到了一个canvas绘制的动画效果,虽然组成的元素很简单,只有点和线,但是视觉效果 ...

  2. WPF 画线动画效果实现

    原文:WPF 画线动画效果实现 弄了将近三天才搞定的,真是艰辛的实现. 看了很多博客,都太高深了,而且想要实现的功能都太强大了,结果基础部分一直实现不了,郁闷啊~ 千辛万苦终于找到了一个Demo,打开 ...

  3. 画线动画——SVG版和纯CSS版

    概述 我们常常在网站中看到一些画线的动画效果,非常炫酷,大多数这种画线动画效果是通过SVG实现的,也有不少是用纯css实现的,下面我总结了一下这2种方法,供以后开发时参考,相信对其他人也有用. 参考资 ...

  4. iOS - 高德地图将地图的多点连线

    @property (nonatomic, strong) MAPolyline *commonPoly; #pragma mark -- 将地图的点连线 - (void)createBrokenLi ...

  5. html5 canvas高级贝塞尔曲线运动动画(好吧这一篇被批的体无完肤!都说看不懂了!没办法加注释了!当然数学不好的我也没办法了,当然这还涉及到一门叫做计算机图形学的学科)

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  6. 第165天:canvas绘制圆环旋转动画

    canvas绘制圆环旋转动画——面向对象版 1.HTML 注意引入Konva.js库 <!DOCTYPE html> <html lang="en"> &l ...

  7. 一款基于HTML5 Canvas的画板涂鸦动画

    今天给各网友分享一款基于HTML5 Canvas的画板涂鸦动画.记得之前我们分享过一款HTML5 Canvas画板工具,可以切换不同的笔刷,功能十分强大.本文今天要再来分享一款基于HTML5 Canv ...

  8. Canvas制作的下雨动画

    简介 在codepen上看到一个Canvas做的下雨效果动画,感觉蛮有意思的.就研究了下,这里来分享下,实现技巧.效果可以见下面的链接. 霓虹雨: http://codepen.io/natewile ...

  9. HTML5 Canvas核心技术:图形、动画与游戏开发 PDF扫描版​

    HTML5 Canvas核心技术:图形.动画与游戏开发 内容简介: <HTML5 Canvas核心技术:图形.动画与游戏开发>中,畅销书作家David Geary(基瑞)先生以实用的范例程 ...

随机推荐

  1. 13.0-uC/OS-III上下文切换

    1.当uC/OS-III转向执行另一个任务的时候,它保存了当前任务的CPU寄存器到堆栈.并从新任务的的堆栈中CPU寄存器载入CPU.这个过程叫做上下文切换. 上下文切换需要一些开支. CPU的寄存器越 ...

  2. python 模块大全

    logging   time datetime   sys   os   json  random   hashlib   paramiko  pymysql模块使用 subprocess  pywi ...

  3. rabbitmq延迟队列demo

    1. demo详解 1.1 工程结构: 1.2 pom 定义jar包依赖的版本.版本很重要,rabbit依赖spring,两者必须相一致,否则报错: <properties> <sp ...

  4. ubuntu(centos) server安装vmware tools

    Ubuntu: root登录ubutun $ sudo su vmware中选择菜单虚拟机->安装VMware Tools 命令行如下 // 将cdrom挂载到mnt $ mount -t is ...

  5. HTML 鼠标坐标和元素坐标

    在这一篇文章中,将会介绍鼠标坐标.元素坐标以及鼠标在指定元素内的坐标. 1. 鼠标坐标 在触发鼠标相关事件时(如:click.mousemove),可以通过事件对象获取当前鼠标的坐标. 获取的坐标可分 ...

  6. HTML和CSS总结

    语义化.我们学习网页制作时,常常会听到一个词,语义化.那么什么叫做语义化呢,说的通俗点就是:明白每个标签的用途(在什么情况下使用此标签合理)比如,网页上的文章的标题就可以用标题标签,网页上的各个栏目的 ...

  7. Nginx技术研究系列7-Azure环境中Nginx高可用性和部署架构设计

    前几篇文章介绍了Nginx的应用.动态路由.配置.在实际生产环境部署时,我们需要同时考虑Nginx的高可用性和部署架构. Nginx自身不支持集群以保证自身的高可用性,商业版本的Nginx+推荐: T ...

  8. Oracle表空间碎片整理SHRINK与MOVE

    整理表碎片通常的方法是move表,当然move是不能在线进行的,而且move后相应的索引也会失效,oracle针对上述不足,在10g时加入了shrink,那这个方法能不能在生产中使用呢?        ...

  9. bzoj2880

    打公式好麻烦 QAQ 为了节省时间去复习,原谅我引用一下别人的博客...http://blog.csdn.net/acdreamers/article/details/8542292 #include ...

  10. Docker Swarm 高可用详解

    Docker Swarm 高可用详解 Manager管理节点宕机后其他管理节点仍然可以使用管理 intermal distributed state store:内部分布式状态存储同步共享到每个节点. ...