从上至下对片段进行动画处理,在上一个片段之上

时间:2019-05-27 14:48:59

标签: java android android-fragments android-animation

我想从上至下在上一个片段的上方制作一个新片段的动画。

不幸的是,随着新片段的动画化,我当前的实现将上一个片段向上推,就像这样:

https://i.imgur.com/IgMUamp.png

我想做的是使新片段在前一个片段的上方 动画,如下所示:

https://i.imgur.com/DTrEfcm.png

这是我的代码现在的样子:

    private void pushFragment(String fragmentTag, Fragment fragment) {
        FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
        fragmentTransaction.setCustomAnimations(R.anim.anim_in_test, R.anim.anim_out_test);
        fragmentTransaction.replace(
                R.id.fragment_container,
                fragment,
                fragmentTag);
        fragmentTransaction.addToBackStack(null);
        fragmentTransaction.commitAllowingStateLoss();
    }

这里是anim_in_test.xml

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

这是anim_out_test.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <translate
        android:duration="@android:integer/config_longAnimTime"
        android:fromYDelta="0%p"
        android:toYDelta="-100%p"
        />
</set>

要使此功能正常工作,我需要更改什么?

2 个答案:

答案 0 :(得分:0)

 setCustomAnimations(int enter, int exit)

退出动画应该为空(因为您需要在显示新片段时将旧片段留在屏幕上),但是如果您将0传递给第二个参数视图,则不显示动画。那就是为什么我添加空的alpha动画,它将alpha从1更改为1。

fragmentTransaction.setCustomAnimations(R.anim.anim_in_test, R.anim.anim_out_test);

anim_out_test.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <alpha
        android:duration="@android:integer/config_longAnimTime"
        android:fromAlpha="1"
        android:toAlpha="1" />
</set>

但是在那一点上它不起作用,因为android在旧片段下面绘制新片段并为其设置动画。如果使片段背景透明,则可以看到它。

要解决此问题,我在片段的根视图上使用setZ(z)setElevation(z)setTranslationZ(z)方法。似乎所有人都在工作。新片段的Z值应大于旧片段Z的值。

 @Override
 public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.view, container, false);
        view.setZ(value);

这是结果:

enter image description here

它有效,但我不知道该解决方案的副作用。在Android 4上,我认为可以通过自定义ViewGroup作为片段容器来完成,它以相反的顺序绘制子代。

答案 1 :(得分:-1)

只需使用添加片段而不是替换片段