Android 开发中,特点动画是非常常见的一种动画办法。它能够让咱们完成各种杂乱的动画作用,比方旋转、缩放、移动、渐变等。那么,Android 特点动画是怎么完成的呢?本文将从原理的视点来介绍 Android 特点动画的完成办法。

什么是特点动画?

特点动画是指经过改变方针的特点来完成动画作用的一种办法。在 Android 中,咱们一般运用 ValueAnimator 或 ObjectAnimator 来完成特点动画。

ValueAnimator 的完成原理

ValueAnimator 是 Android 特点动画的根底类,它能够完成对一个值进行滑润的过渡。它的完成原理如下:

  1. 创立 ValueAnimator 方针。
  2. 设置动画的起始值和完毕值。
  3. 设置动画的持续时刻。
  4. 设置动画的插值器(Interpolator),用于控制动画的速度变化。
  5. 设置动画的监听器(AnimatorListener),能够监听动画的开端、完毕、撤销、重复等事情。
  6. 调用 start() 办法开端动画。

在动画开端后,ValueAnimator 会根据设置的起始值和完毕值、持续时刻和插值器来计算出当时动画的进展值,然后经过监听器将进展值传递给方针方针,方针方针再根据进展值来更新自己的特点值,然后完成动画作用。

下面是一个比如,演示怎么运用 ValueAnimator 完成一个简略的平移动画:

ValueAnimator animator = ValueAnimator.ofFloat(0f, 1f);
animator.setDuration(1000);
animator.setInterpolator(new LinearInterpolator());
animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
    @Override
    public void onAnimationUpdate(ValueAnimator animation) {
        float progress = (float) animation.getAnimatedValue();
        targetView.setTranslationX(progress * 100);
    }
});
animator.start();

除了ofFloat()办法外,ValueAnimator还供给了ofInt()办法和ofArgb()办法,分别用于完成整数值和色彩值的滑润过渡动画。例如:

ValueAnimator animator = ValueAnimator.ofArgb(Color.BLUE, Color.RED);
animator.setDuration(1000);
animator.setInterpolator(new LinearInterpolator());
animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
    @Override
    public void onAnimationUpdate(ValueAnimator animation) {
        int color = (int) animation.getAnimatedValue();
        targetView.setBackgroundColor(color);
    }
});
animator.start();

ObjectAnimator 的完成原理

ObjectAnimator 是 ValueAnimator 的子类,它能够完成对恣意方针的特点进行动画操作。它的完成原理如下:

  1. 创立 ObjectAnimator 方针。
  2. 设置动画的方针方针和特点名。
  3. 设置动画的起始值和完毕值。
  4. 设置动画的持续时刻。
  5. 设置动画的插值器(Interpolator)。
  6. 设置动画的监听器(AnimatorListener)。
  7. 调用 start() 办法开端动画。

在动画开端后,ObjectAnimator 会根据设置的方针方针和特点名来获取方针方针的特点值,然后再根据起始值和完毕值、持续时刻和插值器来计算出当时动画的进展值,最终经过反射机制来设置方针方针的特点值,然后完成动画作用。

下面是一个比如,演示怎么运用 ObjectAnimator 完成一个简略的旋转动画:

ObjectAnimator animator = ObjectAnimator.ofFloat(targetView, "rotation", 0f, 360f);
animator.setDuration(1000);
animator.setInterpolator(new LinearInterpolator());
animator.addListener(new AnimatorListenerAdapter() {
    @Override
    public void onAnimationEnd(Animator animation) {
        // 动画完毕后履行的操作
    }
});
animator.start();

特点动画的长处

比较于传统的补间动画(Tween Animation),特点动画具有以下长处:

  1. 支撑恣意方针的特点动画操作。
  2. 支撑动画的暂停、持续、回转等操作。
  3. 支撑动画的组合、序列等杂乱操作。
  4. 支撑动画的自定义插值器(Interpolator)。
  5. 支撑动画的监听和回调。

动画渲染流程

Android 特点动画的完成原理还包括动画渲染流程:在动画开端后,体系会依照一定的帧率不断调用 invalidate() 办法,然后触发重新制作 View 的进程。在重新制作 View 的进程中,方针方针的特点值会发生变化,然后发生动画作用。

相关 API

除了ValueAnimator和ObjectAnimator外,还有其他一些特点动画相关的类和办法:

  1. PropertyValuesHolder:用于同时对多个特点进行动画操作。
  2. AnimatorSet:用于完成动画的组合、序列等杂乱操作。
  3. TypeEvaluator:用于指定动画特点值的类型转换器。
  4. Interpolator:定义了动画进展值和时刻的对应联系,能够运用体系供给的插值器,也能够自定义插值器。

动画功用

在实践开发中,动画功用也是一个非常重要的问题。以下是一些优化动画功用的建议:

  1. 运用硬件加速。
  2. 防止过多的布局层级。
  3. 防止过多的特点动画。
  4. 运用 ViewPropertyAnimator 来代替特点动画。
  5. 处理好 onAnimationEnd() 等回调办法,防止内存走漏。

特点动画的高档运用

特点动画供给了一些高档用法,例如运用途径动画完成自定义的运动轨迹。咱们能够经过自定义TypeEvaluator和ValueAnimator来完成途径动画。下面是一个简略的比如:

public class PathEvaluator implements TypeEvaluator<PointF> {
    private Path mPath;
    public PathEvaluator(Path path) {
        mPath = path;
    }
    @Override
    public PointF evaluate(float fraction, PointF startValue, PointF endValue) {
        PathMeasure pathMeasure = new PathMeasure(mPath, false);
        float[] point = new float[2];
        pathMeasure.getPosTan(pathMeasure.getLength() * fraction, point, null);
        return new PointF(point[0], point[1]);
    }
}
Path path = new Path();
path.moveTo(0, 0);
path.lineTo(200, 200);
path.lineTo(400, 0);
ValueAnimator animator = ValueAnimator.ofObject(new PathEvaluator(path), new PointF(0, 0), new PointF(1, 1));
animator.setDuration(2000);
animator.setInterpolator(new LinearInterpolator());
animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
    @Override
    public void onAnimationUpdate(ValueAnimator animation) {
        PointF point = (PointF) animation.getAnimatedValue();
        targetView.setX(point.x * 400);
        targetView.setY(point.y * 400);
    }
});
animator.start();

经过上面的代码,咱们能够在恣意途径上完成动画作用。

总结

经过本文的介绍,咱们了解了 Android 特点动画的完成原理。ValueAnimator 和 ObjectAnimator 是完成特点动画的根底类,它们能够让咱们完成各种杂乱的动画作用。比较于传统的补间动画,特点动画具有更多的长处和灵活性,是咱们在 Android 开发中不可或缺的一种动画办法。同时,处理好动画功用也是一个重要的问题,咱们需要在实践开发中注意优化。除了根底用法外,特点动画还供给了一些高档用法,例如途径动画,能够让咱们完成愈加天然、炫酷的动画作用。

推荐

android_startup: 供给一种在使用发动时能够愈加简略、高效的办法来初始化组件,优化发动速度。不仅支撑Jetpack App Startup的全部功用,还供给额外的同步与异步等待、线程控制与多进程支撑等功用。

AwesomeGithub: 根据Github的客户端,纯操练项目,支撑组件化开发,支撑账户暗码与认证登陆。运用Kotlin语言进行开发,项目架构是根据JetPack&DataBinding的MVVM;项目中运用了Arouter、Retrofit、Coroutine、Glide、Dagger与Hilt等盛行开源技术。

flutter_github: 根据Flutter的跨渠道版本Github客户端,与AwesomeGithub相对应。

android-api-analysis: 结合详细的Demo来全面解析Android相关的知识点, 协助读者能够更快的掌握与了解所论述的要点。

daily_algorithm: 每日一算法,由浅入深,欢迎加入一起共勉。