我正在为我的Android应用设置动画自定义视图.我已经通过Property Animations完成了这项工作,并根据https://developer.android.com/guide/topics/graphics/prop-animation.html调用invalidate()了onAnimationUpdate()回调中的View :
根据您动画的属性或对象,您可能需要在视图上调用invalidate()方法以强制屏幕使用更新的动画值重绘自身.您可以在onAnimationUpdate()回调中执行此操作.
我的问题是,当这些动画在新启动的 Activity 的开头运行时,它们会在开头跳过帧,导致它们非常明显地跳跃.我试过了两个:
onCreate()方法开始动画OnGlobalLayout()使用Activity的根视图的ViewTreeObserver在回调时启动动画.我做了后者因为我认为可能在布局完成之前调用了动画,但结果是一样的.
使用日志,我确定在onAnimationUpdate()整个动画中一致地调用回调(即,从开始到结束每隔10-20毫秒左右).onAnimationUpdate()简单地调用invalidate(),这应该强制View重绘自己,理想情况下立即(但文档只声称这种情况发生在"未来的某个时刻").这似乎正是问题所在:onDraw()在一开始只调用一次或两次,而不是被调用大约250 ms.在此之后,它每10-20毫秒恢复一次,因为它应该有整个时间.但是这段时间会导致动画中出现非常明显的延迟.
要清楚,此问题仅发生在活动的开头.如果我在开始动画之前只设置了300毫秒的延迟,它就会一直平稳运行.但我不喜欢这个解决方案,因为它很笨拙.似乎问题是在活动开始附近onDraw()没有立即调用invalidate().但是,我无法弄清楚为什么会这样,阻塞什么onDraw(),或者如何解决它.
我发现只有这个StackOverFlow线程:活动开始时的动画会跳过海报有相同问题的帧.基本代码就在那里,视频可以清楚地解决问题.我也可以发布我的代码,但我认为问题出现在最基本的测试应用程序中的事实表明还有其他事情正在发生.
animation android android-animation android-layout android-lifecycle