AnimatorInflater.loadAnimator是否经常使用便宜,还是应该缓存?

时间:2016-04-08 15:30:27

标签: android performance animation

我正在创建一个自定义视图,用于运行视图的淡入动画。 (在这种情况下,在异步设置图像后,图像会淡入 - 而不是立即弹出视图。但这个问题一般适用于动画师。)

Property Animation的Android开发人员指南中,建议使用以下代码加载和运行动画:

AnimatorSet set = (AnimatorSet) AnimatorInflater.loadAnimator(myContext,
    R.anim.property_animator);
set.setTarget(myObject);
set.start();

但是文档没有建议在哪里专门调用它。

对于查看通胀(布局),强烈建议尽可能避免通货膨胀,因为这是一种相对昂贵的通话方式。

在视图中使用AnimatorInflater.loadAnimator()是否安全,即使活动中有许多该视图的实例?换句话说,Animator XML加载是否足够便宜以根据需要进行扩充,还是应该在活动级别缓存和设置,而不是更方便,相关的视图级别?

(注意:我' m 谈论较旧的Android 2.x Animation系统,但是较新的Android 3.1+ Animator系统。)

2 个答案:

答案 0 :(得分:1)

如果您在不同视图上运行单独的动画,则需要不同的AnimatorSet实例来控制它们。这意味着您必须单独对它们进行充气,就像您必须为不同的视图充气一样。

你也可以通过编程方式创建AnimatorSet对象,这可能会节省一点时间,但我不会尝试优化它,直到你发现你遇到了性能问题。

答案 1 :(得分:0)

是的,必要时可以安全使用。

正如@ doug-stevenson指出的那样,每个正在运行的动画都需要一个动画师。因此,您无法为每个活动缓存一个虚增实例,因为每个动画师只能定位一个视图。

通货膨胀有点贵,但Android框架预计会这样,loadAnimator()的(当前)实现使用名为ConfigurationBoundResourceCache的内部类。只要用户不更改配置(屏幕旋转,连接设备等),您可以根据需要多次调用loadAnimator(),并从缓存中调用新的,易于克隆的实例为您创建了充气版本。 (即使用户确实更改了配置,每次配置更改也只需要重新充气一次。)

显然,你不应该通过一次动画数百个视图来滥用调用,因为它每次调用都会克隆新对象,然后最终必须运行你开始的每个动画。所以有一个实际的限制。但是当你需要在同一个屏幕上设置合理数量的视图动画时,你会感到安全,因为你不会打扰loadAnimator()性能。