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,所以,我们可以重载这个方法,来实现我们自己的动画。