先上大料:

View 动画 Animation 运行原理解析

Android动画原理分析

看完以上两篇文章,基本上就可以理清补间动画的实现原理了.

基本流程如下:

1,使用View.startAnimation()开启一个动画,在这个方法里面初始化了animation,并且执行了invalidate方法,这个是进入视图绘制流程的起点.

2,一旦执行了view的invalidate,那么就进入了整个视图树的遍历,最终走到ViewRootImpl,执行performTraversals方法,这个方法又会去执行子视图的三大绘制流程.

3,其中在view的draw(三个参数)方法中,会执行到view的applyLegacyAnimation方法.

4,view的applyLegacyAnimation中,使用view的animation变量,执行animation的getTransformation(其中一个参数是父view的transformation变量)方法.

5,animation的getTransformation主要做两个事情,传进一个父view的childTransformation视图变换矩阵(实际上是子view的,只是不知道为什么要存放在父view中),得到一个动画是否完成的boolean返回值. 在这个方法里面执行了Animation的applyTransformation方法,这个方法具体下沉到子类中来实现,比如在子类ScaleAnimation中实现是这样的:

@Overrideprotected void applyTransformation(float interpolatedTime, Transformation t) {float sx = 1.0f;float sy = 1.0f;float scale = getScaleFactor();if (mFromX != 1.0f || mToX != 1.0f) {sx = mFromX + ((mToX - mFromX) * interpolatedTime);}if (mFromY != 1.0f || mToY != 1.0f) {sy = mFromY + ((mToY - mFromY) * interpolatedTime);}if (mPivotX == 0 && mPivotY == 0) {t.getMatrix().setScale(sx, sy);} else {t.getMatrix().setScale(sx, sy, scale * mPivotX, scale * mPivotY);}}

主要是根据第一个参数插值计算器计算出来的当前动画执行的进度,改变第二个参数transformation的值,记得这个值是父view的成员变量.这个值的具体用法,其实是用来和view的bitmap(是canvas)进行矩阵运算得到一个新的画布局域,也就是最终会根据这个运算得到一个新的视图,这也就是动画的真正原理,改变canvas画布里的bitmap(错误).https://blog.csdn.net/startfromweb/article/details/7644405

6,接着上面的计算,如果动画还要继续,那么getTransformation会返回true,回到view的applyLegacyAnimation中,其中有个判断:

private boolean applyLegacyAnimation(ViewGroup parent, long drawingTime,Animation a, boolean scalingRequired) {Transformation invalidationTransform;final int flags = parent.mGroupFlags;final boolean initialized = a.isInitialized();if (!initialized) {a.initialize(mRight - mLeft, mBottom - mTop, parent.getWidth(), parent.getHeight());a.initializeInvalidateRegion(0, 0, mRight - mLeft, mBottom - mTop);if (mAttachInfo != null) a.setListenerHandler(mAttachInfo.mHandler);onAnimationStart();}final Transformation t = parent.getChildTransformation();boolean more = a.getTransformation(drawingTime, t, 1f); // 在这里if (scalingRequired && mAttachInfo.mApplicationScale != 1f) {if (parent.mInvalidationTransformation == null) {parent.mInvalidationTransformation = new Transformation();}invalidationTransform = parent.mInvalidationTransformation;a.getTransformation(drawingTime, invalidationTransform, 1f);} else {invalidationTransform = t;}if (more) { // 这个值为true的话if (!a.willChangeBounds()) {if ((flags & (ViewGroup.FLAG_OPTIMIZE_INVALIDATE | ViewGroup.FLAG_ANIMATION_DONE)) ==ViewGroup.FLAG_OPTIMIZE_INVALIDATE) {parent.mGroupFlags |= ViewGroup.FLAG_INVALIDATE_REQUIRED;} else if ((flags & ViewGroup.FLAG_INVALIDATE_REQUIRED) == 0) {// The child need to draw an animation, potentially offscreen, so// make sure we do not cancel invalidate requestsparent.mPrivateFlags |= PFLAG_DRAW_ANIMATION;parent.invalidate(mLeft, mTop, mRight, mBottom);}} else {if (parent.mInvalidateRegion == null) {parent.mInvalidateRegion = new RectF();}final RectF region = parent.mInvalidateRegion;a.getInvalidateRegion(0, 0, mRight - mLeft, mBottom - mTop, region,invalidationTransform);// The child need to draw an animation, potentially offscreen, so// make sure we do not cancel invalidate requestsparent.mPrivateFlags |= PFLAG_DRAW_ANIMATION;final int left = mLeft + (int) region.left;final int top = mTop + (int) region.top;parent.invalidate(left, top, left + (int) (region.width() + .5f),top + (int) (region.height() + .5f)); // 又重新执行了invalidate}}return more;}

也就是当为true的情况,又会执行view的invalidate方法,那么就又进入了从1开始的流程中.这也就是为什么只启动一次,动画却一直会执行,视图会一直被更新,直到完成动画为止的原因了.

其实这个过程中,也就是不断的执行view的invalidate,通过Choreograher不断的安排执行view的绘制流程,在view的draw方法中,计算view的canvas变换矩阵.

所以这也就解释了,为什么补间动画只是改变view的视觉,他本来也就是仅仅改变了view的canvas中的bitmap(区域)而已.

View补间动画Animation运行原理相关推荐

  1. 安卓动画全解:补间动画(视图动画)、布局动画、属性动画、逐帧动画。动画Animation属性、Alpha属性、Scale属性、Translate属性、Rotate属性,动画集AnimationSet

    全栈工程师开发手册 (作者:栾鹏) 安卓教程全解 安卓动画全解:补间动画(视图动画).布局动画.属性动画.逐帧动画. 主要内容包含:动画Animation属性.Alpha属性.Scale属性.Tran ...

  2. android动画之帧动画(drawable animation)和补间动画(view animation)

    帧动画 drawable animation使用比较简单,而且支持市场上所以API版本,下面简单贴下代码.帧动画,就像GIF图片,通过一系列Drawable依次显示来模拟动画的效果. 直接代码贴上 x ...

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

     Q1:属性动画相关基础概念: Android属性动画(一)-- 属性动画的基本使用_Marck的博客-CSDN博客_android 属性动画 Android属性动画(二)-- 插值器和估值器_Mar ...

  4. android 补间动画有停顿,Android动画原理分析(一)----补间动画

    1.基本特点 补间动画(Tween动画),是android最早的动画框架,从Android1.0开始就有. 功能:可以实现移动.旋转.缩放.渐变四种效果以及这四种效果的组合形式. 实现形式:xml和代 ...

  5. Android 补间动画原理

    这段时间项目中用到了动画,所以趁热打铁,看看动画原理 补间动画 使用举例 TranslateAnimation translateAnim = new TranslateAnimation(0, 10 ...

  6. android—补间动画(Tween Animation)旋转的血轮眼

    Android系统提供了两种实现动画的方式,一种是补间动画(Tween Animation),另一种是帧动画(Frame Animation).补间动画可以实现View组件的移动.放大.缩小以及渐变等 ...

  7. Android 补间动画(Tween Animation)

    Tween Animation(补间动画): Tween动画,通过对View的内容进行一系列的图形变换 (包括平移.缩放.旋转.改变透明度)来实现动画效果.动画效果的定义可以采用XML来做也可以采用编 ...

  8. 补间动画详解一 基类Animation

    补间动画(Tween animation)是通过在两个关键帧之间补充渐变的动画效果来实现的. Android系统提供了四个补间动画的类,分别是AlphaAnimation.RotateAnimatio ...

  9. Android动画总结系列(2)——补间动画使用

    一.综述 补间动画(Tween Animation.View Animation)是Android的基本动画之一,其与帧动画的本质完全不同.帧动画的原理是逐帧播放Drawable形成动画效果,补间动画 ...

  10. 属性动画、帧动画、补间动画的介绍使用及对比

    属性动画.帧动画.补间动画的介绍使用及对比 版权声明:转载必须注明本文转自南轩的博客: http://blog.csdn.net/nanxuan521 在android开发中经常会碰到一些动画需求,其 ...

最新文章

  1. 实体链接:信息抽取中的NLP的基础任务
  2. 关于bcache的一些事情
  3. 来阿里前 vs 来阿里后
  4. 想学python-为什么现在那么多人想学Python?
  5. Webbrowers控件的小技巧
  6. Kmeans算法介绍及其实现
  7. Python requests 抓取网页状态返回418(亲测)
  8. JS事件及其兼容用法
  9. feign 序列化_Spring Boot和Feign中使用Java 8时间日期API(LocalDate等)的序列化问题...
  10. 教你一招解决Git时提交到多个远程仓库
  11. 网易云解析接口PHP源码,网易云音乐直链解析API源代码^-^
  12. 计算机网络自顶向下方法 第四章 作业习题答案
  13. endnote修改正文中参考文献标注_如何在Endnote中修改参考文献格式
  14. android 监控app 读写,Android端 APP性能监控实践
  15. Qt QSqlQueryModel实现查询数据库内容
  16. (01)ORB-SLAM2源码无死角解析-(57) 闭环线程→计算Sim3:理论推导(2)求解R,使用四元数
  17. python complex 如何取出实数部分_python中怎么表示实数
  18. 基于springboot+mybatis设备管理后台,可直接上线项目!
  19. DJI大疆 windows SDK开发入门(1) integrate SDK into Application
  20. 使用FullCalendar做一个自己的日程管理(二)- 事件篇

热门文章

  1. C8051F C2/JTAG接口
  2. 转载:常用 Git 命令清单 by 阮一峰
  3. mysql benchmark tool_使用MYSQL benchmark - DBT2 Benchmark Tool遇到的问题
  4. python axes3d函数_python3D绘图Axes3D函数详解
  5. 计算机打字在哪点,电脑打字在哪里打开
  6. Python爬虫实训案例之爬取豆瓣电影Top250并保存至excel
  7. 帆软报表 异常汇总及方案.
  8. Trained Ternary Quantization
  9. 2021年中国冰雪旅游行业市场现状分析,“三足鼎立、两带崛起、全面开花”新格局形成「图」
  10. spring boot layui table.render 加载不了cols