Android中的动画分为以下三种:
(1)帧动画:本质是通过连续播放图片来实现动画效果。
(2)补间动画:设置动画开始,这是动画结束关键帧,中间过程由系统计算并补齐(针对于View组件进行四种动画改变)。
(3)属性动画:可以理解为“强化版补间动画”,可以针对于View组件的属性进行动画改变,可拓展性非常强。
接下来,分别进行说明:
一、帧动画
(1)在drawable中添加动画文件anim_progress.xml
<?xml version="1.0" encoding="utf-8"?>
<animation-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/loading_01" android:duration="80"/>
<item android:drawable="@drawable/loading_02" android:duration="80"/>
...
</animation-list>
(2)然后在布局文件中,给一个ImageView的背景设置为该帧动画。
android:background="@drawable/anim_progress"
(3)在相应的Activity中调用该动画。
private AnimationDrawable animationDrawable;
animationDrawable = (AnimationDrawable) ivAnim.getBackground();
animationDrawable.start();
animationDrawable.stop();
二、补间动画
在res资源文件夹下,创建anim文件夹,然后创建相应的动画文件。
其中,通过设置android:interpolator可以控制动画的变化速度,它有以下几个可选值:
- LinearInterpolator:动画以均匀的速度改变
- AccelerateInterpolator:在动画开始的地方改变速度较慢,然后开始加速
- AccelerateDecelerateInterpolator:在动画开始、结束的地方改变速度较慢,中间时加速
- CycleInterpolator:动画循环播放特定次数,变化速度按正弦曲线改变: Math.sin(2 * mCycles * Math.PI * input)
- DecelerateInterpolator:在动画开始的地方改变速度较快,然后开始减速
- AnticipateInterpolator:反向,先向相反方向改变一段再加速播放
- AnticipateOvershootInterpolator:开始的时候向后然后向前甩一定值后返回最后的值
- BounceInterpolator: 跳跃,快到目的值时值会跳跃,如目的值100,后面的值可能依次为85,77,70,80,90,100
- OvershottInterpolator:回弹,最后超出目的值然后缓慢改变到目的值
要注意的是:赋值的时候,驼峰命名法变为下划线命名法。可参考下面的例子。
(一)补间动画分为以下几种:
(1)渐变动画
<?xml version="1.0" encoding="utf-8"?>
<alpha
xmlns:android="http://schemas.android.com/apk/res/android"
android:interpolator="@android:anim/accelerate_decelerate_interpolator"
android:fromAlpha="0.0"
android:toAlpha="1.0"
android:duration="2000"/>
(2)缩放动画
<?xml version="1.0" encoding="utf-8"?>
<scale xmlns:android="http://schemas.android.com/apk/res/android"
android:interpolator="@android:anim/accelerate_interpolator"
android:fromXScale="0.2"
android:toXScale="1.5"
android:fromYScale="0.2"
android:toYScale="1.5"
android:pivotX="50%"
android:pivotY="50%"
android:duration="2000"/>
(3)平移动画
<?xml version="1.0" encoding="utf-8"?>
<translate android:fromXDelta="0"
android:toXDelta="50"
android:fromYDelta="0"
android:toYDelta="0"
android:duration="2000"
android:interpolator="@android:anim/linear_interpolator"
xmlns:android="http://schemas.android.com/apk/res/android" />
(4)旋转动画
<?xml version="1.0" encoding="utf-8"?>
<rotate android:fromDegrees="0"
android:toDegrees="360"
android:duration="3000"
android:interpolator="@android:anim/linear_interpolator"
android:repeatCount="-1"
android:repeatMode="restart"
android:pivotX="50%"
android:pivotY="50%"
xmlns:android="http://schemas.android.com/apk/res/android" />
(5)组合动画
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:interpolator="@android:anim/linear_interpolator"
android:shareInterpolator="true">
<alpha
android:fromAlpha="1.0"
android:toAlpha="0.1"
android:duration="2000"/>
<alpha
android:fromAlpha="0.1"
android:toAlpha="1.0"
android:duration="2000"/>
</set>
(二)如何在Activity中调用?
private Animation animation;
animation = AnimationUtils.loadAnimation(mContext, R.anim.anim_alpha);
ivAnim.startAnimation(animation);
其他动画,调用方法一样。
三、属性动画
实现方式有两种:1、通过代码来实现;2、通过XML动画文件来实现。
1、通过代码来实现属性动画。
private ObjectAnimator objectAnimator;
objectAnimator = ObjectAnimator.ofFloat(tvContent, "alpha", 1f, 0f, 1f);
objectAnimator.setDuration(3000);
objectAnimator.setRepeatMode(ValueAnimator.RESTART);
objectAnimator.setRepeatCount(-1);
objectAnimator.start();
补充一下组合属性动画:
ObjectAnimator objectAnimator_translation = ObjectAnimator.ofFloat(tvContent, "translationY", 0, 100);
ObjectAnimator objectAnimator_alpha = ObjectAnimator.ofFloat(tvContent, "alpha", 1f, 0f, 1f);
ObjectAnimator objectAnimator_rotate = ObjectAnimator.ofFloat(tvContent, "rotation", 0f, 360f);
AnimatorSet animatorSet = new AnimatorSet();
animatorSet.play(objectAnimator_alpha).with(objectAnimator_rotate).after(objectAnimator_translation);
animatorSet.setDuration(5000);
animatorSet.setInterpolator(new LinearInterpolator());
animatorSet.start();
可以看出,只要是View可以设置的属性都可以进行动画变化。比如:textColor,backgroundColor之类的都可以进行变化。
2、通过XML动画来实现动画效果
在res资源文件夹下创建animator文件夹,然后创建动画文件。
<?xml version="1.0" encoding="utf-8"?>
<objectAnimator android:propertyName="alpha"
android:valueFrom="1f"
android:valueTo="0f"
android:duration="2000"
android:repeatCount="0"
android:repeatMode="restart"
android:interpolator="@android:anim/linear_interpolator"
xmlns:android="http://schemas.android.com/apk/res/android" />
在相应的Activity中调用如下:
Animator animator = AnimatorInflater.loadAnimator(mContext, R.animator.animator_alpha);
animator.setTarget(tvContent);
animator.start();
补充一下组合动画:
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android" android:ordering="sequentially">
<objectAnimator
android:propertyName="alpha"
android:valueFrom="1f"
android:valueTo="0f"
android:duration="2000"
android:interpolator="@android:anim/linear_interpolator" />
<objectAnimator
android:propertyName="alpha"
android:valueFrom="0f"
android:valueTo="1f"
android:duration="2000"
android:interpolator="@android:anim/linear_interpolator" />
</set>
最后,如何监听动画的变化过程呢?
//添加动画过程监听
animator.addListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
super.onAnimationEnd(animation);
}
@Override
public void onAnimationStart(Animator animation) {
super.onAnimationStart(animation);
}
});
以上为最常见的用法。