Android中AnimationDrawable,Animator和Animation

一.AnimationDrawable、Animation、Animator是什么

AnimationDrawable是称为 逐帧动画,它可以将几个Drawable排列按照顺序播放,可以在使用Drawable的地方播放AnimationDrawable动画。Animation称为补间动画,它和View可以配套使用,只可以实现View的alpha,rotate,scale,translate几个属性的改变。Animator称之为属性动画,它可以计算出一段时间内一个数到另外一个数的变化(比如0到2变化2秒变化完成,匀速的话,在1s时这个值就是1),Animator是在3.0及3.0以后版本才有的。


二.AnimationDrawable


我们可以在XML中按顺序填写需要播放的Drawable,这个文件也是一个Drawable资源




    
    
    
    

我们把这个AnimationDrawable放到需要的播放的地方,比如说一个TextView的background

        mTextView.setBackgroundResource(R.drawable.fame_animation);
        AnimationDrawable animationDrawable = (AnimationDrawable) mTextView.getBackground();
        animationDrawable.start(); 


三.Animation和Animator

把Animation和Animator一起总结是因为这两个类都很多用于View的动画实现。

1.Animation实现

Animation中Xml编写



    
    

这个xml文件描述的动画是透明度从0(fromAlpha)到1(toAlpha)经历4000(duration)毫秒,从0°(fromDegrees)到120°(toDegrees)旋转中心是x是50%的位置y也是50%位置。这两个动画是同时进行的。
在java代码中

	animation = AnimationUtils.loadAnimation(this, R.anim.scale_animation);//将xml文件解析成Animation实例
	mButton.startAnimation(animation);

当然我们也可以直接通过构造函数直接生成一个Animation

        AnimationSet animationSet = new AnimationSet(false);//是否共享Interpolator(插值器,后面会介绍)
        animation = new AlphaAnimation(0, 1);//透明度0到1
        animation.setDuration(4000);//透明动画播放时间
        animationSet.addAnimation(animation);//把透明动画放入到set中
        mButton.startAnimation(animationSet);//在mButton上播放动画

生成一个AlphaAnimation实例,再生成一个AnimationSet,再把透明动画放入一个View中开启这个动画。如果我们只有一个动画,我们也可以直接通过startAnimation(Animation)播放一个动画。

2.Animation中的Interpolator

Interpolator是一个可以控制在某个时间段动画播放快慢的接口。

    public float getInterpolation(float input) {
        return input;
    }

我先总结补间动画基本原理。
补间动画实现是通过改变控件在画布的上绘制的数值来实现的。比如我们写一个位移的动画从0到100,时间为100ms。那么当动画执行10ms时那么就是动画执行了0.1,那么这个时候位移应该是10。这个时候改变控件在画布上绘制的位置。就实现了动画。
当我们执行到10s时候,这个input传进来的值就是0.1,如果我们直接返回input的话,那么在10s的时候位移就是10,但是如果我们返回input * input,那么返回值就是0.01,在10s这个时候位移的就是1。根据数学我们知道x^2,当0~1越靠近1那么值变化就越快。所以越到1,位移就越快,也就是说我们可以通过不同的算法来控制动画的播放速度。比如

    public float getInterpolation(float input) {
        if(input < 0.9){
	     return 0;
	}
	return input;
    }

当我们写成这样,那么100ms中前90ms动画是不会有任何反应,当超过90ms时马上到到90位置。
我们这样就可以完美的控制一个动画在任意时间点播放速度。

3.Animator

Animator相对于Animation要灵活许多,它其实主要功能就是计算数值,而这些数值要用来做什么,这些交给用程序员指定。
我们举个ValueAnimator的例子,ValueAnimator是Animation的子类,我们看下他的使用方法。
        animator = ValueAnimator.ofFloat(0,200);//设定起始值和结束值
        animator.setDuration(4000);//设置播放时间
        animator.setEvaluator(new FloatEvaluator(){//值计算公式
            @Override
            public Float evaluate(float fraction, Number startValue, Number endValue) {
                return super.evaluate(fraction, startValue, endValue);
            }
        });
        animator.setInterpolator(new TimeInterpolator() {//比例变化时调用和Animation一样
            @Override
            public float getInterpolation(float input) {
                return input * input;
            }
        });
        animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {//当数值变化时候调用
            @Override
            public void onAnimationUpdate(ValueAnimator animation) {
                float proValue = (float)animation.getAnimatedValue();//获取当前数值
                mButton.setTranslationX(proValue);//改变View的属性
            }
        });
        animator.start();

这个功能就是实现一个view从0到200移动的过程,Animator使用上和Animation不同的是,它会在数值变化时候会回调监听器,然后通过用户自己去实现该用这个数值做什么事。
其中TimeInterpolator在Animator中和Animation中做的是一样的,Evaluator接口传入的值分别代表fraction是Interpolator返回值,startValue和endValue就是对应开始结束的值。这边我们可以根据起始和结束值和比例对最后结果直接有一个控制,而不是通过控制比例。
说到这个时候我们可以明白Animation和ValueAnimator区别,Animation使用上只能改变几种特定的View属性,ValueAnimator它更偏向于计算数值,将最后数值给你,让你自己决定这个数值变化的时候该干什么,所以ValueAnimator可以和任何属性配套使用。

4.ObjectAnimator使用

ObjectAnimator和ValueAnimator一样是Animator的子类,这个类可以直接指定我们需要改变的属性,然后通过反射回调这个属性的set方法。使用如下
        animator = ObjectAnimator.ofFloat(mButton,"TranslationX", 0, 100);//设置需要改变的Object,属性名,起始,结束值
        animator.start();开始
这是简便的用法

5.Animation和Animator实现上的区别

Animation
他的实现机制是,在每次进行绘图的时候,通过对整块画布的矩阵进行变换(具体值也是通过矩阵运算得出来的,我们可以自定义一个Animation然后去改变这个矩阵的值就可以实现我们自己想要的动画),从而实现一种视图坐标的移动,但实际上其在 View 内部真实的坐标位置及其他相关属性始终恒定。
Animator
Animator 动画的实现机制说起来其实更加简单一点,因为他其实只是计算动画开启之后,结束之前,到某个时间点得时候,某个属性应该有的值,然后通过回调接口去设置具体值,其实 Animator 内部并没有针对某个 view 进行刷新,来实现动画的行为,动画的实现是在设置具体值的时候,方法内部自行调取的类似 invalidate 之类的方法实现的.也就是说,使用 Animator ,内部的属性发生了变化.
两者的区别就是Animation改变的是具体的属性,而Animator改变的只是在画布上显示。差别最大就是当你在为一个Button设置位移动画0到100,Animation播放后,你点击100那个位置是无效的,你点击0的时候才有用,改变的只是画布上绘制的位置,而Animator改变的是真正的熟悉,也就位移完后你点击button位置就可以响应事件。


四.各种动画的属性

1.AnimationDrawable属性

  • android:drawable 一个播放Drawable
  • android:duration 播放时间
  • android:oneshot 是否只播放一次
  • android:variablePadding 允许drawable的填充基于所选的当前状态而改变。 
  • android:visible 是否可见

2.Animation属性android:detachWallpaper

  • android:duration Amount of time (in milliseconds) for the animation to run. 
  • android:fillAfter When set to true, the animation transformation is applied after the animation is over. 
  • android:fillBefore When set to true or when fillEnabled is not set to true, the animation transformation is applied before the animation has started. 
  • android:fillEnabled When set to true, the value of fillBefore is taken into account. 
  • android:interpolator Defines the interpolator used to smooth the animation movement in time. 
  • android:repeatCount Defines how many times the animation should repeat. 
  • android:repeatMode Defines the animation behavior when it reaches the end and the repeat count is greater than 0 or infinite. 
  • android:startOffset Delay in milliseconds before the animation runs, once start time is reached. 
  • android:zAdjustment Allows for an adjustment of the Z ordering of the content being animated for the duration of the animation. 

你可能感兴趣的:(android)