【问题标题】:Android objectAnimator animations are REALLY slowAndroid objectAnimator 动画真的很慢
【发布时间】:2016-07-12 01:09:57
【问题描述】:

起初,我认为我的动画根本不起作用,因为新的 Fragment ViewGroup 只会在一帧中出现在屏幕上。然后我放慢了动画的速度,所以它需要 3 秒(3000 毫秒),并发现它只是在如此大的块中发生,以至于它都在一帧中发生。当我将它增加到 3 秒时,它每秒大约有 4 帧,这非常糟糕。我正在使用 Genymotion 模拟器运行。例如,当我单击“设置”应用程序时,模拟器通常看起来非常快。

我刚刚开始开发这个应用程序,所以它什么也没做。到目前为止,它主要只是一个外壳,我正在尝试在屏幕上制作一个新片段的动画。

新的 ViewGroup 是一个名为 SlideableLayout 的自定义类,它提供了这个属性:

public float getXFraction() {
    final int width = getWidth();
    if (width != 0) {
        return getX() / getWidth();
    } else {
        return getX();
    }
}

public void setXFraction(float xFraction) {
    Log.d("SL", "setting xFraction="+xFraction);
    final int width = getWidth();
    if (width > 0) {
        setX(xFraction * width);
    } else {
        setX(-10000);
    }
}

然后我像这样添加片段:

getFragmentManager()
    .beginTransaction()
    .setCustomAnimations(R.animator.slide_in_from_right, R.animator.slide_out_to_the_left,
            R.animator.slide_in_from_the_left, R.animator.slide_out_to_the_right)
    .add(R.id.navrootlayout, fragment)
    .addToBackStack(null)
    .commit();

R.animator.slide_in_from_right 动画如下所示:

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <objectAnimator
        android:interpolator="@interpolator/decelerate_cubic"
        android:valueFrom="1"
        android:valueTo="0"
        android:valueType="floatType"
        android:propertyName="xFraction"
        android:duration="@integer/navigation_animation_duration"/>
</set>

因此,系统应该将xFraction 属性从1.0 动画化到0.0,并且应该非常快速地计算每一帧,因为它所做的只是获取width 并乘以分数。

我不确定为什么它以如此低的帧速率运行。我已经在物理设备上试过了,很好。

编辑:

是否需要在 Genymotion 模拟器上设置一些配置选项才能使动画以正常帧速率运行?

【问题讨论】:

  • 什么是持续时间设置?
  • 3000 毫秒(即 3 秒)
  • 这是使用自定义测试应用程序从动画方程中删除您的代码吗?您想隔离它以识别它是代码问题还是动画问题。通过将动画代码隔离到一个简单的测试应用场景中,您可以隔离这些条件。
  • 我的项目中没有其他真正的代码,我现在只是开始一个新的应用程序。它只是一个带有按钮的片段,然后当您点击该按钮时,它会为新片段设置动画。这就是应用程序在这一点上所做的一切。进一步剥离它会非常困难。

标签: android android-fragments animation genymotion objectanimator


【解决方案1】:

显然,这是由 xFraction 和 yFraction 引起的,它们必须由两个 Fragment 的根视图实现:https://stackoverflow.com/a/25701362/2964379

老实说,这只是史诗般的失败。 Google 是否希望人们扩展每一个视图只是为了添加这两种方法?

一个简单但可怕的解决方案是将属性设置为 x 或 y 并将值设置为等于或大于屏幕的大数字,然后它可以快速运行,但根据值可能在动画中存在巨大的差距.

最好的解决方案(来自https://stackoverflow.com/a/20480676/2964379)是将您的动画师设置为x 或y,但完全删除valueFromvalueTo。然后覆盖所有片段的onCreateAnimator(在自定义片段基类中),使用AnimatorInflater.loadAnimator(activity, nextAnim) 获取动画器集并在其子级上调用setFloatValues。例如,您可以查看nextAnim == R.animator.slide_in_from_right 并致电setFloatValues(screenWidth, 0)。效果很好!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-23
    • 2015-03-07
    相关资源
    最近更新 更多