Анимировать фрагмент снизу вверх, сверху предыдущий фрагмент - PullRequest
0 голосов
/ 27 мая 2019

Я бы хотел анимировать новый фрагмент снизу вверх поверх предыдущего фрагмента.

К сожалению, моя текущая реализация подталкивает предыдущий фрагмент вверх, поскольку новый фрагмент анимируется, как это:

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 голосов
/ 29 мая 2019
 setCustomAnimations(int enter, int exit)

Выходная анимация должна быть пустой (потому что вам нужно, чтобы старый фрагмент оставался на экране, пока появляется новый), но если вы передадите от 0 до второго параметра, представление исчезнет без анимации.Вот почему я добавляю пустую альфа-анимацию, которая меняет альфа с 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 как контейнер фрагментов, который рисует детей в обратном порядке.

0 голосов
/ 27 мая 2019

Просто используйте добавить фрагмент вместо замены фрагмента

...