https://blog.csdn.net/lmj623565791/article/details/42056859

 

onAnimationUpdate:41, MainActivity$1$1 (com.example.ronnie.test)animateValue:1547, ValueAnimator (android.animation)animateBasedOnTime:1339, ValueAnimator (android.animation)doAnimationFrame:1471, ValueAnimator (android.animation)doAnimationFrame:146, AnimationHandler (android.animation)access$100:37, AnimationHandler (android.animation)doFrame:54, AnimationHandler$1 (android.animation)run:947, Choreographer$CallbackRecord (android.view)doCallbacks:761, Choreographer (android.view)doFrame:693, Choreographer (android.view)run:935, Choreographer$FrameDisplayEventReceiver (android.view)handleCallback:873, Handler (android.os)dispatchMessage:99, Handler (android.os)loop:193, Looper (android.os)main:6669, ActivityThread (android.app)invoke:-1, Method (java.lang.reflect)run:493, RuntimeInit$MethodAndArgsCaller (com.android.internal.os)main:858, ZygoteInit (com.android.internal.os)

属性动画每次更新的堆栈如上, 从堆栈可以看出,都是用Choreographer注册FrameDisplayEventReceiver监听屏幕的刷新时机,然后回掉给AnimationHandler,再传递给Animator去根据当前的时间计算value,这是需要使用差值器和估值器去计算

 

下面的堆栈的tween动画的刷新堆栈

applyTransformation:68, AlphaAnimation (android.view.animation)getTransformation:906, Animation (android.view.animation)getTransformation:980, Animation (android.view.animation)applyLegacyAnimation:19757, View (android.view)draw:19873, View (android.view)drawChild:4333, ViewGroup (android.view)dispatchDraw:4112, ViewGroup (android.view)dispatchDraw:2023, ConstraintLayout (android.support.constraint)updateDisplayListIfDirty:19073, View (android.view)recreateChildDisplayList:4317, ViewGroup (android.view)dispatchGetDisplayList:4290, ViewGroup (android.view)updateDisplayListIfDirty:19042, View (android.view)recreateChildDisplayList:4317, ViewGroup (android.view)dispatchGetDisplayList:4290, ViewGroup (android.view)updateDisplayListIfDirty:19042, View (android.view)recreateChildDisplayList:4317, ViewGroup (android.view)dispatchGetDisplayList:4290, ViewGroup (android.view)updateDisplayListIfDirty:19042, View (android.view)recreateChildDisplayList:4317, ViewGroup (android.view)dispatchGetDisplayList:4290, ViewGroup (android.view)updateDisplayListIfDirty:19042, View (android.view)recreateChildDisplayList:4317, ViewGroup (android.view)dispatchGetDisplayList:4290, ViewGroup (android.view)updateDisplayListIfDirty:19042, View (android.view)updateViewTreeDisplayList:686, ThreadedRenderer (android.view)updateRootDisplayList:692, ThreadedRenderer (android.view)draw:801, ThreadedRenderer (android.view)draw:3311, ViewRootImpl (android.view)performDraw:3115, ViewRootImpl (android.view)performTraversals:2484, ViewRootImpl (android.view)doTraversal:1460, ViewRootImpl (android.view)run:7183, ViewRootImpl$TraversalRunnable (android.view)run:949, Choreographer$CallbackRecord (android.view)doCallbacks:761, Choreographer (android.view)doFrame:696, Choreographer (android.view)run:935, Choreographer$FrameDisplayEventReceiver (android.view)handleCallback:873, Handler (android.os)dispatchMessage:99, Handler (android.os)loop:193, Looper (android.os)main:6669, ActivityThread (android.app)invoke:-1, Method (java.lang.reflect)run:493, RuntimeInit$MethodAndArgsCaller (com.android.internal.os)main:858, ZygoteInit (com.android.internal.os)

 

tween动画和属性动画的实现原理完全不同,

tween动画是在刷新的过程中,viewgroup在dispatchDraw的过程中,如果当前view的animation存在,通过执行applyTransformation 来实现视觉上的动画

属性动画是通过监听vsync信号,由chroegraphor回掉来通过valueanimator计算当前的时间以及value来实现动画.

更多相关文章

  1. ANDROID实现圆形图形不断旋转的动画
  2. android 中Window跟WindowManager
  3. android 动画的实现
  4. Android(安卓)View.startAnimation()动画
  5. android设置图片变化的四种效果代码
  6. Android(安卓)Activity淡入淡出动画
  7. Android全屏的两种方法
  8. android 抽奖盘动画 自定义View
  9. Android开场透明度渐变动画

随机推荐

  1. Android中使用log4j
  2. Android中GridView组件的使用
  3. Android(安卓)事件触发机制
  4. Android热插拔事件处理流程--Vold
  5. 关于Android方法数量限制的问题
  6. Android(安卓)HLS协议相关记录及部分解析
  7. android apk 签名信息 相关
  8. android之动画(一)通过AnimationDrawable控
  9. Android(安卓)uevent
  10. Android(安卓)常用RGB值以及中英文名称