在Android动画基础上实现自定义的动画效果

Android提供的平移动画有只有加速、减速等,如果我们需要其他的自定义动画效果,应该如何实现呢?这里作者就用自定义的算法来实现一个平移动画效果。

一、使用Android的Interpolator实现动画效果

       位移动画有多种时间插值算法,比如我们常用的有AccelerateDecelerateInterpolator、AccelerateInterpolator、DecelerateInterpolator等,这些插值算法是为了给平移动画添加各种效果,加速减速、加速、减速等,这里举个例子。

        

AccelerateDecelerateInterpolatorinterpolator = new AccelerateDecelerateInterpolator();
        TranslateAnimation translateAnim2 = new TranslateAnimation(0,-300,0,-500);
            translateAnim2.setDuration(600);
            translateAnim2.setInterpolator(interpolator);
            translateAnim2.setFillAfter(true);
            mImageView.startAnimation(translateAnim2);
于是,一个ImageView的加速减速效果的平移动画就成形了。

二、对Android动画算法的分析

   这里是让ImageView进行平移动画,同时,平移的效果是先加速,再减速。


   那么,插值是如何让平移动画先加速再减速的呢?


   我们先来看一下DecelerateInterpolator的算法吧。


   interpolatedTime  = (1.0f - (1.0f - input) * (1.0f - input))


     input可以理解为用时的百分比,interpolatedTime  可以理解为移动距离的百分比(取值范围0%——100%)


    这是一个input自变量范围在[0,1],于是interpolatedTime 值的范围也在[0,1]的连续函数,我自己理解这里自变量就是总时间的比例(取值

为%0,100%),函数值就是运动距离的比例(取值为%0,100%)。其函数图:


     例如:


     现在插值input为 0.2(即用了总时间的20%),我用公式计算得到一个值interpolatedTime 为0.3,也就是运动了整个距离的30%,那么该View的x坐标值运动计算公式:


             mFromXDelta + ((mToXDelta - mFromXDelta) * interpolatedTime)


     其中,mFromXDelta 为运动起始x坐标,mToXDelta为运动终点x坐标,那这样的话,就运动了总长度的0.3,一直到interpolatedTime 的值为1,整个动画就结束了。


   

    那么,函数的斜率其实就是速度,如图,DecelerateInterpolator函数的斜率是不断减小的,于是产生了减速的效果。


    好了,现在我们就可以着手写一个自己想要的动画效果算法了,只需用满足以下条件即可:


   1.函数是连续的,如果不连续,动画效果将不会连续


    2.自变量范围[0,1],自变量的值是系统生成的


    3.函数值域为[0,1]


三、自己实现Android动画算法


    于是,我自己写了一个弹性的加速减速效果(android自己提供的加速减速效果不够猛烈啊),代码如下:

if (t < 0.4) {
    return (float)(t*t);
    }else if (t >= 0.4 &&t <= 0.6) {
    return (float)(3.4*t - 1.2);
    }else 
    return (float)(1.0f - (1.0f - t) * (1.0f - t));

    函数图象如下:

       

    用这个算法,加速减速效果就非常明显啦!接下来,自己去创建一个类似DecelerateInterpolator的类,将这个算法写入getInterpolation()方法就可以直接使用了。

    同时,我想,旋转等效果的动画算法原理也应该是一样的,所以,咱们可以自己去实现很多效果的动画!

 

你可能感兴趣的:(android,动画,interpolator,动画算法,自定义动画)