我正在为我的Android应用设置动画自定义视图。我已经通过Property Animations完成了此操作,并在invalidate()
回调中的onAnimationUpdate()
上调用onCreate()
,按照https://developer.android.com/guide/topics/graphics/prop-animation.html:
根据您动画的属性或对象,您可能需要在视图上调用invalidate()方法以强制屏幕使用更新的动画值重绘自身。您可以在onAnimationUpdate()回调中执行此操作。
我的问题是,当这些动画在新启动的活动开始时运行时,它们会在开头跳过帧,导致它们非常明显地跳跃。我试过了两个:
OnGlobalLayout()
方法onAnimationUpdate()
回调时启动动画。我做了后者,因为我想可能在布局完成之前调用了动画,但结果是一样的。
使用日志,我确定在整个动画中一致地调用onAnimationUpdate()
回调(也就是说,从开始到结束每隔10-20毫秒左右)。 onDraw()
只是调用invalidate()
,这应该强制View重绘自己,理想情况下立即(但文档只声称这种情况会在未来的某个时刻发生)。这似乎正是问题所在:onDraw()
只在一开始就被调用一次或两次,然后才被调用大约250 ms。在此之后,它每10-20毫秒恢复一次,因为它应该有整个时间。但是这段时间会导致动画中出现非常明显的延迟。
要清楚,此问题仅发生在活动的开头。如果我在开始动画之前只设置了300毫秒的延迟,它就会一直平稳运行。但我不喜欢这个解决方案,因为它很笨拙。似乎问题是invalidate()
在活动开始附近的onDraw()
没有被立即调用。但是,我无法弄清楚为什么会这样,阻塞(?>A|.)*
,或者如何解决它。
我发现只有这个StackOverFlow线程:Animation at the beginning of activity skips frames,其中海报有相同的问题。基本代码就在那里,视频可以清楚地解决问题。我也可以发布我的代码,但我认为问题出现在最基本的测试应用程序中的事实表明还有其他事情发生。
答案 0 :(得分:5)
由于没有附加代码,我假设您有一些活动的过渡动画。如果是这种情况,可能会导致问题。因为有两个动画同时运行。禁用转换并试一试。
startActivity(intent);
getActivity().overridePendingTransition(0, 0);
答案 1 :(得分:2)
听起来你的绘制循环UI线程正在变得饥饿。
我会使用traceview来确保没有任何方法阻止您的绘制调用。 http://tools.android.com/tips/traceview
这可以帮助您确定调用的内容而不是onDraw方法。