canvas 轨迹回放

最近做的项目需要实现一个轨迹回放功能,自己没有这方面的经验,网上搜索之后也只发现了这篇文章有所提及——canvas轨迹回放,他是先搜集轨迹点,然后再回放,我的需求比较简单,轨迹点后台提供,我只需要动态画出来就行,复杂度降低了很多,主要借鉴了绘图方法——使用setInterval方法递归实现。

制作过程中发现原文章中json结构中的timer属性只是用来做条件判断的,并不是原先自己理解的是一个时间流数据,轨迹回放的快慢跟生成的轨迹个数多少有关(画的慢轨迹点多,画的快轨迹点少)。

json结构

[
    {
        "path": [
            {
                "x": 82, 
                "y": 43
            }, 
            {
                "x": 83, 
                "y": 43
            }, 
            {
                "x": 84, 
                "y": 45
            }, 
            {
                "x": 86, 
                "y": 47
            }, 
            {
                "x": 86, 
                "y": 49
            }, 
            {
                "x": 86, 
                "y": 54
            }, 
            {
                "x": 86, 
                "y": 59
            }, 
            {
                "x": 86, 
                "y": 64
            }, 
            {
                "x": 86, 
                "y": 69
            }, 
            {
                "x": 86, 
                "y": 74
            }, 
            {
                "x": 86, 
                "y": 78
            }, 
            {
                "x": 86, 
                "y": 83
            }, 
            {
                "x": 86, 
                "y": 87
            }, 
            {
                "x": 86, 
                "y": 89
            }, 
            {
                "x": 86, 
                "y": 91
            }, 
            {
                "x": 86, 
                "y": 92
            }, 
            {
                "x": 86, 
                "y": 93
            }, 
            {
                "x": 86, 
                "y": 94
            }, 
            {
                "x": 86, 
                "y": 95
            }
        ]
    }, 
    {
        "path": [
            {
                "x": 129, 
                "y": 36
            }, 
            {
                "x": 129, 
                "y": 39
            }, 
            {
                "x": 129, 
                "y": 44
            }, 
            {
                "x": 129, 
                "y": 49
            }, 
            {
                "x": 129, 
                "y": 54
            }, 
            {
                "x": 129, 
                "y": 59
            }, 
            {
                "x": 128, 
                "y": 65
            }, 
            {
                "x": 127, 
                "y": 73
            }, 
            {
                "x": 125, 
                "y": 78
            }, 
            {
                "x": 125, 
                "y": 81
            }, 
            {
                "x": 124, 
                "y": 88
            }, 
            {
                "x": 123, 
                "y": 91
            }, 
            {
                "x": 123, 
                "y": 94
            }, 
            {
                "x": 123, 
                "y": 96
            }, 
            {
                "x": 123, 
                "y": 97
            }, 
            {
                "x": 123, 
                "y": 98
            }, 
            {
                "x": 123, 
                "y": 99
            }, 
            {
                "x": 122, 
                "y": 100
            }
        ]
    }
]

html
将json作为js文件引入,并将其赋值给全局变量testPath(引入方式按照实际项目要求来)

<style>
*{margin:0; padding:0;}
#test{border:1px solid #ccc; background: #eee; margin:20px 30px;}
</style>

<p><button id="start">start</button></p>
<canvas id='test' width="600" height="200"></canvas>

<script type="text/javascript" src='js/jquery-2.1.4.min.js'></script>
<script type="text/javascript" src='js/number.js'></script>

js

$('#start').click(function(event) {
    var lineIndex = 0,pointIndex = 0,line2;
    var obj = document.getElementById('test');
    var cxt = obj.getContext('2d');
    cxt.lineWidth = 1;
    cxt.strokeStyle = 'red';
    cxt.lineCap = 'round';
    cxt.clearRect(0,0,600,200);
    function drawBegin(){
        cxt.beginPath();
        pointIndex=0;
        var intervalHandle = window.setInterval(function () {
            line2 = testPath[lineIndex].path[pointIndex];
            if (!line2) {
                window.clearInterval(intervalHandle);
                if (lineIndex < testPath.length - 1) {
                    lineIndex = lineIndex + 1;
                    drawBegin();
                }
            }else{
                if (pointIndex == 0) {
                    cxt.moveTo(line2.x, line2.y);
                }
                pointIndex = pointIndex + 1;
                cxt.lineTo(line2.x, line2.y);
                cxt.stroke();
            }
        },0);
    }
    drawBegin();
});

https://jsfiddle.net/99g4cg3k/
参考文章

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值