补间动画是什么?
我们在开发一个动画的时候,开发者没必要完成动作的每一帧,只需要定义开始和结束的关键帧,剩余中间部分,是由android自动计算并实现的;
大体可以分以下四类:
透明度动画AlphaAnimation
AlphaAnimation (float fromAlpha, float toAlpha)
参数说明
fromAlpha:开始时刻的透明度,取值范围0~1。
toAlpha:结束时刻的透明度,取值范围0~1。
//透明度动画
// AlphaAnimation animation=new AlphaAnimation(0.0f,1.0f);
//
// animation.setDuration(3000);
// imageView.startAnimation(animation);
位移动画TranslateAnimation
TranslateAnimation (float fromXDelta, float toXDelta, float fromYDelta, float toYDelta)
参数说明
fromXDelta:位置变化的起始点X坐标。
toXDelta:位置变化的结束点X坐标。
fromYDelta:位置变化的起始点Y坐标。
toYDelta:位置变化的结束点Y坐标。
//位移动画
// TranslateAnimation animation=new TranslateAnimation(-imageView.getWidth(),0,0,0);
// animation.setDuration(3000);
// imageView.startAnimation(animation);
缩放动画ScaleAnimation
public ScaleAnimation (float fromX, float toX, float fromY, float toY, int pivotXType, float pivotXValue, int pivotYType, float pivotYValue)
参数说明:
fromX:起始X坐标上的伸缩尺寸。
toX:结束X坐标上的伸缩尺寸。
fromY:起始Y坐标上的伸缩尺寸。
toY:结束Y坐标上的伸缩尺寸。
pivotXType:X轴的伸缩模式,可以取值为ABSOLUTE、RELATIVE_TO_SELF、 RELATIVE_TO_PARENT。
pivotXValue:X坐标的伸缩值。
pivotYType:Y轴的伸缩模式,可以取值为ABSOLUTE、RELATIVE_TO_SELF、RELATIVE_TO_PARENT。
pivotYValue:Y坐标的伸缩值。
//缩放
// ScaleAnimation animation=new ScaleAnimation(0,0.5f,0,0.5f);
// animation.setDuration(3000);
// imageView.startAnimation(animation);
旋转动画RotateAnimation
RotateAnimation (float fromDegrees, float toDegrees, int pivotXType, float pivotXValue, int pivotYType, float pivotYValue)
参数说明
fromDegrees:旋转的开始角度。
toDegrees:旋转的结束角度。
pivotXType:X轴的伸缩模式,可以取值为ABSOLUTE、RELATIVE_TO_SELF、 RELATIVE_TO_PARENT。
pivotXValue:X坐标的伸缩值。
pivotYType:Y轴的伸缩模式,可以取值为ABSOLUTE、RELATIVE_TO_SELF、RELATIVE_TO_PARENT。
pivotYValue:Y坐标的伸缩值。
//旋转动画
// RotateAnimation animation=new RotateAnimation(0,360);
// animation.setDuration(3000);
// imageView.startAnimation(animation);
动画集合AnimationSet
什么是AnimationSet?
我们在上面介绍的四中补间动画都是单一的使用的,当我们想混合使用的时候就需要AnimationSet来帮忙了。
用法如下
AnimationSet set=new AnimationSet(false);
AlphaAnimation animation1=new AlphaAnimation(0.0f,1.0f);
TranslateAnimation animation2=new TranslateAnimation(0,imageView.getWidth(),0,0);
ScaleAnimation animation3=new ScaleAnimation(0,0.9f,0,0.9f);
RotateAnimation animation4=new RotateAnimation(200,360);
animation1.setDuration(3000);
animation2.setDuration(3000);
animation3.setDuration(3000);
animation4.setDuration(3000);
set.addAnimation(animation1);
set.addAnimation(animation2);
set.addAnimation(animation3);
set.addAnimation(animation4);
imageView.startAnimation(set);
XML中定义动画
上面动画的使用都是在Java代码中实现的。其实我们可以在XML当中的资源文件中定义:
<set xmlns:android="http://schemas.android.com/apk/res/android">
android:interpolator="@android:anim/accelerate_interpolator">
<!--旋转动画-->
<!--轴心点pivotX、pivotY-->
<!--重复2此转3次-->
<rotate
android:duration="3000"
android:fromDegrees="0"
android:toDegrees="360"
android:pivotX="5%"
android:pivotY="5%"
android:repeatCount="2">
</rotate>
<!--缩放动画-->
<scale
android:startOffset="9000"
android:duration="2000"
android:fromXScale="0.5"
android:toXScale="1.0"
android:fromYScale="0.5"
android:toYScale="1.0"
android:pivotX="50%"
android:pivotY="50%">
</scale>
</set>
既然定义了,如何在代码中使用动画呢???
//在XML当中定义动画
AnimationUtils utils=new AnimationUtils();
Animation animation= utils.loadAnimation(getApplicationContext(), R.anim.animator_rotate);
imageView.startAnimation(animation);
可以看到上面我们使用了interpolator,什么是interpolator??
interpolator翻译为:插值,补间动画只是定义了开始结束关键帧,并没有控制中间帧的,interpolator就是用来控制动画变化速度,插入帧的密度位置等的。
android:interpolator
AccelerateDecelerateInterpolator 在动画开始与结束的地方速率改变比较慢,在中间的时候加速
AccelerateInterpolator 在动画开始的地方速率改变比较慢,然后开始加速
AnticipateInterpolator 开始的时候向后然后向前甩
AnticipateOvershootInterpolator 开始的时候向后然后向前甩一定值后返回最后的值
BounceInterpolator 动画结束的时候弹起
CycleInterpolator 动画循环播放特定的次数,速率改变沿着正弦曲线
DecelerateInterpolator 在动画开始的地方快然后慢
LinearInterpolator 以常量速率改变
OvershootInterpolator 向前甩一定值后再回到原来位置
动画的公共函数
setDuration(float time)动画执行时间;
setFillAfter(boolean b)是否保持动画结束时状态;
setFillBefore(boolean b)是否返回动画开始状态,当动画结束后;
setStartOffset(long time)经过多少时间动画开始执行;
setRepeatCount(int i)动画重复次数(默认为0)。