gpt4 book ai didi

Android objectAnimator 动画真的很慢

转载 作者:行者123 更新时间:2023-11-29 01:18:26 26 4
gpt4 key购买 nike

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

我刚刚开始开发这个应用程序,所以它没有做任何事情。到目前为止,它主要只是一个外壳,我正在尝试在屏幕上制作一个新 fragment 的动画。

新的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);
}
}

然后我像这样添加 fragment :

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 模拟器上设置某些类型的配置选项才能使动画以正常帧速率播放?

enter image description here

enter image description here

enter image description here

enter image description here

enter image description here

最佳答案

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

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

一个简单但可怕的解决方案是将属性设置为 x 或 y 并将值设置为等于或大于屏幕的大数,然后它工作得很快但取决于值,动画中可能会有巨大的差距.

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

关于Android objectAnimator 动画真的很慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38318492/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com