在“pre-butter”Android中的“Buttery”片段动画

时间:2012-09-25 13:16:19

标签: android performance animation android-fragments

我正在使用Google的compat lib在我的应用中启用片段(Target SDK 16,Min SDK 8),用于在2.2+上运行的设备。从功能的角度来看,这很好,但通过

设置的视图动画的性能
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
transaction.setCustomAnimations(inTransition, outTransition, popInTransition, popOutTransition);

其中inTransition是一个简单的翻译,如

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android" android:interpolator="@android:anim/accelerate_interpolator">
    <translate android:fromYDelta="100%p" android:toYDelta="0" android:duration="@integer/animation_duration" />
</set>

outTransition是一个类似

的淡入淡出动画
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <alpha android:fromAlpha="1.0" android:toAlpha="0.0" android:duration="@integer/animation_duration" />
</set>

在我的Galaxy S2(4.0.3)上非常糟糕,即对于一个持续约350ms的动画,我会说约。一半的帧被丢弃。我注意到如果我禁用淡出,性能会稍微提高(但不会太多),但当然动画的完整效果会消失,因为原始片段会立即变黑。我也尝试了代码的发布版本,但性能也没有提高。

我做错了什么?如何使片段动画更流畅?

1 个答案:

答案 0 :(得分:7)

我建议的第一件事是在Manifest中启用硬件加速。这仅在具有API 3.0+的设备上启用,但显着可提高性能。使用API​​ 11(3.0)及更高版本,您还可以利用View LayerTypes.将设置为LAYER_TYPE_HARDWARE的动画设置为LAYER_TYPE_SOFTARE,然后在完成时将其设置回LAYER_TYPE_NONEif(api < 11) *use this animation* else *use this animation*

预蜂窝变得更加困难。您根本没有硬件加速。你最好检查一下{{1}}。滑动动画往往工作得相当顺利。 Alpha动画是CPU的负担,尤其是当视图有很多层时。在您可以使用的最顶层父视图上应用任何动画(您正在设置整个片段的动画,以便它已经发生)。