如何设置PropertyAnimation的帧速率?

时间:2015-08-17 16:09:30

标签: android android-animation

Android documentation表示您可以设置刷新率:

  

帧刷新延迟:您可以指定刷新动画帧的频率。默认设置为每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);
        }
  });

2 个答案:

答案 0 :(得分:6)

正如@pskink所说,使用:

public static void setFrameDelay(long frameDelay)
ValueAnimator课程的

。您可以在doc:

中看到这一点
  

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

答案 1 :(得分:1)

您可以实现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)。如果我未设置自定义插值器,则loadView旋转得非常快,导致loadView变成一个圆圈,而不是指示。我需要使帧频等于加载图像的“飞跃”,即12。

我将动画持续时间映射为12个部分,收到的经过的分数将映射到包含分数的部分中。

因此,只需将12更改为您希望在代码中设置的帧速率,即可获得最终的帧速率。