【问题标题】:Animation at the beginning of activity jumps活动开始时的动画跳跃
【发布时间】: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 开始时运行时,它们会在开始时跳过帧,导致它们非常明显地跳跃。我都试过了:

  1. 立即从 Activity 的 onCreate() 方法开始动画
  2. 使用 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


    【解决方案1】:

    由于没有附加代码,我假设您对活动有一些过渡动画。如果是这种情况,可能会导致问题。因为有两个动画同时运行。禁用转换并尝试一下。

    startActivity(intent);
    getActivity().overridePendingTransition(0, 0); 
    

    【讨论】:

    • 我没有自定义过渡动画,但默认情况下有一个。按照建议禁用过渡动画确实修复了动画。然而,由于这很不和谐,我发现了以下 Activity 回调:onEnterAnimationComplete()。那里正式解释了这个问题:“活动在其窗口动画期间无法绘制。”从那个回调开始我的动画解决了这个问题。
    • @asaini007 该方法在那里,但......只能从 API 21 中获得。顺便说一下,它并不是一直都在工作。
    【解决方案2】:

    听起来您的绘图循环 UI 线程正在挨饿。

    我会使用 traceview 来确保没有任何方法阻止您的绘图调用。 http://tools.android.com/tips/traceview

    这应该可以帮助您确定调用的是什么而不是 onDraw 方法。

    【讨论】:

      猜你喜欢
      • 2013-10-09
      • 2015-04-11
      • 1970-01-01
      • 1970-01-01
      • 2020-08-15
      • 1970-01-01
      • 1970-01-01
      • 2016-03-25
      • 1970-01-01
      相关资源
      最近更新 更多