Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/192.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何设置片段移除的动画_Android_Animation_Fragment - Fatal编程技术网

Android 如何设置片段移除的动画

Android 如何设置片段移除的动画,android,animation,fragment,Android,Animation,Fragment,我想动画的片段删除 我试过: getSupportFragmentManager().beginTransaction() .setCustomAnimations(R.anim.push_down_in, R.anim.push_up_out) .remove(myFragment) .commit(); 但是碎片消失了 我注意到out动画只播放“replace”,因此我尝试用空片段替换片段,如下所示: getSupportFragmentManager()

我想动画的片段删除

我试过:

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();
getSupportFragmentManager().beginTransaction().
        remove(getSupportFragmentManager().findFragmentById(R.id.fragment_container)).commit();
但它还是消失了

那么,我怎样才能为片段的移除设置动画呢?

我想出来了

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

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

为了显示动画,我必须始终使用replace,并使用与退出的片段大小相同的输入片段。动画完成后,我将新片段的视图设置为“消失”。

当我遇到类似问题时,我看到了这一点,我只是想写个简短的说明

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

我就是这样做的:

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

我从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()
    .setCustomAnimations(R.anim.push_down_in, R.anim.push_up_out)
    .replace(viewId, new Fragment())
.commit();
getSupportFragmentManager().beginTransaction().
        remove(getSupportFragmentManager().findFragmentById(R.id.fragment_container)).commit();
2.从活动的onBack()调用片段的animateOut

干杯

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


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

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

        fragmentTransaction.setCustomAnimations(R.anim.right_in, R.anim.defff,R.anim.defff,R.anim.right_out);
第三个和第四个参数用于删除片段,正如@hugoc所说

getActivity().getSupportFragmentManager().beginTransaction().setCustomAnimations(R.anim.slide_up, R.anim.slide_down).remove(this).commit();
退出视图在进入视图的画布上设置动画,因此如果没有进入画布,则没有用于动画的画布

getSupportFragmentManager()
                        .beginTransaction()
                        .setCustomAnimations(R.anim.exit, R.anim.pop_exit)
                        .replace(R.id.fragmentLayout, new Fragment())
                        .commit();
为了显示动画,我必须始终使用replace,并使用与退出的片段大小相同的输入片段。动画完成后,我将新片段的视图设置为“消失”

以下是实际代码:

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

用一个空片段替换,在插入下一个片段之前,也延迟下一个片段的插入(以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>

输入内容:
这是必须展示的新片段

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

什么popEnter:
必须显示的是上一个片段

什么POPEEXIT:
必须隐藏的是当前片段


要使用这些动画,应在“显示”或“隐藏事务”命令中以它们为目标。退出动画在删除/替换过程中不起作用

我同意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);
            }
        }
    }
}
下面是一个简单的解决方案: 1-调用fragment.getView()上的动画

2-删除onAnimationEnd()中的片段


setCustomAnimations(回车、退出、弹出回车、弹出退出)支持回车和退出动画,因此设置四个动画,并且必须在transaction.replace()之前保留它。

科特林:

所以简单的方法是:

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

指定输入和退出事务

transaction.setCustomAnimations(R.anim.slide\u向上,R.anim.slide\u向下)

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

指定输入和退出事务

设置自定义动画(R.anim.slide\u向上,R.anim.slide\u向下)


请参见中动画的不同变体

在任何事件(按钮点击、超时等)中,您都可以在片段中写入:

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.

我很想多听听这方面的情况。我想为几个片段的移除设置动画,然后在一段时间后(异步任务处理)在另一组片段中设置动画。我可以简单地创建一个“虚拟”片段,其透明视图的大小与我想要制作动画的原始片段的大小相同吗?是的,这正是我所做的。没有其他解决方案吗?但是你在哪里做的??碎片的哪种方法?你想移除碎片的地方。Fx我是在计时器达到0或用户按下discard时做的。你可以这样做,但如果你想在backPress上向后播放动画呢?制作片段动画的意义在于,你不必为viewshad设置动画,就可以在2020年的SherlockActivity上咧嘴大笑。过去的好时光:-)OnAnimationEnd()坏了