【问题标题】:Support Fragment Push Pop Animation支持片段推送弹出动画
【发布时间】:2015-10-27 05:45:58
【问题描述】:

我在我的应用程序中通过 AppCompatActivity 使用 v4 支持片段。

    loginUserFragment = new FragmentLoginUser();
    mFragmentTransaction = CommonUtils.getFragmentLRTransaction(this);
    mFragmentTransaction.add(R.id.fragmentContainer, loginUserFragment, loginUserFragment.getClass().getName());
    mFragmentTransaction.commit();

片段从左到右事务:

public static FragmentTransaction getFragmentLRTransaction(FragmentActivity fa) {
    FragmentTransaction ft = fa.getSupportFragmentManager().beginTransaction();
    ft.setCustomAnimations(anim.animated_activity_slide_left_in, anim.animated_activity_slide_right_out, anim.animated_activity_slide_right_in, anim.animated_activity_slide_left_out);
    return ft;
}

animated_activity_slide_left_in.xml

<?xml version="1.0" encoding="utf-8"?>
<translate xmlns:android="http://schemas.android.com/apk/res/android"
android:interpolator="@android:anim/accelerate_decelerate_interpolator"
android:fromXDelta="-100%p"
android:toXDelta="0%p" 
android:duration="250"/>

animated_activity_slide_right_out.xml

<?xml version="1.0" encoding="utf-8"?>
<translate xmlns:android="http://schemas.android.com/apk/res/android"
android:interpolator="@android:anim/accelerate_decelerate_interpolator"
android:fromXDelta="0%p"
android:toXDelta="100%p" 
android:duration="250"/>

animated_activity_slide_right_in.xml

<?xml version="1.0" encoding="utf-8"?>
<translate xmlns:android="http://schemas.android.com/apk/res/android"
android:interpolator="@android:anim/accelerate_decelerate_interpolator"
android:fromXDelta="100%p"
android:toXDelta="0%p" 
android:duration="250"/>

animated_activity_slide_left_out.xml

<?xml version="1.0" encoding="utf-8"?>
<translate xmlns:android="http://schemas.android.com/apk/res/android"
android:interpolator="@android:anim/accelerate_decelerate_interpolator"
android:fromXDelta="0%p"
android:toXDelta="-100%p" 
android:duration="250"/>

Push 和 Pop Animation 都不起作用 :(

【问题讨论】:

  • 您使用的 appcompat 是什么版本?
  • 'com.android.support:appcompat-v7:23.0.1'
  • 函数getFragmentLRTransaction中,是R.anim.animated_activity_slide_left_in还是anim.animated_activity_slide_left_in?

标签: android android-fragments android-animation android-transitions fragmentmanager


【解决方案1】:

mFragmentTransaction.add(...); 替换为mFragmentTransaction.replace(...);

【讨论】:

    【解决方案2】:

    试试这个,

    您的推送和弹出片段如下所示,

    public void pushFragments(String tag, Fragment fragment,
                boolean shouldAnimate, boolean shouldAdd) {
            try {
                if (shouldAdd)
                    mStacks.get(tag).push(fragment);
                FragmentManager manager = getSupportFragmentManager();
                FragmentTransaction ft = manager.beginTransaction();
                if (shouldAnimate)
                    ft.setCustomAnimations(R.anim.from_fade_in,
                            R.anim.from_fade_out);
                ft.replace(R.id.realTabContent, fragment);
                ft.commit();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    
        public void pushFragments(String tag, Fragment fragment, Bundle args,
                boolean shouldAnimate, boolean shouldAdd) {
            try {
                if (shouldAdd)
                    mStacks.get(tag).push(fragment).setArguments(args);
                FragmentManager manager = getSupportFragmentManager();
                FragmentTransaction ft = manager.beginTransaction();
                if (shouldAnimate)
                    ft.setCustomAnimations(R.anim.from_fade_in,
                            R.anim.from_fade_out);
                ft.replace(R.id.realTabContent, fragment);
                ft.commit();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    
        public void popFragments() {
            try {
                Fragment fragment = mStacks
                        .get(GlobalFields.mCurrentTab)
                        .elementAt(mStacks.get(GlobalFields.mCurrentTab).size() - 2);
    
                /* pop current fragment from stack.. */
                mStacks.get(GlobalFields.mCurrentTab).pop();
    
                /*
                 * We have the target fragment in hand.. Just show it.. Show a
                 * standard navigation animation
                 */
                FragmentManager manager = getSupportFragmentManager();
                FragmentTransaction ft = manager.beginTransaction();
                ft.setCustomAnimations(R.anim.to_fade_in, R.anim.to_fade_out);
                ft.replace(R.id.realTabContent, fragment);
                ft.commit();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    

    from_fade_in.xml

    <?xml version="1.0" encoding="utf-8"?>
    <set xmlns:android="http://schemas.android.com/apk/res/android" >
    
        <translate
            android:duration="500"
            android:fromXDelta="100%"
            android:toXDelta="0" />
    
    </set>
    

    from_fade_out.xml

    <?xml version="1.0" encoding="utf-8"?>
    <set xmlns:android="http://schemas.android.com/apk/res/android" >
    
        <translate
            android:duration="500"
            android:fromXDelta="0"
            android:toXDelta="-100%" />
    
    </set>
    

    to_fade_in.xml

    <?xml version="1.0" encoding="utf-8"?>
    <set xmlns:android="http://schemas.android.com/apk/res/android" >
    
        <translate
            android:duration="500"
            android:fromXDelta="-100%"
            android:toXDelta="0" />
    
    </set>
    

    to_fade_out.xml

    <?xml version="1.0" encoding="utf-8"?>
    <set xmlns:android="http://schemas.android.com/apk/res/android" >
    
        <translate
            android:duration="500"
            android:fromXDelta="0"
            android:toXDelta="100%" />
    
    </set>
    

    【讨论】:

    • 为此,您需要检查您的代码,因为它对我有用。
    【解决方案3】:

    您可以使用 translate 为活动设置动画,但不能使用 translate 为片段设置动画。对于片段,您应该使用对象动画师。

    更新:

    但正如@user3400729 所指出的,支持片段管理器不能使用对象动画器进行过渡,但可以使用翻译来应用此动画。

    在这种情况下,我尝试了您的问题,发现动画效果很好,我所做的只是增加动画的持续时间,以便用户可以查看此动画。

    animated_activity_slide_left_in.xml

    <?xml version="1.0" encoding="utf-8"?>
    <translate xmlns:android="http://schemas.android.com/apk/res/android"
    android:interpolator="@android:anim/accelerate_decelerate_interpolator"
    android:fromXDelta="-100%p"
    android:toXDelta="0%p" 
    android:duration="1500"/>
    

    animated_activity_slide_right_out.xml

    <?xml version="1.0" encoding="utf-8"?>
    <translate xmlns:android="http://schemas.android.com/apk/res/android"
    android:interpolator="@android:anim/accelerate_decelerate_interpolator"
    android:fromXDelta="0%p"
    android:toXDelta="100%p" 
    android:duration="1500"/>
    

    animated_activity_slide_right_in.xml

    <?xml version="1.0" encoding="utf-8"?>
    <translate xmlns:android="http://schemas.android.com/apk/res/android"
    android:interpolator="@android:anim/accelerate_decelerate_interpolator"
    android:fromXDelta="100%p"
    android:toXDelta="0%p" 
    android:duration="1500"/>
    

    animated_activity_slide_left_out.xml

    <?xml version="1.0" encoding="utf-8"?>
    <translate xmlns:android="http://schemas.android.com/apk/res/android"
    android:interpolator="@android:anim/accelerate_decelerate_interpolator"
    android:fromXDelta="0%p"
    android:toXDelta="-100%p" 
    android:duration="1500"/>
    

    希望对你有帮助..

    【讨论】:

    • 支持库不支持objectAnimator :(
    • 对不起,我的错误。你是对的。支持库不支持 objectAnimator 。我会试试你的问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-12-31
    • 2019-12-09
    • 1970-01-01
    • 2015-06-03
    • 2012-07-02
    • 1970-01-01
    相关资源
    最近更新 更多