Android动画笔记

Posted zhu_free

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android动画笔记相关的知识,希望对你有一定的参考价值。

android动画笔记


参考:
Android 动画总结
Animation动画详解

在Android官方文档中把动画分为三种:
- Property Animation
在3.0以后引进的,可以调整任何对象的属性来实现动画(the property animation system lets you animate properties of any object),包括尚未显示的视图控件,并且可扩展,可以用于自定义View,是推荐使用的动画实现方式;
- View Animation:
只能作用于View对象上,也被称作补间动画(补间动画)。能够在View的内容上实现一些简单的变化效果(position, size, rotation, and transparency),有xml和Android代码两种实现方式
- Drawable Animation
使用一个一个的Drawable资源来实现动画,即按次序显示图片,使其持续一定的时间类似于帧动画。

属性动画(Property Anamation/Animator)

To animate something, you specify the object property that you want to animate, such as an object’s position on the screen, how long you want to animate it for, and what values you want to animate between.

要实现一个动画,需要指定(要改变的)对象属性,比如在屏幕上的位置,持续的时间,和要变化的值。
所有可设置的项目:
- 变化的属性,不固定,可以通过代码详细设置多个属性值等;
- 变化的值,可以为多个,使变化更复杂;
- Duration 持续时间,默认为300ms;
- Time interpolation 时间插值:值以怎样的节奏变化;
- Repeat count and behavior 重复及重复行为:是否重复,重复多少次,重复时是倒着来还是回到原点再来一遍;
- Animator sets 动画集:可以在多个属性上设置变化,构成复杂的动画;
- Frame refresh delay 帧率刷新频率,默认为10ms,极限取决于系统;

对于以上的一些数值,可以使用以下的类进行更自由的设置:
- Evaluator 转换器,设置变化的值:根据传入的数字进行需要的转化最后得到属性变化的值,也就是Animator使用的ofInt,ofFloat在背后使用的那种,也可以自己编写自定义的Evaluator。因为 ofIntofFloat 都是系统直接提供的函数,所以在使用时都会有默认的加速器和 Evaluator 来使用的,不指定则使用默认的,ofInt()的默认 Evaluator 当然是 IntEvaluator,而 ofFloat() 默认的则是 FloatEvalutor
- Interpolator 插值器/加速器,设置Tenter code hereime interpolation:在给定的值变化和时间范围内,以怎样的规律变化,系统提供的有以下这些:

ValueAnimator


ValueAnimator获取一组值,设置好EvaluatorInterpolatorDuration(或使用默认的),就可以开始了,但是此时仅仅是对值进行计算和变化而已,要实现动画,还需要添加AnimatorUpdateListener并且实现其中的onAnimationUpdate方法,该方法在动画每一帧刷新时调用,在这个方法中使用值更新控件,不断改变控件的属性值,实现动画效果。

值的获取

ValueAnimator提供几个方法来获取值的变化范围,对于ARGB值,float,int都有默认的方法(以及相对应的Evaluator)
几个方法都不提供默认初始值,所以参数至少要两个,当然可以更多,变化就更复杂;
- ofArgb(int... values)
- ofFloat(float... values)
- ofInt(int... values)
- ofObject (TypeEvaluator evaluator, Object... values):不确定值的数据类型,需要指定一个Evaluator

设置动画

ValueAnimator animation = ValueAnimator.ofFloat(0f, 100f);
//ValueAnimator animation = ValueAnimator.ofObject(new MyTypeEvaluator(), startPropertyValue, endPropertyValue);
animation.setDuration(1000);
animation.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() 
    @Override
    public void onAnimationUpdate(ValueAnimator updatedAnimation) 
        // You can use the animated value in a property that uses the
        // same type as the animation. In this case, you can use the
        // float value in the translationX property.
        float animatedValue = (float)updatedAnimation.getAnimatedValue();
        textView.setTranslationX(animatedValue);
    
);
animation.start();

ObjectAnimator

ObjectAnimatorValueAnimator的子类,使用起来更加方便快捷,但是对使用场景有一定的要求。
ObjectAnimatorof方法中,除了设定值之外,还需要直接指定动画作用的控件,和值作用的属性,而且这个属性必须在控件的类中有set方法可以设置值,即把ValueAnimator中的updateListener简化了

ObjectAnimator animator = ObjectAnimator.ofFloat(tv,"alpha",1,0,1);  
animator.setDuration(2000);  
animator.start();

这样设置就可以直接实现动画了。

AnimatorSet

对于多个属性值变化的动画,可以编写多个ObjectAnimator,然后使用AnimatorSet进行控制。

AnimatorSet bouncer = new AnimatorSet();
bouncer.play(bounceAnim).before(squashAnim1);
bouncer.play(squashAnim1).with(squashAnim2);
bouncer.play(squashAnim1).with(stretchAnim1);
bouncer.play(squashAnim1).with(stretchAnim2);
bouncer.play(bounceBackAnim).after(stretchAnim2);
// 全部一起运行
bouncer.playTogether(bounceAnim, squashAnim1, squashAnim2, stretchAnim1, stretchAnim2, bounceBackAnim);
ValueAnimator fadeAnim = ObjectAnimator.ofFloat(newBall, "alpha", 1f, 0f);
fadeAnim.setDuration(250);
AnimatorSet animatorSet = new AnimatorSet();
animatorSet.play(bouncer).before(fadeAnim);
animatorSet.start();

XML定义动画

文件放在res/animator/文件夹下
语法:

<set
  android:ordering=["together" | "sequentially"]>

    <objectAnimator
        android:propertyName="string"
        android:duration="int"
        android:valueFrom="float | int | color"
        android:valueTo="float | int | color"
        android:startOffset="int"
        android:repeatCount="int"
        android:repeatMode=["repeat" | "reverse"]
        android:valueType=["intType" | "floatType"]/>

    <animator
        android:duration="int"
        android:valueFrom="float | int | color"
        android:valueTo="float | int | color"
        android:startOffset="int"
        android:repeatCount="int"
        android:repeatMode=["repeat" | "reverse"]
        android:valueType=["intType" | "floatType"]/>

    <set>
        ...
    </set>
</set>

监听器

  • onAnimationStart() - Called when the animation starts.
  • onAnimationEnd() - Called when the animation ends.
  • onAnimationRepeat() - Called when the animation repeats itself.
  • onAnimationCancel()- Called when the animation is canceled. A cancelled animation also calls
  • onAnimationEnd(), regardless of how they were ended.

传统动画(View Animation/Tweened Animation,3.0以前)

View Animation可以使用xml定义,也可以编写android代码,但一般推荐使用xml,因为更易读并且可以重复使用。

xml定义动画

每一个动画需要定义动画动作,什么时候开始,持续多长时间,这些动画可以是顺序发生的,也可以是同时进行的。
每个动画需要设置一系列的参数(大小,旋转角度,位置等起始值,结束值,起始时间,持续时间,插值器等)。
动画xml文件放置在res/anim/文件夹下,只能有一个root标签,可以是<alpha>, <scale>, <translate>, <rotate>中的某一个,也可以是<set>。默认情况下定义的所有动画会同时运行,需要顺序进行的话要自行使用startOffset属性定义。
例子:

<set android:shareInterpolator="false">
    <scale
        android:interpolator="@android:anim/accelerate_decelerate_interpolator"
        android:fromXScale="1.0"
        android:toXScale="1.4"
        android:fromYScale="1.0"
        android:toYScale="0.6"
        android:pivotX="50%"
        android:pivotY="50%"
        android:fillAfter="false"
        android:duration="700" />
    <set android:interpolator="@android:anim/decelerate_interpolator">
        <scale
           android:fromXScale="1.4"
           android:toXScale="0.0"
           android:fromYScale="0.6"
           android:toYScale="0.0"
           android:pivotX="50%"
           android:pivotY="50%"
           android:startOffset="700"
           android:duration="400"
           android:fillBefore="false" />
        <rotate
           android:fromDegrees="0"
           android:toDegrees="-45"
           android:toYScale="0.0"
           android:pivotX="50%"
           android:pivotY="50%"
           android:startOffset="700"
           android:duration="400" />
    </set>
</set>

在代码中设置xml动画:

Animation animation = AnimationUtils.loadAnimation(mContext, R.anim.alpha_anim);
img = (ImageView) findViewById(R.id.img);
img.startAnimation(animation);

在xml中定义的属性同样也可以使用代码设置。
所有的Animation有一些通用的属性,如图

除此之外每种动画根据它们的特征有一些特定的属性。

参考:
官方文档Animation
官方文档Animation Resources

AlphaAnimation

控制透明度变化的动画。
有两个属性表示透明度变化的起始值fromAlpha和结束值toAlpha
xml语法:

<alpha
    android:fromAlpha="float"
    android:toAlpha="float" />

代码控制:

AlphaAnimation am = new AlphaAnimation(0f, 1f);
am.setDuration(1000);
mView.startAnimation(am);

ScaleAnimation

控制尺寸变化的动画。
主要参数如下:
- fromX/toX:开始和结束时X的缩放比,0为不显示,1为原大小
- fromY/toY:开始和结束时Y的缩放比,0为不显示,1为原大小
- pivotX/pivotY:进行缩放时的基准点,即以这个点为固定位置进行缩放,该点位置不变,0为左上,以百分数表示(使用代码可以设置pivotXType等值,以View本身之外的参照物为基准点,此处咱不讨论)

xml语法:

<scale
    android:fromXScale="float"
    android:toXScale="float"
    android:fromYScale="float"
    android:toYScale="float"
    android:pivotX="float"
    android:pivotY="float" /

代码语法和上面其他动画类似,根据参数的不同有不同的构造方法,参考官方文档即可。

TranslateAnimation

控制位置变化的动画。
主要属性:
- fromX/toX:开始/结束时的X值
- fromY/toY:开始/结束时的Y值

这些值同样也可以指定不限于View本身的参照物。
xml语法:

<translate
    android:fromXDelta="float"
    android:toXDelta="float"
    android:fromYDelta="float"
    android:toYDelta="float" />

详细用法参考TranslateAnimation

RotateAnimation

控制旋转的动画。
主要属性:
- fromDegrees/toDegrees:旋转起始/结束时的偏移角度;
- pivotX/pivotY:旋转的基准点,同样可以用pivotX/YType设置参照物

xml语法:

<rotate
    android:fromDegrees="float"
    android:toDegrees="float"
    android:pivotX="float"
    android:pivotY="float" />

代码语法参考RotateAnimation

AnimationSet

协调多个动画的行为。
xml语法:

<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:interpolator="@[package:]anim/interpolator_resource"
    android:shareInterpolator=["true" | "false"] >
    ...
    <set>
        ...
    </set>
</set>

其中:interpolator即插值器,上面说过;shareInterpolator指是否把插值器应用到所有的子动画上,值是布尔型。

代码语法:

AnimationSet as = new AnimationSet(false);
as.addAnimation(alphaAni);
as.addAnimation(scaleAni);
...
as.setDuration(1000);
mView.startAnimation(as);

监听器

new Animation.AnimationListener() 
   @Override
    public void onAnimationStart(Animation animation) 
        // TODO Auto-generated method stub

    

    @Override
    public void onAnimationRepeat(Animation animation) 
        // TODO Auto-generated method stub

    

    @Override
    public void onAnimationEnd(Animation animation) 
        // TODO Auto-generated method stub

    

帧动画(Drawable Animation/Frame Animation)

和其他动画不同,Drawable Animation的资源文件放在res/drawable/中:

<animation-list xmlns:android="http://schemas.android.com/apk/res/android"
    android:oneshot="true">
    <item android:drawable="@drawable/rocket_thrust1" android:duration="200" />
    <item android:drawable="@drawable/rocket_thrust2" android:duration="200" />
    <item android:drawable="@drawable/rocket_thrust3" android:duration="200" />
</animation-list>

其中如果onshot设置为true,动画运行一次并停留在最后一个场景,如果为false,则循环播放。
使用时:

// Load the ImageView that will host the animation and
 // set its background to our AnimationDrawable XML resource.
 ImageView img = (ImageView)findViewById(R.id.spinning_wheel_image);
 img.setBackgroundResource(R.drawable.spin_animation);

 // Get the background, which has been compiled to an AnimationDrawable object.
 AnimationDrawable frameAnimation = (AnimationDrawable) img.getBackground();

 // Start the animation (looped playback by default).
 frameAnimation.start();

以上是关于Android动画笔记的主要内容,如果未能解决你的问题,请参考以下文章

android动画笔记

Android动画(Android Animation)笔记

Android动画(开发艺术探索读书笔记)

Android动画深入分析读书笔记

Android属性动画初步学习笔记

《android开发艺术探索》读书笔记--动画