一、Drawable Animation(帧动画)
帧动画主要是通过加载一系列的Drawable的资源来实现动画效果,每张图片设置一段展示的时间,相当于一帧,很多张图片连接起来,就是一段帧动画。一般帧动画通过在Drawable文件夹新建一个XML来实现,XML文件包含一个作为根节点,下面包含一系列子元素的节点,每个包含图片,和显示时间:
<?xml version="1.0" encoding="utf-8"?>
<animation-list xmlns:android="http://schemas.android.com/apk/res/android"
android:oneshot="true">
<item android:drawable="@drawable/stat_sys_battery_charge_anim1" android:duration="500" />
<item android:drawable="@drawable/stat_sys_battery_charge_anim2" android:duration="500" />
<item android:drawable="@drawable/stat_sys_battery_charge_anim3" android:duration="500" />
<item android:drawable="@drawable/stat_sys_battery_charge_anim4" android:duration="500" />
<item android:drawable="@drawable/stat_sys_battery_charge_anim5" android:duration="500" />
</animation-list>
在Activity中,把动画绑定到ImageView上:
mImageView.setImageResource(R.drawable.drawable_animation);
mAnimationDrawable = (AnimationDrawable) mImageView.getDrawable();
mAnimationDrawable.start();
至此,帧动画的使用已经完成,效果如下:
二、View Animation(补间动画)
补间动画可以执行针对的View的转换(位置,大小,旋转,透明度)。补间动画可以通过XML实现,也可以通过Java代码实现,不过一般建议通过XML实现,这样易读性高,而且可以重复使用。补间动画的XML文件一般定义在res/anim/文件夹下。该文件必须有一个根元素: ,,, ,或元素,下面可以嵌套其他动画节点。默认情况下,所有的动画同时发生。要改变它们发生的顺序,可以通过指定的startOffset的属性。
XML定义一个改变透明度的动画:
<?xml version="1.0" encoding="utf-8"?>
<!--
android:interpolator 动画的渲染器
1、accelerate_interpolator(动画加速器) 使动画在开始的时候 最慢,然后逐渐加速
2、decelerate_interpolator(动画减速器)使动画在开始的时候 最快,然后逐渐减速
3、accelerate_decelerate_interpolator(动画加速减速器)
-->
<alpha xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="5000"
android:fromAlpha="1"
android:interpolator="@android:anim/accelerate_decelerate_interpolator"
android:toAlpha="0">
</alpha>
Java代码定义改变透明度的动画:
/**
* 透明度变化
*/
public void startAlpha() {
// 动画从透明变为不透明
AlphaAnimation alphaAnimation = new AlphaAnimation(1.0f, 0.5f);
// 动画单次播放时长为2秒
alphaAnimation.setDuration(2000);
// 动画播放次数
alphaAnimation.setRepeatCount(2);
// 动画播放模式为REVERSE
alphaAnimation.setRepeatMode(Animation.REVERSE);
// 设定动画播放结束后保持播放之后的效果
alphaAnimation.setFillAfter(true);
//动画加速减速器
alphaAnimation.setInterpolator(getActivity(), android.R.anim.accelerate_decelerate_interpolator);
mImageView.startAnimation(alphaAnimation);
}
XML定义几个动画合成一个动画:
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:shareInterpolator="false">
<scale
android:duration="1000"
android:fillAfter="false"
android:fromXScale="1.0"
android:fromYScale="1.0"
android:interpolator="@android:anim/accelerate_decelerate_interpolator"
android:pivotX="50%"
android:pivotY="50%"
android:toXScale="1.5"
android:toYScale="1.5"/>
<set android:interpolator="@android:anim/decelerate_interpolator">
<scale
android:duration="800"
android:fillBefore="false"
android:fromXScale="1.5"
android:fromYScale="1.5"
android:pivotX="50%"
android:pivotY="50%"
android:startOffset="700"
android:toXScale="0.0"
android:toYScale="0.0"/>
<rotate
android:duration="800"
android:fromDegrees="0"
android:pivotX="50%"
android:pivotY="50%"
android:startOffset="700"
android:toDegrees="-45"
android:toYScale="0.0"/>
</set>
</set>
补间动画实现的效果:
三、Property Animation(属性动画)
1、属性动画的介绍
属性动画是Android 3.0 新增的一个强大的动画框架,它可以为任何的对象设置动画,可以定义一个动画让对象的某个属性伴随时间的推移而改变。View Animation仅对View对象提供了动画功能,因此想要设置非View对象的动画,必须用自己的代码来实现。View Animation另一个缺点是它只能修改View绘制地址而不是View本身。例如要绘制在屏幕上移动的按钮,按钮绘制正确,但是点击按钮的实际位置并没有改变,因此要实现自己的逻辑来处理此问题。属性动画系统会完全消除这些限制。属性动画可以为任何对象的属性设置动画,而对象本身实际属性已被修改。属性动画系统在执行动画方面更加强大可以指定想要设置动画的属性,比如颜色,位置或大小。View动画可以快速实现,代码量比较小。如果View动画已经满足需求,就没有必要使用属性动画系统。
2、属性动画的主要的类
ValueAnimator: 属性动画时序核心引擎,根据时间计算被设置动画属性的值。同时还负责管理动画的播放次数、播放模式、以及对动画设置监听器等。
ObjectAnimator: ValueAnimator的子类,设置动画一个目标对象和对象属性。当计算出一个新的动画值,就更新目标对象被设置动画的属性的值。
AnimatorSet: 提供组合动画的机制,可以设置动画一起播放,顺序播放,或者延迟播放。
TypeEvaluator:告诉属性动画系统如何计算一个给定的属性值,实现动画的开始值和结束值之间的平滑过渡。
Interpolator:一个时间插补定义如何在一个动画的特定值作为时间函数的计算。例如,指定动画在整个过程线性运行,这意味着动画均匀地移动整个时间,或者可以指定使用非线性时间的动画,例如,在开始加速,并在最后减速动画。
3、使用属性动画
Java代码使用动画,并监听动画的整个过程:
/**
* 旋转变化
*/
public void startRotate() {
ObjectAnimator objectAnimator=ObjectAnimator.ofFloat(mImageView, "rotation", 0f, 360f);
objectAnimator.setDuration(10000);
objectAnimator.addListener(new Animator.AnimatorListener() {
@Override
public void onAnimationStart(Animator animation) {
Toast.makeText(getActivity(), "objectAnimator Start", Toast.LENGTH_LONG).show();
}
@Override
public void onAnimationEnd(Animator animation) {
Toast.makeText(getActivity(), "objectAnimator End", Toast.LENGTH_LONG).show();
}
@Override
public void onAnimationCancel(Animator animation) {
}
@Override
public void onAnimationRepeat(Animator animation) {
}
});
objectAnimator.start();
}
XML定义动画:
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:ordering="sequentially">
<objectAnimator
android:valueFrom="1"
android:valueTo="0"
android:valueType="floatType"
android:propertyName="alpha"
android:duration="3000"
android:repeatMode="reverse">
</objectAnimator>
<objectAnimator
android:valueFrom="0"
android:valueTo="1"
android:valueType="floatType"
android:propertyName="alpha"
android:duration="3000"
android:repeatMode="reverse">
</objectAnimator>
</set>
在Java代码中加载使用:
Animator animator= AnimatorInflater.loadAnimator(getActivity(), R.animator.animator_alpha);
animator.setTarget(mImageView);
animator.start();
实现组合动画:
/**
* 组合动画
*/
public void startSetAnim() {
ObjectAnimator moveIn = ObjectAnimator.ofFloat(mImageView, "translationX", -500f, 0f);
ObjectAnimator rotate = ObjectAnimator.ofFloat(mImageView, "rotation", 0f, 360f);
ObjectAnimator fadeInOut = ObjectAnimator.ofFloat(mImageView, "alpha", 1f, 0f, 1f);
AnimatorSet animSet = new AnimatorSet();
animSet.play(rotate).with(fadeInOut).after(moveIn);
animSet.setDuration(5000);
animSet.start();
animSet.addListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
super.onAnimationEnd(animation);
Toast.makeText(getActivity(), "animSet End", Toast.LENGTH_LONG).show();
}
});
}
针对View对象,有更简单的用法
public void startViewPropertyAnim(){
mImageView.animate().y(600).setDuration(3000).scaleX(1.5f).scaleY(1.5f)
.setInterpolator(new BounceInterpolator());
}
属性动画可以实现View 动画的所有效果,这也是属性动画的基本用法。实现的效果: