如何动画片段删除

时间:2012-12-20 23:39:21

标签: android animation fragment

我想动画删除片段。

我试过了:

getSupportFragmentManager().beginTransaction()
    .setCustomAnimations(R.anim.push_down_in, R.anim.push_up_out)
    .remove(myFragment)
    .commit();

但片段刚刚消失。

我注意到out动画只播放'replace',所以我尝试用这样的空片段替换片段:

getSupportFragmentManager()
    .beginTransaction()
    .setCustomAnimations(R.anim.push_down_in, R.anim.push_up_out)
    .replace(viewId, new Fragment())
.commit();

但它仍然只是消失了。

那么,我如何设置片段的删除动画?

12 个答案:

答案 0 :(得分:19)

我明白了。

退出视图在输入视图的画布上设置动画,因此如果没有输入画布,则没有动画画布。

要显示动画,我必须始终使用替换并使用与退出相同大小的输入片段。动画结束后,我将新片段的视图设置为消失。

答案 1 :(得分:16)

当我遇到类似的问题时,我就看到了这一点,并且我认为Id会快速记下。

我认为您应该为当前片段视图设置动画,而不是创建虚拟片段以替换现有片段。动画结束后,您只需删除片段即可。

我就这样做了:

final FragmentActivity a = getSherlockActivity();

if (a != null) {
    //Your animation
    Animation animation = AnimationUtils.loadAnimation(a, R.anim.bottom_out);
    animation.setDuration(getResources().getInteger(android.R.integer.config_shortAnimTime));

    //You can use AnimationListener, MagicAnimationListener is simply a class extending it.
    animation.setAnimationListener(new MagicAnimationListener() {
        @Override
        public void onAnimationEnd(Animation animation) {
            //This is the key, when the animation is finished, remove the fragment.
            try {
                FragmentTransaction ft = a.getSupportFragmentManager().beginTransaction();
                ft.remove(RestTimerFragment.this);
                ft.commitAllowingStateLoss();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    });

    //Start the animation.  
    getView().startAnimation(animation);
}

答案 2 :(得分:7)

您可以通过将此自定义动画设置为fragmentTransaction

来为删除设置动画
        fragmentTransaction.setCustomAnimations(R.anim.right_in, R.anim.defff,R.anim.defff,R.anim.right_out);

第三和第四个参数用于删除片段

答案 3 :(得分:2)

替换为空片段,在插入下一个片段之前,还延迟插入下一个片段(200ms),以便空白片段的退出动画可以播放,解决了我的问题。

这是用于插入带有退出动画的空片段的代码。

getSupportFragmentManager()
                        .beginTransaction()
                        .setCustomAnimations(R.anim.exit, R.anim.pop_exit)
                        .replace(R.id.fragmentLayout, new Fragment())
                        .commit();

Exit.xml

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

</set>

pop_exit.xml

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

</set>

答案 4 :(得分:1)

我从Zoltish的答案中获得灵感,这是我的实施:

1.在片段内添加此方法,它会将片段从屏幕左侧动画化为:

public void animateOut()
{
    TranslateAnimation trans=new TranslateAnimation(0,-300*Utils.getDensity(getActivity()), 0,0);
    trans.setDuration(150);
    trans.setAnimationListener(new Animation.AnimationListener() {

        @Override
        public void onAnimationStart(Animation animation) {
            // TODO Auto-generated method stub

        }

        @Override
        public void onAnimationRepeat(Animation animation) {
            // TODO Auto-generated method stub

        }

        @Override
        public void onAnimationEnd(Animation animation) {
            // TODO Auto-generated method stub
            ((BetsActivty)getActivity()).removeFrontFragmentAndSetControllToBetting();
        }
    });
    getView().startAnimation(trans);
}

onAnimationEnd()内部的方法删除了这样的片段:

getSupportFragmentManager().beginTransaction().
        remove(getSupportFragmentManager().findFragmentById(R.id.fragment_container)).commit();

2.从活动的onBack()调用片段的animateOut。

干杯

我的getDensity()是:

public static int getDensity(Context context)
{
    DisplayMetrics metrics = context.getResources().getDisplayMetrics();
    return (int)metrics.density;
}

用它计算当前运行设备的DP值。

答案 5 :(得分:1)

原因如@hugoc所说

  

退出视图在输入视图的画布上设置动画,因此如果没有输入画布,则没有动画画布。

     

要显示动画,我必须始终使用替换并使用与退出相同大小的输入片段。动画结束后,我将新片段的视图设置为消失。

下面是实际代码:

FragmentManager manager = getSupportFragmentManager();
    FragmentTransaction transaction = manager.beginTransaction();
    transaction.setCustomAnimations(R.anim.slide_in_bottom, R.anim.slide_out_top);
    transaction.hide(removeFragment).add(R.id.fragment_container,addFragment).commit();
    transaction = manager.beginTransaction();
    transaction.remove(removeFragment).commit();

答案 6 :(得分:1)

我同意hugoc和这里的一些代码 解决它

public class MyActivity extends Activity {
    //Some thing
    public void Fragment2BackToFragment1(Fragment fragment1, Fragment fragment2) {
        FragmentManager manager = getSupportFragmentManager();
        FragmentTransaction ft = manager.beginTransaction();
        animateExit(fragment2);
        ft.replace(R.id.main_content, fragment1, "fragment1");
        ft.commit();
    }
    private void animateExit(Fragment exitFragment) {
        if (exitFragment != null) {
            final View view = exitFragment.getView();
            if (view != null) {
                int anim = R.anim.fade_out;
                Animation animation =
                    AnimationUtils.loadAnimation(getActivity(), anim);
                animation.setAnimationListener(new Animation.AnimationListener() {
                    @Override
                    public void onAnimationStart(Animation animation) {

                    }

                    @Override
                    public void onAnimationEnd(Animation animation) {
                        view.postDelayed(new Runnable() {
                            @Override
                            public void run() {
                                view.setVisibility(View.GONE);
                            }
                        }, 300);
                    }

                    @Override
                    public void onAnimationRepeat(Animation animation) {


                    }
                });
                view.startAnimation(animation);
            }
        }
    }
}

答案 7 :(得分:0)

输入什么:
它是必须显示的新片段

什么退出:
它是必须隐藏的当前片段

popEnter:
它是必须显示的先前片段

popExit:
它是必须隐藏的当前片段

要使用这些动画,您应该在show或hide transaction命令上定位它们。退出动画不适用于删除/替换过​​程。

答案 8 :(得分:0)

下面的简单修复方法:

1-在fragment.getView()上调用动画。

2-删除onAnimationEnd()内部的片段。

final Fragment frag= getSupportFragmentManager().findFragmentById(R.id.fragmentContainer);
        frag.getView().animate().alpha(0f).scaleX(0f).scaleY(0f)

                .setListener(new AnimatorListenerAdapter() {
                    @Override
                    public void onAnimationEnd(Animator animation) {
                        super.onAnimationEnd(animation);
                        getSupportFragmentManager()
                                .beginTransaction()
                                .remove(frag)
                                .commit();
                    }
                }).start();

答案 9 :(得分:0)

setCustomAnimations(输入,退出,popEnter,popExit)支持输入和退出动画,因此设置四个动画并必须在 transaction.replace()

  

科特琳:

    val manager = supportFragmentManager
    val transaction = manager.beginTransaction()
    transaction.setCustomAnimations(android.R.anim.slide_in_left, android.R.anim.slide_out_right ,
            android.R.anim.slide_in_left, android.R.anim.slide_out_right)
    transaction.commit()

答案 10 :(得分:0)

简单的方法:

打开片段(从父活动调用)时:

    FragmentA fragment = new FragmentA();
    FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
    transaction.setCustomAnimations(R.anim.slide_up, R.anim.slide_down);
    transaction.add(android.R.id.content, fragment);
    transaction.addToBackStack(null);
    transaction.commit();

指定进入和退出交易

  

transaction.setCustomAnimations(R.anim.slide_up,R.anim.slide_down);

关闭片段时(从片段内部调用)

getActivity().getSupportFragmentManager().beginTransaction().setCustomAnimations(R.anim.slide_up, R.anim.slide_down).remove(this).commit();

指定进入和退出交易

  

setCustomAnimations(R.anim.slide_up,R.anim.slide_down)

答案 11 :(得分:0)

https://developer.android.com/training/basics/fragments/animate中查看动画的不同变体。

在任何事件(按钮单击,超时等)上,您都可以在片段中编写:

parentFragmentManager.beginTransaction()
    .setCustomAnimations(android.R.anim.slide_in_left, android.R.anim.slide_out_right)
    .remove(this)
    .commitAllowingStateLoss()
// parentFragmentManager.popBackStack() - might be needed if the fragment keeps visible after removing.