View动画使用
view动画有缩放、旋转、平移、透明度等,都是继承于Animation类。我们掌握了一个类型的原理其他原理基本一致。都是通过Transformation 和 Matrix 实现各种各样炫酷的动画。
View树里不管哪个view发起了布局、绘制请求,都会到顶部的ViewRootImpl里的scheduleTraversals开始,然后在最近的一个屏幕信号到了,通过ViewRootImpl的performTraversals从跟布局开始去遍历view树执行测量、布局、绘制三大操作。这也是为什么我们布局不能太深的原因,因为每一次刷新绘制都会走到ViewRootImpl里,然后再层层遍历找到改变的view去执行响应的布局或者绘制操作 。
首先,当调用了 View.startAnimation() 时动画并没有马上就执行,而是通过 invalidate() 层层通知到 ViewRootImpl 发起一次遍历 View 树的请求,而这次请求会等到接收到最近一帧到了的信号时才去发起遍历 View 树绘制操作。
从 DecorView 开始遍历,绘制流程在遍历时会调用到 View 的 draw() 方法,当该方法被调用时,如果 View 有绑定动画,那么会去调用applyLegacyAnimation(),这个方法是专门用来处理动画相关逻辑的。
在 applyLegacyAnimation() 这个方法里,如果动画还没有执行过初始化,先调用动画的初始化方法 initialized(),同时调用 onAnimationStart() 通知动画开始了,然后调用 getTransformation() 来根据当前时间计算动画进度,紧接着调用 applyTransformation() 并传入动画进度来应用动画。
getTransformation() 这个方法有返回值,如果动画还没结束会返回 true,动画已经结束或者被取消了返回 false。所以 applyLegacyAnimation() 会根据 getTransformation() 的返回值来决定是否通知 ViewRootImpl 再发起一次遍历请求,返回值是 true 表示动画没结束,那么就去通知 ViewRootImpl 再次发起一次遍历请求。然后当下一帧到来时,再从 DecorView 开始遍历 View 树绘制,重复上面的步骤,这样直到动画结束。
draw方法:
画背景
画canvas帆布
画信息
画孩子
画渐入效果
画装饰
帧动画
一张张图片不断的切换,形成动画效果
补间动画
原形态变成新形态时为了过渡变形过程,生成的动画就叫补间动画
位移、旋转、缩放、透明
属性动画
补间动画,只是一个动画效果,组件其实还在原来的位置上,xy没有改变