在片段事务中预加载XML动画

时间:2012-10-10 12:27:13

标签: android animation android-fragments

在我的应用程序中,我正在执行以下操作(使用支持库):

FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction transaction = fragmentManager.beginTransaction();
transaction.setCustomAnimations(R.anim.fade_in, R.anim.fade_out);
transaction.replace(R.id.fragment_container, fragment);
transaction.commit();

动画R.anim.fade_inR.anim.fade_out持续时间不到200毫秒。

第一次更改片段时,动画根本不显示。我认为这是由于XML膨胀:充气XML所需的时间大于动画的持续时间。从第二次开始,动画显示正确。

有没有办法预加载XML动画?

2 个答案:

答案 0 :(得分:0)

您可以查看AnimationUtils,更准确地说是

loadAnimation(Context context, int id)

它应该是你需要的。 Android也已经有了淡入淡出和淡出android.R.anim.fade_in和android.R.anim.fade_out的动画,你应该尝试使用它们,也许它们被证明更有效率。

答案 1 :(得分:0)

我自己找到了。您必须覆盖onCreateAnimation()中的Fragment方法。我就这样做了:

@Override
public Animation onCreateAnimation(int transit, boolean enter, int nextAnim) {
    if (enter)
        return mEnterAnimation;
    else
        return mExitAnimation;
}

private static final Animation mEnterAnimation = AnimationUtils
    .loadAnimation(MyApplication.getInstance().getBaseContext(),
    R.anim.frag_fade_in);

private static final Animation mExitAnimation = AnimationUtils
    .loadAnimation(MyApplication.getInstance().getBaseContext(),
    R.anim.frag_fade_out);

请注意,mEnterAnimationmExitAnimation字段被声明为静态。要通过AnimationUtils.loadAnimation()加载动画,您需要ContextContext是通过MyApplication单身人士获得的。要创建这样的单身人士,只需写入AndroidManifest.xml

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.app"
    android:versionCode="1"
    android:versionName="1.0" >

    <application
        android:name=".MyApplication"
        android:label="@string/app_name" >

        <!-- Insert your activities here -->

    </application>

</manifest>

然后将类com.example.app.MyApplication创建为单身:

public class MyApplication extends Application {
    public static MyApplication getInstance() {
        return mInstance;
    }

    @Override
    public void onCreate() {
        super.onCreate();
        mInstance = this;
    }

    private static MyApplication mInstance;
}