一、概述
Android动画大致为三种:
- Tween Animation:补间动画,(View)通过对场景里的对象不断做图像变换(平移、缩放、旋转)产生动画效果,即是一种渐变动画。
- Frame Animation:逐帧动画,(Drawable)顺序播放事先做好的图像,是一种画面转换动画。
- Property Animation:属性动画,通过动态地改变对象的属性从而达到动画效果,属性动画为API 11新特性。
1、Tween Animation(View)对View进行操作,有四种形式:
- alpha 渐变透明度动画效果
- scale 渐变尺寸伸缩动画效果
- translate 画面位置移动动画效果
- rotate 画面旋转动画效果
这四种动画实现方式都是通过Animation类和AnimationUtils配合实现。可以通过xml实现:动画的XML文件在工程中res/anim目录
如:anim.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android" >
<alpha
fromAlpha ---- 透明度起始值,0表示完全透明
toAlpha ---- 透明度最终值,1表示不透明/>
<scale
fromXScale ---- 水平方向缩放的起始值,比如0
fromYScale ---- 竖直方向缩放的起始值,比如0
toXScale ---- 水平方向缩放的结束值,比如2
toYScale ---- 竖直方向缩放的结束值,比如2
pivotX ---- 缩放支点的x坐标
pivotY ---- 缩放支点的y坐标(支点可以理解为缩放的中心点,缩放过程中这点的坐标是不变的;支点默认在中心位置)/>
<translate
fromXDelta ---- x起始值
toXDelta ---- x结束值
fromYDelta ---- y起始值
toYDelta ---- y结束值/>
<rotate
fromDegrees ---- 旋转起始角度
toDegrees ---- 旋转结束角度/>
</set>
使用动画
Animation animation = AnimationUtils.loadAnimation(that,R.anim.anim);
animation.setDuration(300);
animation.setAnimationListener(new Animation.AnimationListener() { //动画状态监听
@Override
public void onAnimationStart(Animation animation) {
}
@Override
public void onAnimationEnd(Animation animation) {
}
@Override
public void onAnimationRepeat(Animation animation) {
}
});
mAnimView.setAnimation(animation);
2、Frame Animation (drawable):
Frame Animation是顺序播放事先做好的图像,操作的drawable,使用较多的场景是自定义的loading效果,使用AnimationDrawable来实现定义的Frame Animation。
xml文件:res/drawable/frame.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/p1" android:duration="500"/>
<item android:drawable="@drawable/p2" android:duration="500"/>
<item android:drawable="@drawable/p3" android:duration="500"/>
<item android:drawable="@drawable/p4" android:duration="500"/>
</animation-list>
使用动画:
AnimationDrawable anim = (AnimationDrawable)getResources().
getDrawable(R.drawable.frame);
textWidget.setBackgroundDrawable(anim);
anim.start();
3、Property Animation(Android SDK >= 3.0)对对象属性进行操作的动画
属性动画要求动画作用的对象提供该属性的get和set方法,属性动画根据你传递的该熟悉的初始值和最终值,以动画的效果多次去调用set方法,每次传递给set方法的值都不一样,确切来说是随着时间的推移,所传递的值越来越接近最终值。总结一下,你对object的属性xxx做动画,如果想让动画生效,要同时满足两个条件:
- object必须要提供setXxx方法,如果动画的时候没有传递初始值,那么还要提供getXxx方法,因为系统要去拿xxx属性的初始值(如果这条不满足,程序直接Crash)
- object的setXxx对属性xxx所做的改变必须能够通过某种方法反映出来,比如会带来ui的改变啥的(如果这条不满足,动画无效果但不会Crash)
相关的类:
- ObjectAnimator
- ValueAnimator
- AnimatorSet
- AnimatorInflater
- TimeInterpolator
- TypeEvaluator
1、ObjectAnimator
ObjectAnimator.ofFloat(myObject,"translationY",myObject.getHeight()).start();
改变一个对象(myObject)的 translationY属性,让其沿着Y轴向上平移一段距离。
2、ValueAnimator
ValueAnimator colorAnim = ValueAnimator.ofInt(this, "backgroundColor", 0xFFFF8080, 0xFF8080FF);
colorAnim.setDuration(3000);
colorAnim.setEvaluator(new ArgbEvaluator());
colorAnim.setRepeatCount(ValueAnimator.INFINITE);
colorAnim.setRepeatMode(ValueAnimator.REVERSE);
colorAnim.start();
改变一个对象的背景颜色,并且动画无限循环且有反转效果。
1,2小结:对于ObjectAnimator和ValueAnimator,ObjectAnimator是继承ValueAnimator的。都提供了ofInt、ofFloat、ofObject,这几个方法都是设置动画作用的元素、作用的属性、动画开始、结束、以及中间的任意个属性值。
3、AnimatorSet
public void togetherRun(View view)
{
ObjectAnimator anim1 = ObjectAnimator.ofFloat(view, "scaleX",
1.0f, 2f);
ObjectAnimator anim2 = ObjectAnimator.ofFloat(view, "scaleY",
1.0f, 2f);
AnimatorSet animSet = new AnimatorSet();
animSet.setDuration(2000);
animSet.setInterpolator(new LinearInterpolator());
//两个动画同时执行
animSet.playTogether(anim1, anim2);
animSet.start();
}
public void playWithAfter(View view)
{
float cx = mBlueBall.getX();
ObjectAnimator anim1 = ObjectAnimator.ofFloat(view, "scaleX",
1.0f, 2f);
ObjectAnimator anim2 = ObjectAnimator.ofFloat(view, "scaleY",
1.0f, 2f);
ObjectAnimator anim3 = ObjectAnimator.ofFloat(view,
"x", cx , 0f);
ObjectAnimator anim4 = ObjectAnimator.ofFloat(view,
"x", cx);
/**
* anim1,anim2,anim3同时执行
* anim4接着执行
*/
AnimatorSet animSet = new AnimatorSet();
animSet.play(anim1).with(anim2);
animSet.play(anim2).with(anim3);
animSet.play(anim4).after(anim3);
animSet.setDuration(1000);
animSet.start();
}
两个效果:
第一:使用playTogether两个动画同时执行,当然还有playSequentially依次执行。
第二:如果我们有很多动画,如何使用代码控制顺序,比如1,2同时;3在2后面;4在1之前等
4、AnimatorInflater
使用AnimatorInflater加载动画的资源文件,然后设置目标就可以了!提供一个大神的链接,里面有详情讲解,还有一个LayoutTransition布局动画的可以参考:
http://blog.csdn.net/lmj623565791/article/details/38092093
5、TimeInterpolator
TimeInterpolator中文翻译为时间插值器,它的作用是根据时间流逝的百分比来计算出当前属性值改变的百分比,系统预置的有LinearInterpolator(线性插值器:匀速动画)、AccelerateDecelerateInterpolator(加速减速插值器:动画两头慢中间快)和DecelerateInterpolator(减速插值器:动画越来越慢)等
6、TypeEvaluator
TypeEvaluator的中文翻译为类型估值算法,它的作用是根据当前属性改变的百分比来计算改变后的属性值,系统预置的有IntEvaluator(针对整型属性)、FloatEvaluator(针对浮点型属性)和ArgbEvaluator(针对Color属性)。
说明:属性动画要求该属性有set方法和get方法(可选);插值器和估值算法除了系统提供的外,我们还可以自定义,实现方式也很简单,因为插值器和估值算法都是一个接口,且内部都只有一个方法,我们只要派生一个类实现接口就可以了,然后你就可以做出千奇百怪的动画效果。具体一点就是:自定义插值器需要实现Interpolator或者TimeInterpolator,自定义估值算法需要实现TypeEvaluator。还有就是如果你对其他类型(非int、float、color)做动画,你必须要自定义类型估值算法。
总结
使用类 | 作用 | 备注 |
---|---|---|
ValueAnimator | 先改变值,然后 手动赋值 给对象的属性 |
本质是对值的操作 |
ObjectAnimator | 先改变值,然后 自动赋值 给对象的属性 |
采用get() & set() 进行自动赋值 |
AnimatorSet | 实现 组合动画 | |
ViewPropertyAnimator | 采用对对象操作 实现属性动画 | |
addListener() | 动画监听器 监听动画开始、结束、取消、重复时刻 | 可采用动画适配器(AnimatorListenterAdapter)按需监听动画 |