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

Tho*_*ler 2 performance animation android android-fragments

我正在使用Google的compat lib在我的应用程序(Target SDK 16,Min SDK 8)中为2.2+上运行的设备启用片段.从功能的角度来看,这很好,但是通过设置的视图动画的性能

FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
transaction.setCustomAnimations(inTransition, outTransition, popInTransition, popOutTransition);
Run Code Online (Sandbox Code Playgroud)

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>
Run Code Online (Sandbox Code Playgroud)

并且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>
Run Code Online (Sandbox Code Playgroud)

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

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

Dee*_*eeV 7

我建议的第一件事是在Manifest中启用硬件加速.这仅在具有API 3.0+的设备上启用,但会显着提高性能.使用API​​ 11(3.0)及更高版本,您还可以利用View LayerTypes. 设置您要设置的任何动画,LAYER_TYPE_HARDWARE然后将其设置回LAYER_TYPE_SOFTARELAYER_TYPE_NONE完成.

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