Android的View动画笔记

来源:互联网 发布:林书豪篮网场均数据 编辑:程序博客网 时间:2024/06/11 10:53

View动画分为4类

平移 旋转 缩放 透明度

View动画都是继承自android.view.animation.Animation(属性动画是在Animator包下),四类View动画对应4个Java类,TranslateAnimation RotateAnimation ScaleAnimation AphlaAnimation。

View动画的原理,可以通过看源码分析了解,入口可以从View的startAnimation方法进入,可以发现最终会调用Animaton类的
protected void applyTransformation(float interpolatedTime,
Transformation t)

方法说明:
第一个参数为动画的进度时间值,取值范围为[0.0f,1.0f],注意, interpolatedTime是已经通过时间插值器处理后的,
第二个参数Transformation记录着动画某一帧中变形的原始数据。该方法在动画的每一帧显示过程中都会被调用。

这点可以从Animation类中的public boolean getTransformation(long currentTime, Transformation outTransformation)
方法内可看到,方法中如下关键代码:

        if (duration != 0) {            normalizedTime = ((float) (currentTime - (mStartTime + startOffset))) /                    (float) duration;        } else {            // time is a step-change with a zero duration            normalizedTime = currentTime < mStartTime ? 0.0f : 1.0f;        }

先按线性计算时间的消耗比例,即normalizedTime,此值是线形的,然后通过时间插值器换算成非线性的值,代码片段如下:

            final float interpolatedTime = mInterpolator.getInterpolation(normalizedTime);            applyTransformation(interpolatedTime, outTransformation);

Animation类中的applyTransformation方法是空实现,各个派生类,例如上面说到的4类动画会去重载实现该方法,来实现动画值的变化。

以AphlaAnimation类的applyTransformation方法为例:

    protected void applyTransformation(float interpolatedTime, Transformation t) {        final float alpha = mFromAlpha;        t.setAlpha(alpha + ((mToAlpha - alpha) * interpolatedTime));    }

可见applyTransformation()方法就是动画具体的实现,系统会以一个比较高的频率来调用这个方法,一般情况下60FPS,是一个非常流畅的画面了,也就是16ms,所以,我们可以重载这个方法,来实现我们自己的动画。