经由过程时候歪曲完成缓动动画

经由过程时候歪曲完成缓动动画

常常会见到各种缓动函数,在CSS内里有现成的bounce、elastic等缓动结果直接用。如果在canvas动画中,我们要完成这些缓动函数。直接去思索怎样处置惩罚挺头疼的,引见一种不错的完成体式格局,源自《HTML5 Canvas中心技术》。

此次的实践在一个封装的基础上,请参考:canvas精灵封装

Begin

缓动动画的实质,是在单元时候内挪动差别的间隔。

一个简朴的公式:间隔 = 速率 × 时候;

要完成间隔缓动,只要两种体式格局:

  • 要么坚持时候一般活动,完成速率缓动;

  • 要么坚持速率稳定完成时候歪曲;

下图是elastic结果的间隔与时候函数,我乱拿了一个三角函数图象,疏忽掉负轴就好

《经由过程时候歪曲完成缓动动画》

△V = △S / △T,理论上对间隔/时候曲线举行求导,获得速率的变化曲率,转变速率也能完成。

此次完成的是坚持速率稳定,歪曲时候完成缓动:

1、每一个动画时候牢固,经由过程时候能获取到动画进度:

先给出时候歪曲函数:

f(x) = ((1 - cos(x * pi * 3)) * (1-x)) + x

转换成代码:

var makeElastic = function (passes) {// passes是跳动的次数
       passes = passes || 3;
       return function (percentComplete) {
           return ((1-Math.cos(percentComplete * Math.PI * passes)) *
               (1 - percentComplete)) + percentComplete;
    };
};

函数图象:

《经由过程时候歪曲完成缓动动画》

经由过程Sprite封装的behavior来完成时候歪曲

var moveBall = {
        updateBallPosition: function(elapsed){
            if (arrow === LEFT){
                ball.left -= ball.velocityX * (elapsed/1000);
            } else{
                   ball.left += ball.velocityX * (elapsed/1000);
            }
        },
        execute: function(ball, context,time){
            // 中心!
            // 这里的animationElapsed是被歪曲过的时候
            // getElapsedTime()就是上面的makeElastic
            // 经由一些封装,传入t得出歪曲过的时候
            var animationElapsed = pushAnimationTimer.getElapsedTime(),
                elapsed;
                
            elapsed = animationElapsed - this.lastTime;
            this.updateBallPosition(elapsed);
            
        }
    }


    原文作者:别天
    原文地址: https://segmentfault.com/a/1190000006975689
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞