如何动画片段去除(How to animate fragment removal)

2019-07-17 11:15发布

我想动画去除片段。

我试过了:

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

但片段就会消失。

我注意到了动画只能用“取代”玩,所以我试图用这样一个空的片段来替代片段:

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

但它仍然只是消失消失。

所以,我怎么能动画去除片段?

Answer 1:

我想到了。

离开的视图的进入视图的画布上的动画,所以如果没有进入画布没有画布动画。

为了显示动画,我不得不经常更换使用,并使用相同尺寸的碎片进入那些退出。 动画结束后我设置新的片段走了的观点。



Answer 2:

我看到这个的时候我有类似的问题,只是认为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);
}


Answer 3:

您可以通过这个自定义动画设置为fragmentTransaction动画拆除

        fragmentTransaction.setCustomAnimations(R.anim.right_in, R.anim.defff,R.anim.defff,R.anim.right_out);

第三和第四PARAMS是用于除去碎片



Answer 4:

一个空的片段更换,下一个片段的插入点之前,也延缓了下一个片段的插入(由200毫秒),使坯料片段的退出动画可以播放,解决了我的问题。

这在代码中插入与退出动画一个空的片段。

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>


Answer 5:

我从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.call片段的从活动的onBack()的animateOut。

干杯

顺便说一下我的getDensity()是:

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

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



Answer 6:

理由@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();


Answer 7:

我同意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);
            }
        }
    }
}


Answer 8:

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

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

什么popEnter:
这是以前的片段,它必须是表演

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

对于使用这些动画,你应该显示或隐藏交易指令对其进行定位。 退出动画不会在所有的工作/更换程序。



Answer 9:

下面一个简单的办法:

1-呼叫动画上fragment.getView()。

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

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();


Answer 10:

setCustomAnimations(进入,退出,popEnter,popExit)支持进入和退出动画,所以设置4个动画,必须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()


Answer 11:

所以,最简单的方法:

当你打开一个片段(从父活动叫):

    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)



文章来源: How to animate fragment removal