如何为PropertyAnimation设置帧率?

5
Android 文档 中提到了可以设置刷新率:

帧刷新延迟:您可以指定动画每次刷新的时间间隔。默认设置为每10毫秒刷新一次,但应用程序刷新帧的速度最终取决于系统整体繁忙程度以及系统服务底层计时器的速度。

然而,它并没有告诉你如何设置。我已经搜索了所有地方,但是ObjectAnimator、PropertyAnimator或Animator中都没有这样的方法。
编辑:我目前正在使用一个动画更新器,该更新器只在每5个帧后才会响应 -
colorFade.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
       int interpolator = 0;

       @Override
       public void onAnimationUpdate(ValueAnimator animation) {
           if ((interpolator++) % 5 == 0)
                invalidate(mHandlerBounds);
        }
  });

3
请设置帧延迟时间(毫秒):public static void setFrameDelay(long frameDelay) - pskink
2个回答

9

正如@pskink所说,使用:

public static void setFrameDelay(long frameDelay)
ValueAnimator 类中的一个属性。您可以在文档中看到:

每帧动画之间的时间间隔,以毫秒为单位。这是动画请求的时间,动画将尝试遵守,但实际的帧延迟可能不同,这取决于系统负载和能力。这是一个静态函数,因为相同的延迟将应用于所有动画,因为它们都是从单个定时循环运行的。当动画系统使用外部计时源(例如显示器刷新率(vsync))来管理动画时,帧延迟可能会被忽略。


我明白了 - 这是一个适用于所有动画的静态函数。这可能不是我要找的,因为我正在尝试降低小动画的帧率,以便让更大的动画有更多的处理时间。 - Yervant
1
@Yervant,你找到解决方案了吗?我尝试使用ValueAnimator.setFrameDelay(1000)来查看我的动画1fps。然而它仍然非常流畅(这不是我想要的)。我认为该函数并没有按预期工作。 - SafaOrhan
确认过了,同样的测试,它无法降低帧率。我的 CPU 使用率从 15% 到 20%,现在变成了 20% 到 33%。 - StarWind0

2
您可以实现TimeInterpolator接口来创建自定义的插值器,将经过的时间分数映射到一个新的分数,以表示帧速率。例如,我想要旋转一个加载图像视图enter image description here以向用户显示加载指示enter image description here
ObjectAnimator animator = ObjectAnimator.ofFloat(loadingView, "rotation", 360f);
animator.setDuration(600);
animator.setInterpolator(new TimeInterpolator() {
    @Override
    public float getInterpolation(float input) {
        return (int)(input * 12) / 12.0f;
    }
});
animator.start();

在这个例子中,loadingView将在600毫秒内旋转360度。默认帧率是(1000ms / 10ms)。如果我不设置自定义插值器,loadingView会旋转得非常快,导致loadingView变成了一个圆形而不是指示符。我需要使帧率等于加载图像的“跳跃”,即12。
我将动画持续时间映射到12个部分,接收到的经过时间分数将被映射到包含该分数的部分中。
所以,在您的代码中将12更改为您想要的帧率,就可以实现最终的帧率。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接