Android动画框架实现原理

RootView 只有一个孩子就是 DecorView,这里整个 View Tree 都是 DecorView 的子 View。

在DecorView中,标题窗口(TitleBar)以下部分的 FrameLayout(Content容器) 就是为了让程序员通过 setContentView 来设置用户需要的窗口内容。

因为整个 View 的布局就是一棵树,所以绘制的时候也是按照树形结构遍历来让每个 View 进行绘制。

Android动画框架实现原理_第1张图片

递归的绘制整个窗口需要按顺序执行以下几个步骤:

  1. 绘制背景
  2. 如果需要保存画布(canvas)的层为淡入或淡出做准备
  3. 绘制 View 本身的内容:通过调用 View.onDraw(canvas) 函数实现,通过这个我们应该能看出来 onDraw 函数重载的重要性,onDraw 函数中绘制线条 / 圆 / 文字等功能会调用 Canvas 中对应的功能。(每个View都需要重载该方法,ViewGroup不需要实现该方法
  4. 如果该view是ViewGroup,则需要绘制自己的孩子:通过 dispatchDraw(canvas) 实现,参看 ViewGroup.Java 中的代码可知,dispatchDraw()   ->   drawChild()   ->   child.draw(canvas) 。这样的调用过程被用来保证每个子 View 的 draw 函数都被调用,通过这种递归调用从而让整个 View 树中的所有 View 的内容都得到绘制。(在调用每个子 View 的 draw 函数之前,需要绘制的 View 的绘制位置是在 Canvas 通过 translate 函数调用来进行切换的,窗口中的所有 View 是共用一个 Canvas 对象。)
  5. 如果需要,我们可以绘制淡入淡出相关的内容并恢复保存的画布所在的层(layer)
  6. 绘制修饰的内容(例如滚动条):这个可知要实现滚动条效果并不需要 ScrollView,可以在 View 中完成的,比如通过ParentView中设置ChildView的画布来调整Canvas,进而实现动画效果(安卓动画就是通过父View来不断调整子View的画不坐标系来实现的)

你可能感兴趣的:(Android的View及动画)