Javascript 如何在画布中设置线条动画

Javascript 如何在画布中设置线条动画,javascript,animation,canvas,gsap,Javascript,Animation,Canvas,Gsap,我正在尝试使用画布设置线条的动画。我想使用TimeLineite来处理动画。我该怎么做?我知道在TimeLineSite中,时间线是这样的: var timeline = new TimelineLite(); timeline.to(target, duration, vars, position); 这些点存在于一个JSON文件中,并且该文件是通过AJAX正确引入的。我希望直线从点x1和y1开始,保持x2为相同的值,并将其设置为y2位置的动画。所以我基本上希望它从x1-y1增长到x2-y2

我正在尝试使用画布设置线条的动画。我想使用TimeLineite来处理动画。我该怎么做?我知道在TimeLineSite中,时间线是这样的:

var timeline = new TimelineLite();
timeline.to(target, duration, vars, position);
这些点存在于一个JSON文件中,并且该文件是通过AJAX正确引入的。我希望直线从点x1和y1开始,保持x2为相同的值,并将其设置为y2位置的动画。所以我基本上希望它从x1-y1增长到x2-y2

JS

function animateLines(name, stroke, width, x1, y1, x2, y2){
    ctx.beginPath();
    ctx.moveTo(x1, y1);
    ctx.lineWidth = width;
    ctx.strokeStyle = stroke;
    ctx.stroke;
    console.log(x2);
}

for(var i = 0; i < animated_lines.length; i++){
    animateLines(animated_lines[i].name, animated_lines[i].stroke, animated_lines[i].width, animated_lines[i].x1, animated_lines[i].y1, animated_lines[i].x2, animated_lines[i].y2);
}

所以我的问题实际上是一个多部分的问题。如何使用画布设置线条动画?如何根据
animateLine()
函数中的
名称设置线条动画?

TimeLineSite
使用
元素
转换该元素的目标值

您可以使用
onUpdate
随时间推移观察变换的更新进度,并根据该值设置线条动画

timeline.eventCallback('onUpdate',函数(数据){
var progress=this.progress();
//在这里做动画调用!
});
下面是一个工作示例代码段 我在时间线期间转换画布不透明度并设置画布动画。
var timeline=new timeline();
var maincavas=document.getElementById(“ctx”);
var ctx=mainCanvas.getContext(“2d”);
var temp=document.createElement('div');
var\u行=[{
“名称”:“红色”,
“笔划”:“ff0000”,
“宽度”:3,
“x1”:50,
“y1”:50,
“x2”:100,
“y2”:100
},{
“名称”:“绿色”,
“笔划”:“00ff00”,
“宽度”:2,
“x1”:50,
“y1”:20,
“x2”:100,
“y2”:100
}];
函数createLine(行,进度){
ctx.lineWidth=line.width;
ctx.strokeStyle=line.strokeStyle;
ctx.beginPath();
ctx.moveTo(第x1行,第y1行);
ctx.lineTo(第x2行、第y2行*进度);
ctx.stroke();
}
console.log('ctx',ctx);
时间线。从(#ctx',10,{opacity:0});
timeline.eventCallback('onUpdate',function()){
var progress=this.progress();
//控制台日志(进度);
ctx.clearRect(0,0,maincavas.width,maincavas.height);
对于(变量i=0;i

是您希望产生的效果还是类似的效果

其中JS如下所示:

var width,height,centerX,centerY,canvas,context;
var delayFactor=.06,duration=1.2,ease=Elastic.easeOut,destIncrement=200,strokeWidth=2;
var timeline=new TimelineMax({paused:true,repeat:-1,yoyo:true,repeatDelay:duration*.5});
var animatedLines=[
    {name:'Test',stroke:'red',width:strokeWidth,x1:0,y1:0,x2:0,y2:destIncrement},
    {name:'Test',stroke:'green',width:strokeWidth,x1:0,y1:0,x2:destIncrement*.5,y2:destIncrement*.5},
    {name:'Test',stroke:'blue',width:strokeWidth,x1:0,y1:0,x2:destIncrement,y2:0},
    {name:'Test',stroke:'red',width:strokeWidth,x1:0,y1:0,x2:destIncrement*.5,y2:-destIncrement*.5},
    {name:'Test',stroke:'green',width:strokeWidth,x1:0,y1:0,x2:0,y2:-destIncrement},
    {name:'Test',stroke:'blue',width:strokeWidth,x1:0,y1:0,x2:-destIncrement*.5,y2:-destIncrement*.5},
    {name:'Test',stroke:'red',width:strokeWidth,x1:0,y1:0,x2:-destIncrement,y2:0},
    {name:'Test',stroke:'green',width:strokeWidth,x1:0,y1:0,x2:-destIncrement*.5,y2:destIncrement*.5}
];
function init(){
    initCanvas();
    initLines();
    populateTimeline();
    timeline.play();
    TweenLite.ticker.addEventListener('tick',render);
}
function populateTimeline(){
    var length=animatedLines.length,currentLine;
    for(var i=0; i<length; i+=1){
        currentLine=animatedLines[i];
        timeline.to(currentLine,duration,{destX:currentLine.x2,destY:currentLine.y2,ease:ease},i*delayFactor);
    }
}
function initLines(){
    var length=animatedLines.length,currentLine;
    for(var i=0; i<length; i+=1){
        currentLine=animatedLines[i];
        currentLine.destX=currentLine.x1;
        currentLine.destY=currentLine.y1;
    }
}
function initCanvas(){
    canvas=document.querySelector('canvas');
    context=canvas.getContext('2d');
    width=canvas.width=window.innerWidth;
    height=canvas.height=window.innerHeight;
    centerX=width*.5;
    centerY=height*.5;
}
function drawLine(currentLine){
    context.lineWidth=currentLine.width;
    context.strokeStyle=currentLine.stroke;
    context.beginPath();
    context.moveTo(centerX+currentLine.x1,centerY+currentLine.y1);
    context.lineTo(centerX+currentLine.destX,centerY+currentLine.destY);
    context.stroke();
}
function render(){
    var length=animatedLines.length;
    context.clearRect(0,0,width,height);
    for(var i=0; i<length; i+=1){ drawLine(animatedLines[i]); }
}
init();
var宽度、高度、centerX、centerY、画布、上下文;
var delayFactor=0.06,持续时间=1.2,缓和度=Elastic.easeOut,destIncrement=200,行程宽度=2;
var timeline=new TimelineMax({暂停:true,重复:-1,yoyo:true,重复延迟:持续时间*.5});
var动画线=[
{name:'Test',stroke:'red',width:strokeWidth,x1:0,y1:0,x2:0,y2:destIncrement},
{名称:'Test',笔划:'green',宽度:strokeWidth,x1:0,y1:0,x2:destIncrement*.5,y2:destIncrement*.5},
{name:'Test',stroke:'blue',width:strokeWidth,x1:0,y1:0,x2:destIncrement,y2:0},
{名称:'Test',笔划:'red',宽度:strokeWidth,x1:0,y1:0,x2:destIncrement*.5,y2:-destIncrement*.5},
{name:'Test',stroke:'green',width:strokeWidth,x1:0,y1:0,x2:0,y2:-destIncrement},
{name:'Test',stroke:'blue',width:strokeWidth,x1:0,y1:0,x2:-destIncrement*.5,y2:-destIncrement*.5},
{name:'Test',stroke:'red',width:strokeWidth,x1:0,y1:0,x2:-desincrement,y2:0},
{name:'Test',stroke:'green',width:strokeWidth,x1:0,y1:0,x2:-destIncrement*.5,y2:destIncrement*.5}
];
函数init(){
initCanvas();
initLines();
populateTimeline();
timeline.play();
TweenLite.ticker.addEventListener('tick',render);
}
函数populateTimeline(){
var length=动画线条。长度,currentLine;
对于(var i=0;i
var width,height,centerX,centerY,canvas,context;
var delayFactor=.06,duration=1.2,ease=Elastic.easeOut,destIncrement=200,strokeWidth=2;
var timeline=new TimelineMax({paused:true,repeat:-1,yoyo:true,repeatDelay:duration*.5});
var animatedLines=[
    {name:'Test',stroke:'red',width:strokeWidth,x1:0,y1:0,x2:0,y2:destIncrement},
    {name:'Test',stroke:'green',width:strokeWidth,x1:0,y1:0,x2:destIncrement*.5,y2:destIncrement*.5},
    {name:'Test',stroke:'blue',width:strokeWidth,x1:0,y1:0,x2:destIncrement,y2:0},
    {name:'Test',stroke:'red',width:strokeWidth,x1:0,y1:0,x2:destIncrement*.5,y2:-destIncrement*.5},
    {name:'Test',stroke:'green',width:strokeWidth,x1:0,y1:0,x2:0,y2:-destIncrement},
    {name:'Test',stroke:'blue',width:strokeWidth,x1:0,y1:0,x2:-destIncrement*.5,y2:-destIncrement*.5},
    {name:'Test',stroke:'red',width:strokeWidth,x1:0,y1:0,x2:-destIncrement,y2:0},
    {name:'Test',stroke:'green',width:strokeWidth,x1:0,y1:0,x2:-destIncrement*.5,y2:destIncrement*.5}
];
function init(){
    initCanvas();
    initLines();
    populateTimeline();
    timeline.play();
    TweenLite.ticker.addEventListener('tick',render);
}
function populateTimeline(){
    var length=animatedLines.length,currentLine;
    for(var i=0; i<length; i+=1){
        currentLine=animatedLines[i];
        timeline.to(currentLine,duration,{destX:currentLine.x2,destY:currentLine.y2,ease:ease},i*delayFactor);
    }
}
function initLines(){
    var length=animatedLines.length,currentLine;
    for(var i=0; i<length; i+=1){
        currentLine=animatedLines[i];
        currentLine.destX=currentLine.x1;
        currentLine.destY=currentLine.y1;
    }
}
function initCanvas(){
    canvas=document.querySelector('canvas');
    context=canvas.getContext('2d');
    width=canvas.width=window.innerWidth;
    height=canvas.height=window.innerHeight;
    centerX=width*.5;
    centerY=height*.5;
}
function drawLine(currentLine){
    context.lineWidth=currentLine.width;
    context.strokeStyle=currentLine.stroke;
    context.beginPath();
    context.moveTo(centerX+currentLine.x1,centerY+currentLine.y1);
    context.lineTo(centerX+currentLine.destX,centerY+currentLine.destY);
    context.stroke();
}
function render(){
    var length=animatedLines.length;
    context.clearRect(0,0,width,height);
    for(var i=0; i<length; i+=1){ drawLine(animatedLines[i]); }
}
init();