面试:Android补间动画、属性动画的原理

Q1:Animation 动画的原理:

Animation 动画内部其实是通过 ViewRootImpl 来监听下一个屏幕刷新信号,并且当接收到信号时,从 DecorView 开始遍历 View 树的绘制过程中顺带将 View 绑定的动画执行。那么,属性动画(Animator)原理也是这样么?如果不是,那么它又是怎么实现的?

我们知道,Android 每隔 16.6ms 会刷新一次屏幕,也就是每过 16.6ms 底层会发出一个屏幕刷新信号,当我们的 app 接收到这个屏幕刷新信号时,就会去计算屏幕数据,也就是我们常说的测量、布局、绘制三大流程。这整个过程关键的一点是,app 需要先向底层注册监听下一个屏幕刷新信号事件,这样当底层发出刷新信号时,才可以找到上层 app 并回调它的方法来通知事件到达了,app 才可以接着去做计算屏幕数据之类的工作。

而注册监听以及提供回调接口供底层调用的这些工作就都是由 Choreographer 来负责,Animation 动画的原理是通过当前 View 树的 ViewRootImpl 的 scheduleTraversals() 方法来实现,这个方法的内部逻辑会走到 Choreographer 里去完成注册监听下一个屏幕刷新信号以及接收到事件之后的工作。

需要跟屏幕刷新信号打交道的话,归根结底最后都是通过 Choreographer 这个类。

Q2:属性动画(Animator)区别于 Animation 动画的就是它是有对 View 的属性进行修改的,那么它又是怎么实现的,原理又是什么?

属性动画的使用,常接触的其实就是两个类 ValueAnimatorObjectAnimator。先看看基本的使用步骤:

//1.ValueAnimator用法  
ValueAnimator animator = ValueAnimator.ofInt(500);
animator.setDuration(1000);
animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
        @Override
        public void onAnimationUpdate(ValueAnimator animation) {
               int value = (int) animation.getAnimatedValue();
               mView.setX(value);  
         }
 });
animator.start();

//2.ObjectAnimator用法
ObjectAnimator animator = ObjectAnimator.ofInt(mView, "X", 500).setDuration(1000).start();

Q3:属性动画工作原理:

属性动画是对属性进行动画的,那么什么是属性呢?可以理解成 Java Bean 的属性,一个有 getXxx/setXxx 方法的字段,因为内部原理是通过反射去改变这些属性的值的,从而达到动画的效果。

属性动画的工作原理很简单,其实就是在一定的时间间隔内,通过不断地对值进行改变,并不断将该值赋给对象的属性,从而实现该对象在属性上的动画效果。

这个属性可以是任意对象的属性。

从上述工作原理可以看出属性动画有两个非常重要的类:ValueAnimator 类 & ObjectAnimator 类,二者的区别在于:
ValueAnimator 类是先改变值,然后 手动赋值 给对象的属性从而实现动画;是 间接 对对象属性进行操作;而 ValueAnimator 类本质上是一种 改变值 的操作机制。

ObjectAnimator 类是先改变值,然后 自动赋值 给对象的属性从而实现动画;是 直接 对对象属性进行操作;可以理解为:ObjectAnimator 更加智能、自动化程度更高。

属性动画原理相关梳理:

属性动画 ValueAnimator 运行原理全解析 - 简书

Android 属性动画的原理及应用 - 掘金

动画:Android动画实现原理 - 简书

Q4:属性动画相关基础使用:

Android属性动画(一)—— 属性动画的基本使用_Marck的博客-CSDN博客_android 属性动画

Android属性动画(二)—— 插值器和估值器_Marck的博客-CSDN博客_属性动画插值器估值器

猜你喜欢

转载自blog.csdn.net/cpcpcp123/article/details/121856392