Skip to content

Animation

在 Android 中,动画是一种常用的用户界面设计元素,用于实现视觉上的交互效果和用户体验提升。Android 提供了丰富的动画支持,包括补间动画(Tween Animation)、帧动画(Frame Animation)、属性动画(Property Animation)等。以下是对这些动画的简要介绍:

  1. 补间动画(Tween Animation)

    • 补间动画是一种基于起始状态和结束状态之间的插值计算来实现动画效果的简单方式。
    • 常见的补间动画包括平移动画(TranslateAnimation)、旋转动画(RotateAnimation)、缩放动画(ScaleAnimation)、透明度动画(AlphaAnimation)等。
    • 补间动画适用于简单的动画效果,但不支持动态修改动画参数。
  2. 帧动画(Frame Animation)

    • 帧动画是一种通过按顺序显示一组预先定义的图像帧来实现动画效果的方式。
    • 帧动画通过在 XML 文件中定义一组连续的帧来创建,然后将其应用到 ImageView 等视图上,使其按照指定的顺序播放帧。
    • 帧动画适用于需要按照指定顺序播放图像序列的场景,如动画 GIF 图片。
  3. 属性动画(Property Animation)

    • 属性动画是一种在一定时间内改变视图的属性值,从而实现动画效果的方式。
    • 属性动画支持对任何对象的任何属性进行动画处理,包括视图的位置、大小、透明度等。
    • 常见的属性动画类包括 ValueAnimator、ObjectAnimator 和 AnimatorSet 等。
  4. 插值器(Interpolator)

    • 插值器用于控制动画过程中的速度变化,可以通过设置插值器来改变动画的加速度或减速度等。
    • Android 提供了多种内置的插值器,如加速插值器(AccelerateInterpolator)、减速插值器(DecelerateInterpolator)、弹跳插值器(BounceInterpolator)等。
  5. 动画监听器(Animation Listener)

    • 动画监听器用于监听动画的各个阶段,如动画开始、结束、重复等。
    • 可以通过设置动画监听器来执行在特定动画事件发生时需要执行的操作。

Android 中的动画系统提供了丰富的功能和灵活的接口,可以实现各种各样的动画效果,从简单的平移、旋转、缩放到复杂的属性动画,以及各种插值器和监听器,为开发者提供了丰富的动画体验和交互方式。

帧动画

帧动画(Frame Animation)是 Android 中一种基于一组连续的图像帧来实现动画效果的方式。它通过按顺序显示一系列预定义的图像帧来模拟动画效果。以下是关于帧动画的详细介绍:

  1. 资源准备

    • 首先需要准备一组连续的图像帧,通常是以单张图片的形式存储在 drawable 文件夹下。
    • 每一帧都是一个静态的图像,按照顺序排列,可以是 PNG、JPEG 或者 GIF 格式的图像。
  2. 定义动画

    • 在 res/drawable 目录下创建一个 XML 文件,用于定义帧动画。
    • 在 XML 文件中使用 <animation-list> 元素来定义帧动画,并在其中添加 <item> 元素来引用每一帧的图像资源。
    • 指定每一帧的持续时间和重复次数等参数,以控制动画的播放速度和循环次数。
  3. 应用动画

    • 将定义好的帧动画应用到视图上,通常使用 ImageView 控件来显示动画。
    • 通过调用 ImageView 的 setBackgroundResource() 或者 setImageResource() 方法来设置帧动画资源,从而将动画应用到 ImageView 上。
  4. 控制动画

    • 动画可以通过调用 start() 方法来开始播放,stop() 方法来停止播放,以及 isRunning() 方法来检查动画是否正在运行。
    • 可以设置监听器来监听动画的各个阶段,如动画开始、结束、重复等。
  5. 注意事项

    • 帧动画的性能相对较低,因为它是将一系列图像按顺序显示,如果图像帧数过多或者图像过大,可能会导致性能问题。
    • 帧动画适用于需要按照指定顺序播放图像序列的场景,如简单的动画效果、加载提示等。

帧动画是 Android 开发中常用的动画实现方式之一,它简单、直观,适用于需要按照顺序播放图像序列的场景。通过合理准备图像资源和设置动画参数,可以实现各种各样的帧动画效果,为应用程序增添动感和趣味。

补间动画

在 Android 中,补间动画(Tween Animation)是一种基于起始状态和结束状态之间的插值计算来实现动画效果的简单方式。补间动画可以应用于视图的平移、旋转、缩放、透明度等属性的变化,从而创建各种各样的动画效果。以下是关于补间动画的详细介绍:

  1. 补间动画类型

    • 平移动画(TranslateAnimation):在给定的时间段内,视图沿着 X 轴和 Y 轴方向从起始位置移动到结束位置。
    • 旋转动画(RotateAnimation):在给定的时间段内,视图围绕指定的旋转中心点从起始角度旋转到结束角度。
    • 缩放动画(ScaleAnimation):在给定的时间段内,视图以指定的缩放中心点从起始大小缩放到结束大小。
    • 透明度动画(AlphaAnimation):在给定的时间段内,视图从起始透明度变化到结束透明度。
  2. 定义动画

    • 在 res/anim 目录下创建一个 XML 文件,用于定义补间动画。
    • 在 XML 文件中使用 <translate><rotate><scale> 或者 <alpha> 等元素来定义不同类型的补间动画,并设置起始状态和结束状态等参数。
  3. 应用动画

    • 将定义好的补间动画应用到视图上,通常使用 AnimationUtils 类的静态方法来加载动画资源。
    • 可以使用视图的 startAnimation() 方法来启动动画,从而将动画应用到视图上。
  4. 控制动画

    • 动画可以通过监听器来监听动画的各个阶段,如动画开始、结束、重复等。
    • 可以使用监听器来执行在特定动画事件发生时需要执行的操作,如启动下一个动画、更新视图状态等。
  5. 注意事项

    • 补间动画只能改变视图的外观,而不能改变视图的真实属性。例如,平移动画只是移动视图的绘制位置,而不会改变视图的布局参数。
    • 补间动画适用于简单的动画效果,但不支持动态修改动画参数,如改变目标位置、旋转中心等。

补间动画是 Android 开发中常用的动画实现方式之一,它简单、直观,适用于简单的动画效果,如视图的平移、旋转、缩放和透明度变化等。通过合理设置动画参数和监听器,可以实现各种各样的补间动画效果,为应用程序增添动感和活力。

属性动画

属性动画(Property Animation)是 Android 中一种强大的动画方式,可以对任何对象的任何属性进行动画处理。相比于补间动画,属性动画具有更加灵活的控制能力和更多的动画效果,而且支持动态修改属性值。以下是关于属性动画的详细介绍及其用法:

1. 属性动画基本概念:

  • 对象属性:属性动画可以操作任何对象的属性,包括视图(View)的位置、大小、透明度等,以及自定义对象的属性。

  • 持续时间:动画的持续时间决定了动画执行的时间长度,可以在动画设置中指定。

  • 加速度插值器:属性动画支持自定义动画的速度变化曲线,通过设置插值器(Interpolator)可以控制动画的加速度、减速度等。

  • 监听器:可以设置动画监听器来监听动画的各个阶段,如动画开始、结束、重复等,以执行相应的操作。

2. 属性动画的用法:

2.1 在 XML 中定义属性动画:

xml
<!-- 在 res/animator 目录下创建属性动画资源文件 -->
<!-- 示例:scale_anim.xml -->
<objectAnimator
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:propertyName="scaleX"
    android:valueFrom="1.0"
    android:valueTo="2.0"
    android:duration="1000" />

2.2 在代码中加载和应用属性动画:

java
// 加载属性动画资源
Animator animator = AnimatorInflater.loadAnimator(context, R.animator.scale_anim);

// 设置目标对象
animator.setTarget(view);

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

2.3 使用属性动画类自定义动画:

java
// 创建属性动画对象,指定目标对象、属性名称、起始值和结束值
ObjectAnimator animator = ObjectAnimator.ofFloat(view, "translationX", 0f, 100f);

// 设置动画持续时间
animator.setDuration(1000);

// 设置加速度插值器
animator.setInterpolator(new AccelerateDecelerateInterpolator());

// 设置动画监听器
animator.addListener(new AnimatorListenerAdapter() {
    @Override
    public void onAnimationEnd(Animator animation) {
        // 动画结束时执行的操作
    }
});

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

动画 API

1. 接口

Animator.AnimatorListener

android.animation.Animator.AnimatorListener 接口是属性动画框架提供的监听器接口,用于监听属性动画的各个阶段,如动画开始、结束、取消、重复等。通过实现该接口,并将监听器设置到相应的动画对象上,开发者可以在动画执行过程中执行自定义的操作,以响应动画的各个事件。以下是关于 Animator.AnimatorListener 接口的详细介绍:

  1. 作用

    • Animator.AnimatorListener 接口用于监听属性动画的各个阶段,以执行相应的操作,如在动画开始时执行某些初始化操作,在动画结束时执行某些清理操作等。
  2. 接口方法

    • onAnimationStart(Animator animation):在动画开始时调用,用于执行一些初始化操作。
    • onAnimationEnd(Animator animation):在动画结束时调用,用于执行一些清理操作。
    • onAnimationCancel(Animator animation):在动画被取消时调用,用于执行一些清理操作。
    • onAnimationRepeat(Animator animation):在动画重复播放时调用,用于执行一些特定的重复操作。
  3. 使用方法

    • 创建一个类实现 Animator.AnimatorListener 接口,并重写相应的方法。
    • 将实现了 AnimatorListener 接口的监听器对象设置到相应的动画对象上,以监听动画的各个阶段。
  4. 示例代码

    • 实现一个简单的动画监听器类,用于在动画开始和结束时打印日志:
    java
    public class MyAnimatorListener implements Animator.AnimatorListener {
        @Override
        public void onAnimationStart(Animator animation) {
            Log.d("Animation", "Animation started");
        }
    
        @Override
        public void onAnimationEnd(Animator animation) {
            Log.d("Animation", "Animation ended");
        }
    
        @Override
        public void onAnimationCancel(Animator animation) {
            Log.d("Animation", "Animation canceled");
        }
    
        @Override
        public void onAnimationRepeat(Animator animation) {
            Log.d("Animation", "Animation repeated");
        }
    }
    • 将监听器对象设置到相应的动画对象上:
    java
    ObjectAnimator animator = ObjectAnimator.ofFloat(view, "translationX", 0f, 100f);
    animator.setDuration(1000);
    animator.addListener(new MyAnimatorListener());
    animator.start();

Animator.AnimatorListener 接口为开发者提供了监听属性动画各个阶段的接口,通过实现该接口并重写相应的方法,可以执行自定义的操作以响应动画的开始、结束、取消、重复等事件。通过设置动画监听器,开发者可以更加灵活地控制动画的行为,并实现各种各样的动画效果。

TypeEvaluator

在 Android 中,android.animation.TypeEvaluator 接口是属性动画框架的一部分,用于在属性动画中计算属性值的过渡效果。该接口允许开发者自定义动画过程中属性值的变化规则,从而实现更加灵活和个性化的动画效果。以下是关于 TypeEvaluator 接口的详细介绍:

  1. 作用

    • TypeEvaluator 接口用于计算动画过程中属性值的过渡效果,它在动画开始和结束之间进行插值计算,根据指定的进度值计算出相应的属性值。
    • 开发者可以根据需要实现 TypeEvaluator 接口,并自定义属性值的过渡规则,从而控制属性值的变化方式。
  2. 接口方法

    • evaluate(float fraction, T startValue, T endValue):该方法是 TypeEvaluator 接口中唯一的抽象方法,用于计算动画过程中属性值的过渡效果。
    • fraction 参数表示动画执行的进度,取值范围为 0 到 1,0 表示动画开始,1 表示动画结束。
    • startValueendValue 分别表示动画的起始值和结束值。
    • 该方法返回根据进度值计算出的属性值,类型为泛型 T。
  3. 实现接口

    • 开发者可以通过实现 TypeEvaluator 接口,并重写 evaluate() 方法来定义自己的属性值过渡规则。
    • 在自定义的 evaluate() 方法中,可以根据动画执行的进度值和起始、结束值来计算出中间状态的属性值,并返回给动画系统。
  4. 常用实现类

    • Android 框架中提供了一些常用的 TypeEvaluator 实现类,如 FloatEvaluatorIntEvaluatorArgbEvaluator 等,用于处理浮点型、整型和颜色值属性的过渡计算。
  5. 示例代码

    • 自定义一个 TypeEvaluator 接口的实现类,用于实现颜色值的过渡计算:
    java
    public class MyColorEvaluator implements TypeEvaluator<Integer> {
        @Override
        public Integer evaluate(float fraction, Integer startValue, Integer endValue) {
            int startAlpha = Color.alpha(startValue);
            int startRed = Color.red(startValue);
            int startGreen = Color.green(startValue);
            int startBlue = Color.blue(startValue);
            int endAlpha = Color.alpha(endValue);
            int endRed = Color.red(endValue);
            int endGreen = Color.green(endValue);
            int endBlue = Color.blue(endValue);
    
            // 根据进度值计算出中间状态的颜色值
            int alpha = (int) (startAlpha + fraction * (endAlpha - startAlpha));
            int red = (int) (startRed + fraction * (endRed - startRed));
            int green = (int) (startGreen + fraction * (endGreen - startGreen));
            int blue = (int) (startBlue + fraction * (endBlue - startBlue));
    
            // 返回计算出的中间状态的颜色值
            return Color.argb(alpha, red, green, blue);
        }
    }

TypeEvaluator 接口为开发者提供了自定义属性值过渡规则的接口,通过实现该接口并重写 evaluate() 方法,可以实现更加灵活和个性化的动画效果。在属性动画中,通过指定自定义的 TypeEvaluator 实现类,可以控制属性值的变化方式,实现各种各样的动画效果。

2. 类

Animator

android.animation.Animator 类是 Android 动画框架中的基础类之一,用于实现属性动画。Animator 类是所有属性动画的父类,包括 ObjectAnimator、ValueAnimator 等。它定义了动画的基本属性和方法,提供了动画执行的核心功能。以下是关于 Animator 类的主要内容:

  1. 动画属性

    • Animator 类定义了动画的基本属性,包括持续时间(duration)、重复次数(repeatCount)、重复模式(repeatMode)、插值器(interpolator)等。
    • 这些属性可以通过相应的 setter 方法进行设置,用于控制动画的执行方式和效果。
  2. 动画状态

    • Animator 类定义了动画的状态,包括动画是否正在运行、动画是否被取消等。
    • 可以通过 isRunning() 方法和 isStarted() 方法来检查动画的运行状态。
  3. 动画控制

    • Animator 类提供了启动动画、取消动画、暂停动画等方法,用于控制动画的执行。
    • 可以使用 start() 方法启动动画,cancel() 方法取消动画,pause() 方法暂停动画等。
  4. 动画监听器

    • Animator 类提供了设置动画监听器的方法,用于监听动画的各个阶段。
    • 可以使用 addListener() 方法设置动画监听器,监听器会在动画开始、结束、取消、重复等事件发生时被调用。
  5. 动画属性修改

    • Animator 类提供了动画属性的修改方法,如设置动画持续时间、重复次数、插值器等。
    • 可以通过相应的 setter 方法来设置动画的属性,从而控制动画的执行方式和效果。
  6. 常用子类

    • Animator 类有许多子类,包括 ObjectAnimator、ValueAnimator 等,用于实现不同类型的属性动画。
    • ObjectAnimator 用于对任何对象的任何属性进行动画处理,而 ValueAnimator 用于对数值属性进行动画处理。

Animator 类作为 Android 动画框架的核心类之一,提供了动画的基本功能和属性,为开发者提供了实现属性动画的核心接口。通过对 Animator 类的使用,开发者可以实现各种各样的属性动画效果,并控制动画的执行方式和效果。

ValueAnimator

ValueAnimator 是 Android 中用于执行数值属性动画的类之一。与 ObjectAnimator 不同,ValueAnimator 主要用于对数值属性进行动画处理,而不是直接操作对象的属性。ValueAnimator 在动画执行过程中会生成一系列数值,并通过监听器将这些数值提供给开发者,从而实现对属性值的动态修改。以下是关于 ValueAnimator 的详细介绍:

  1. 数值属性动画

    • ValueAnimator 用于对数值属性进行动画处理,如颜色值的变化、透明度的变化、旋转角度的变化等。
    • ValueAnimator 并不直接操作对象的属性,而是通过生成一系列数值,并将这些数值提供给开发者,开发者可以根据需要将这些数值应用到目标对象的属性上。
  2. 创建 ValueAnimator

    • 使用静态的 ofXXX() 方法创建 ValueAnimator 对象,如 ValueAnimator.ofFloat()ValueAnimator.ofInt() 等。
    • 在创建时需要指定起始值和结束值等参数,ValueAnimator 将会在这两个值之间生成一系列数值。
  3. 监听数值变化

    • 可以设置监听器来监听动画过程中数值的变化,通过监听器可以获取每个数值,并根据需要将其应用到目标对象的属性上。
    • 使用 addUpdateListener() 方法设置监听器,监听器的回调方法 onAnimationUpdate() 将会在每个数值更新时被调用。
  4. 动画持续时间和插值器

    • 可以设置动画的持续时间和插值器,控制动画的执行时长和速度变化曲线。
  5. 启动动画

    • 使用 start() 方法启动动画,ValueAnimator 将会在动画执行过程中生成一系列数值,并通过监听器提供给开发者。
  6. 示例代码

    • 创建一个从 0 到 100 的数值属性动画:
    java
    ValueAnimator animator = ValueAnimator.ofInt(0, 100);
    animator.setDuration(1000); // 设置动画持续时间为 1 秒
    animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
        @Override
        public void onAnimationUpdate(ValueAnimator animation) {
            int currentValue = (int) animation.getAnimatedValue();
            // 根据数值更新目标对象的属性
            // 示例:view.setAlpha(currentValue / 100f);
        }
    });
    animator.start(); // 启动动画

ValueAnimator 是 Android 开发中常用的数值属性动画类之一,它可以生成一系列数值并提供给开发者,开发者可以根据需要将这些数值应用到目标对象的属性上,具有灵活性强、自定义性强的特点,适用于各种需要对数值属性进行动画处理的场景。

ObjectAnimator

ObjectAnimator 是 Android 中用于执行属性动画的类之一,它可以对任何对象的任何属性进行动画处理。ObjectAnimator 类可以实现对指定对象的属性值进行平滑过渡,从而创建各种动画效果。以下是关于 ObjectAnimator 的详细介绍:

  1. 属性动画

    • ObjectAnimator 是属性动画框架的一部分,与补间动画不同,属性动画可以在动画执行过程中实时修改目标对象的属性值,而不仅仅是改变外观。
  2. 对象属性

    • ObjectAnimator 可以操作任何对象的任何属性,包括 View 的位置、大小、透明度等属性,也可以是自定义对象的属性。
  3. 创建 ObjectAnimator

    • 使用静态的 ofXXX() 方法创建 ObjectAnimator 对象,例如 ObjectAnimator.ofFloat()ObjectAnimator.ofInt()ObjectAnimator.ofArgb() 等。
    • 在创建时需要指定目标对象、属性名称、起始值和结束值等参数。
  4. 设置动画参数

    • 设置动画持续时间、插值器、重复次数、重复模式等参数,以控制动画的执行方式和效果。
  5. 启动动画

    • 使用 start() 方法启动动画,ObjectAnimator 将会根据指定的属性值变化逐步更新目标对象的属性值,从而实现平滑的动画效果。
  6. 示例代码

    • 创建一个从当前位置平移的 ObjectAnimator:
    java
    ObjectAnimator animator = ObjectAnimator.ofFloat(view, "translationX", 0f, 100f);
    animator.setDuration(1000); // 设置动画持续时间为 1 秒
    animator.start(); // 启动动画
  7. 监听动画事件

    • 可以设置动画监听器来监听动画的各个阶段,如动画开始、结束、重复等,以执行相应的操作。
  8. 属性动态修改

    • ObjectAnimator 允许在动画执行过程中动态修改属性的起始值和结束值,从而实现更灵活的动画效果。

ObjectAnimator 是 Android 开发中常用的属性动画类之一,它可以实现对任何对象的任何属性进行动画处理,具有灵活性强、效果丰富的特点,适用于各种复杂的动画效果实现。

Keyframe

在 Android 动画框架中,android.animation.Keyframe 类用于定义属性动画中关键帧的信息。关键帧(Keyframe)表示动画过程中的重要时间点,用于指定动画在特定时间点的属性值。Keyframe 类提供了创建、修改和获取关键帧的方法,以及与关键帧相关的属性信息。以下是关于 Keyframe 类的主要内容:

  1. 关键帧的属性值

    • Keyframe 对象包含了关键帧的时间点(fraction)和属性值(value)信息。
    • 时间点 fraction 表示关键帧所在的时间位置,取值范围为 0 到 1,0 表示动画开始,1 表示动画结束。
    • 属性值 value 表示在该时间点上的属性值。
  2. 创建 Keyframe

    • 使用静态的 ofXXX() 方法创建 Keyframe 对象,如 Keyframe.ofFloat()Keyframe.ofInt() 等。
    • 在创建时需要指定关键帧的时间点和属性值等参数。
  3. 设置关键帧属性

    • 可以通过 setValue() 方法设置关键帧的属性值。
    • 也可以通过 setFraction() 方法设置关键帧的时间点。
  4. 获取关键帧属性

    • 可以通过 getValue() 方法获取关键帧的属性值。
    • 也可以通过 getFraction() 方法获取关键帧的时间点。
  5. 插值器(Interpolator)

    • Keyframe 对象还可以设置关键帧的插值器,用于控制关键帧之间属性值的变化曲线。
    • 插值器会影响关键帧之间属性值的过渡效果,从而影响整个动画的表现形式。
  6. 示例代码

    • 创建一个关键帧,表示动画开始时的透明度为 1,动画结束时的透明度为 0.5:
    java
    Keyframe kfStart = Keyframe.ofFloat(0f, 1f); // 时间点为 0,透明度为 1
    Keyframe kfEnd = Keyframe.ofFloat(1f, 0.5f); // 时间点为 1,透明度为 0.5
    • 设置关键帧的插值器:
    java
    kfStart.setInterpolator(new AccelerateInterpolator()); // 设置加速度插值器
    kfEnd.setInterpolator(new DecelerateInterpolator()); // 设置减速度插值器

Keyframe 类是 Android 动画框架中用于定义关键帧的重要类之一,通过创建、修改和获取关键帧的方法,开发者可以精确控制动画在不同时间点的属性值,实现更加丰富和灵活的动画效果。