android动画总结

Android的动画可分为逐帧动画、补间动画、属性动画(Android3.0后的新特性)

1.逐帧动画

原理

  • 将动画拆分为帧的形式,每一帧=一张图片
  • 逐帧动画就是按序播放一组预先定义好的图片

具体使用

  1. 将动画资源(即每一张图片)放入drawable文件夹
  2. 设置 & 启动动画

    • 在 res/anim的文件夹里创建动画效果.xml文件

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      <?xml version="1.0" encoding="utf-8"?>
      <animation-list
      xmlns:android="http://schemas.android.com/apk/res/android"
      android:oneshot="true" // 设置是否只播放一次,默认为false
      >

      // item = 动画图片资源;duration = 设置一帧持续时间(ms)
      <item android:drawable="@drawable/a0" android:duration="100"/>
      <item android:drawable="@drawable/a1" android:duration="100"/>
      <item android:drawable="@drawable/a2" android:duration="100"/>
      <item android:drawable="@drawable/a3" android:duration="100"/>
      <item android:drawable="@drawable/a4" android:duration="100"/>
      <item android:drawable="@drawable/a5" android:duration="100"/>
      </animation-list>
    • 载入 & 启动动画

      1
      2
      3
      4
      5
      6
      imageView.setImageResource(R.drawable.anim);
      // 1. 设置动画
      AnimationDrawable animationDrawable = (AnimationDrawable) imageView.getDrawable();
      // 2. 获取动画对象
      animationDrawable.start();
      // 3. 启动动画

特点

  • 优点:使用简单、方便
  • 缺点:容易引起 OOM,因为会使用大量 & 尺寸较大的图片资源

2.补间动画

原理

  • 通过确定开始的视图样式 & 结束的视图样式、中间动画变化过程由系统补全来确定一个动画。
  • 根据不同的动画效果,补间动画分为平移动画、缩放动画、旋转动画、透明度动画。

    具体使用(以平移动画为例)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    Button mButton = (Button) findViewById(R.id.Button);
    // 步骤1:创建 需要设置动画的 视图View

    Animation translateAnimation = new TranslateAnimation(05000500);
    // 步骤2:创建平移动画的对象:平移动画对应的Animation子类为TranslateAnimation
    // 参数分别是:
    // 1. fromXDelta :视图在水平方向x 移动的起始值
    // 2. toXDelta :视图在水平方向x 移动的结束值
    // 3. fromYDelta :视图在竖直方向y 移动的起始值
    // 4. toYDelta:视图在竖直方向y 移动的结束值

    translateAnimation.setDuration(3000);
    // 固定属性的设置都是在其属性前加“set”,如setDuration()
    mButton.startAnimation(translateAnimation);
    // 步骤3:播放动画

3.属性动画

原理

  • 补间动画 只能够作用在视图View上,即只可以对一个Button、TextView、甚至是LinearLayout、或者其它继承自View的组件进行动画操作,但无法对非View的对象进行动画操作。
  • 补间动画只是改变了View的视觉效果,而不会真正去改变View的属性。
  • 在一定时间间隔内,通过不断对值进行改变,并不断将该值赋给对象的属性,从而实现该对象在该属性上的动画效果。

    具体使用

    ValueAnimator类

  1. 原理:通过不断控制属性值的变化,再不断手动赋给对象的属性,从而实现动画效果。
  2. ValueAnimator.ofInt为例
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    // 步骤1:设置动画属性的初始值 & 结束值
    ValueAnimator anim = ValueAnimator.ofInt(0, 3);
    // ofInt()作用有两个
    // 1. 创建动画实例
    // 2. 将传入的多个Int参数进行平滑过渡:此处传入0和1,表示将值从0平滑过渡到1
    // 如果传入了3个Int参数 a,b,c ,则是先从a平滑过渡到b,再从b平滑过渡到C,以此类推
    // ValueAnimator.ofInt()内置了整型估值器,直接采用默认的.不需要设置,即默认设置了如何从初始值 过渡到 结束值

    // 步骤2:设置动画的播放各种属性
    anim.setDuration(500);
    // 设置动画运行的时长

    anim.setStartDelay(500);
    // 设置动画延迟播放时间

    anim.setRepeatCount(0);
    // 设置动画重复播放次数 = 重放次数+1
    // 动画播放次数 = infinite时,动画无限重复

    anim.setRepeatMode(ValueAnimator.RESTART);
    // 设置重复播放动画模式
    // ValueAnimator.RESTART(默认):正序重放
    // ValueAnimator.REVERSE:倒序回放

    // 步骤3:将改变的值手动赋值给对象的属性值:通过动画的更新监听器
    // 设置 值的更新监听器
    // 即:值每次改变、变化一次,该方法就会被调用一次
    anim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
    @Override
    public void onAnimationUpdate(ValueAnimator animation) {

    int currentValue = (Integer) animation.getAnimatedValue();
    // 获得改变后的值

    System.out.println(currentValue);
    // 输出改变后的值

    // 步骤4:将改变后的值赋给对象的属性值,下面会详细说明
    View.setproperty(currentValue);

    // 步骤5:刷新视图,即重新绘制,从而实现动画效果
    View.requestLayout();

    }
    });

    anim.start();
    // 启动动画

ObjectAnimator类

  1. 原理:通过不断控制属性值的变化,再不断自动赋给对象的属性,从而实现动画效果。
  2. ObjectAnimator.ofFloat为例
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    ObjectAnimator animator = ObjectAnimator.ofFloat(Object object, String property, float ....values);  

    // ofFloat()作用有两个
    // 1. 创建动画实例
    // 2. 参数设置:参数说明如下
    // Object object:需要操作的对象
    // String property:需要操作的对象的属性
    // float ....values:动画初始值 & 结束值(不固定长度)
    // 若是两个参数a,b,则动画效果则是从属性的a值到b值
    // 若是三个参数a,b,c,则则动画效果则是从属性的a值到b值再到c值
    // 以此类推
    // 至于如何从初始值 过渡到 结束值,同样是由估值器决定,此处ObjectAnimator.ofFloat()是有系统内置的浮点型估值器FloatEvaluator,同ValueAnimator讲解

    anim.setDuration(500);
    // 设置动画运行的时长

    anim.setStartDelay(500);
    // 设置动画延迟播放时间

    anim.setRepeatCount(0);
    // 设置动画重复播放次数 = 重放次数+1
    // 动画播放次数 = infinite时,动画无限重复

    anim.setRepeatMode(ValueAnimator.RESTART);
    // 设置重复播放动画模式
    // ValueAnimator.RESTART(默认):正序重放
    // ValueAnimator.REVERSE:倒序回放

    animator.start();
    // 启动动画
0%