在View.onDraw方法里调用View.invalidate和在ValueAnimator.AnimatorUpdateListener中调用View.invalidate,有区别吗?
了解ValueAnimator的同学会知道,它播放动画的实现原理并不是直接使用线程来不断计算并回调AnimatorUpdateListener,而是。。。来写代码测试下就知道了:
ValueAnimator.ofInt(1).apply {
addUpdateListener {
// 因为animatedFraction=0时是直接回调的
if (it.animatedFraction > 0) {
throw RuntimeException()
}
}
start()
}
代码很简单,随便创建一个ValueAnimator然后在它的UpdateListener里面去抛出一个异常。
看看堆栈信息:
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.wuyr.wanandroidqa, PID: 16027
java.lang.RuntimeException
at com.wuyr.wanandroidqa.activities.main.TestActivity$start$1$1.onAnimationUpdate(TestActivity.kt:112)
at android.animation.ValueAnimator.animateValue(ValueAnimator.java:1566)
at android.animation.ValueAnimator.animateBasedOnTime(ValueAnimator.java:1357)
at android.animation.ValueAnimator.doAnimationFrame(ValueAnimator.java:1489)
at android.animation.AnimationHandler.doAnimationFrame(AnimationHandler.java:146)
at android.animation.AnimationHandler.access$100(AnimationHandler.java:37)
//
// 3
//
at android.animation.AnimationHandler$1.doFrame(AnimationHandler.java:54)
//