您当前的位置: 首页 >  动画
  • 0浏览

    0关注

    674博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

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

沙漠一只雕得儿得儿 发布时间:2021-12-10 15:18:10 ,浏览量:0

 Q1:属性动画相关基础概念:

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

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

属性动画提供了监听器用于监听动画的播放过程,主要有以下监听接口:

AnimatorUpdateListenerAnimatorListener、AnimatorListenerAdapter

public static interface AnimatorUpdateListener {
    void onAnimationUpdate(ValueAnimator animation);
}
public static interface AnimatorListener {
    void onAnimationStart(Animator animation);
    void onAnimationEnd(Animator animation);
    void onAnimationCancel(Animator animation);
    void onAnimationRepeat(Animator animation);
}

还可以使用AnimatorListenerAdapter这个类,他是AnimatorListener的适配器类,这样我们可以有选择地实现上面4个方法。

插值器(Interpolator)和估值器(TypeEvaluator)。它们在属性动画中分别用于动画随时间流逝的变化规律和定义从初始值过渡到结束值的计算规则

Q2:如何改变原生控件的属性值:

方案1:如果自己的代码可以直接加上setxxx/getxxx

方案2:用一个类包装原始对象,简介提供get和set

方案3:采用ValueAnimator,监听动画过程,自己实现属性的改变

Q3:Animation 补间动画/view动画 的原理:

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

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

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

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

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

原理:属性动画要求动画作用的对象提供该属性的get和set方法,属性动画根据你传递的该熟悉的初始值和最终值,以动画的效果多次去调用set方法,每次传递给set方法的值都不一样,确切来说是随着时间的推移,所传递的值越来越接近最终值。

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

//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();

Q5:属性动画工作原理:

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

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

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

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

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

属性动画原理相关梳理:

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

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

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

关注
打赏
1657159701
查看更多评论
立即登录/注册

微信扫码登录

0.0412s