【发布时间】:2016-06-22 04:12:24
【问题描述】:
我正在为我的 Android 应用制作自定义视图的动画。我已经通过Property Animations 并在onAnimationUpdate() 回调中的视图上调用invalidate() 来完成此操作,按照https://developer.android.com/guide/topics/graphics/prop-animation.html:
根据您正在制作动画的属性或对象,您可能需要在 View 上调用 invalidate() 方法来强制屏幕使用更新的动画值重新绘制自身。您在 onAnimationUpdate() 回调中执行此操作。
我的问题是,当这些动画在新启动的 Activity 开始时运行时,它们会在开始时跳过帧,导致它们非常明显地跳跃。我都试过了:
- 立即从 Activity 的
onCreate()方法开始动画 - 使用 Activity 根视图的 ViewTreeObserver 在回调
OnGlobalLayout()时启动动画。
我做了后者,因为我认为可能在布局完成之前调用了动画,但结果是一样的。
通过日志,我确定onAnimationUpdate() 回调在整个动画过程中被一致地调用(即,从开始到结束每 10-20 毫秒左右)。 onAnimationUpdate() 只是调用invalidate(),它应该强制 View 重绘自身,最好是立即重绘(但文档只声称这会发生在“未来的某个时间点”)。这似乎正是问题所在:onDraw() 一开始只被调用一次或两次,然后在大约 250 毫秒内没有被调用。在此之后,它会恢复每 10-20 毫秒调用一次,因为它应该有整个时间。但是这段时间会导致动画非常明显的滞后。
需要明确的是,这个问题只发生在 Activity 开始时。如果我只是在开始动画之前设置一个 300 毫秒的延迟,它会一直顺利运行。但我不喜欢那个解决方案,因为它很hacky。似乎问题在于在活动开始附近的invalidate() 上没有立即调用onDraw()。但是,我无法弄清楚这是为什么,是什么阻止了onDraw(),或者根本无法解决它。
我只发现了这个 StackOverFlow 线程:Animation at the beginning of activity skips frames,发帖者有 相同 问题。基本代码就在那里,视频使问题变得清晰。我也可以发布我的代码,但我认为问题出现在最基本的测试应用程序中这一事实表明还有其他事情发生。
【问题讨论】:
标签: android android-layout animation android-animation android-lifecycle