美文网首页
如何设置fragment的退出动画

如何设置fragment的退出动画

作者: 陈文统 | 来源:发表于2019-11-10 17:22 被阅读0次

    有两种方式可以添加Fragment动画

    通过FragmentManager的setCustomAnimations方式实现跳转动画

    在activity中开启fragment时,FragmentTransaction在add()或replace()之前,调用setCustomAnimations()来实现fragment转场动画;

    getSupportFragmentManager()
                    .beginTransaction()
                    .setCustomAnimations(
                   R.anim.slide_right_in,R.anim.slide_right_out,
                   R.anim.slide_right_in,R.anim.slide_right_out)
                    .add(R.id.framlayout,new AIFilePickerFragment())
                    .addToBackStack("")
                    .commit();
    

    该方法还有一个两个参数的重载方法

    进场动画slide_right_in

    <?xml version="1.0" encoding="utf-8"?>
    <set xmlns:android="http://schemas.android.com/apk/res/android"
        android:duration="@android:integer/config_mediumAnimTime">
        <translate
            android:toXDelta="0.0"
            android:fromXDelta="100.0%p" />
    </set>
    

    出场动画slide_right_out.xml

    <?xml version="1.0" encoding="utf-8"?>
    <set xmlns:android="http://schemas.android.com/apk/res/android"
        android:duration="@android:integer/config_mediumAnimTime">
        <translate
            android:toXDelta="100.0%p"
            android:fromXDelta="0.0" />
    
    </set>
    

    注意:1.该方法一定要在add或replace之前调用,否则无效;2.setCustomAnimations方法有一个很大的bug,就是在内存重启后所有设置的动画都将失效。
    3.退场动画没看到效果,不知道是不是使用姿势不对,改用方式二了

    方法二:setTranseion和onCreateAnimation配合实现

    就是在add Fragment或者在Detach Fragment时调用setTranseion方法,然后回调到Fragment里面的onCreateAnimation中创建并加载指定的动画,
    想要入场的动画的时候就在add或者replace之前setTranseion值为打开动画
    想要退场的动画的时候就在detach之前setTranseion值为关闭动画,简单方便好用,

    setTranseion(int)

    getSupportFragmentManager()
                    .beginTransaction()
                    .setTransition(
                    FragmentTransaction.TRANSIT_FRAGMENT_CLOSE)
                    .detach(pop)
                    .commitAllowingStateLoss();
    

    onCreateAnimation()

    @Override
    public Animation onCreateAnimation(int transit, boolean enter, int nextAnim) {
        Log.d(this.toString(), "onCreateAnimation: " + enter + " 
        transit = " +transit);
        if (transit == FragmentTransaction.TRANSIT_FRAGMENT_OPEN) {
        //表示是一个进入动作,比如add.show等
            Log.d(this.toString(), "onCreateAnimation: " + 
            enter + " transit = TRANSIT_FRAGMENT_OPEN");
            if (enter) {//普通的进入的动作
                return AnimationUtils.loadAnimation(
                getContext(), R.anim.fragment_enter_in);
            } else {
            //比如一个已经Fragmen被另一个replace,是一个进入动作,被
            replace的那个就是false
                return AnimationUtils.loadAnimation(
                getContext(), R.anim.fragment_enter_out);
            }
        } else if (transit == 
        FragmentTransaction.TRANSIT_FRAGMENT_CLOSE) {
        //表示一个退出动作,比如出栈,hide,detach等
            Log.d(this.toString(), "onCreateAnimation: " + 
            enter + " transit = TRANSIT_FRAGMENT_CLOSE");
            if (enter) {
            //之前被replace的重新进入到界面或者Fragment回到栈顶
                return AnimationUtils.loadAnimation(
                getContext(), R.anim.fragment_enter_in);
            } else {
            //Fragment退出,出栈
                return AnimationUtils.loadAnimation(
                getContext(), R.anim.fragment_enter_out);
            }
        }
        return null;
    }
    

    参考链接

    相关文章

      网友评论

          本文标题:如何设置fragment的退出动画

          本文链接:https://www.haomeiwen.com/subject/sayabctx.html