Анимация анимации Android Fragment, воспроизведенная выше, вводит анимацию
Я реализую анимацию перехода фрагмента.
Моя анимация exit
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:ordering="together">
<objectAnimator
android:propertyName="scaleX"
android:valueType="floatType"
android:valueFrom="1.0"
android:valueTo="0.95"
android:duration="300"/>
<objectAnimator
android:propertyName="scaleY"
android:valueType="floatType"
android:valueFrom="1.0"
android:valueTo="0.95"
android:duration="300"/>
<objectAnimator
android:propertyName="x"
android:valueType="floatType"
android:valueFrom="0"
android:valueTo="10dp"
android:duration="300"/>
</set>
enter
анимация:
<?xml version="1.0" encoding="utf-8"?>
<objectAnimator
xmlns:android="http://schemas.android.com/apk/res/android"
android:propertyName="x"
android:valueType="floatType"
android:valueFrom="1280"
android:valueTo="0"
android:duration="400"/>
Транзакция создается следующим образом:
fragmentManager.beginTransaction()
.setCustomAnimations(enter, exit, popEnter, popExit)
.replace(CONTENT_CONTAINER_ID, newFragment)
.addToBackStack(null)
.commit();
При нормальной скорости анимации нежелательный эффект почти невидим из-за короткой продолжительности анимации, но, когда вы замедляете их, вы можете ясно видеть, что z-order
неверно.
Ввод анимации фрагмента находится ниже анимации фрагмента фрагмента. Есть ли способ обхода этого решения?
Ответы
Ответ 1
Я думаю, вы могли бы попробовать следующий подход в качестве работы.
fragmentTr.setCustomAnimations(enter, exit);
fragmentTr.hide(currentFragment);
fragmentTr.add(containerId, newFragment, "aTag");
fragmentTr.show(newFragment);
fragmentTr.commit();
Не используйте replace(). Я пробовал этот подход, и он сработал.
Надеюсь, это поможет.
Ответ 2
Это, вероятно, уже устарело, но я столкнулся с одной и той же проблемой. Я решил это, определив две области содержимого в моем XML, например:
<FrameLayout>
<FrameLayout id="@+id/oldFragment" />
<FrameLayout id="@+id/newFragment" />
</FrameLayout>
Я бы загрузил первый фрагмент в oldFragment
, и моя транзакция выглядит следующим образом:
getActivity().getSupportFragmentManager()
.beginTransaction()
.remove(old_frag)
.add(R.id.newFragment, new_frag)
.addToBackStack(null)
.commit();
Надеюсь, что это поможет.
Ответ 3
Я знаю, что это слишком старый, но у меня та же проблема с Android Jetpack.
Этот ответ для Android Jetpack и навигационный график
-
Установить анимацию в navigation.xml
<fragment
android:id="@+id/specifyAmountFragment"
android:name="com.example.buybuddy.buybuddy.SpecifyAmountFragment"
android:label="fragment_specify_amount"
tools:layout="@layout/fragment_specify_amount">
<action
android:id="@+id/confirmationAction"
app:destination="@id/confirmationFragment"
app:enterAnim="@anim/slide_in_right"
app:exitAnim="@anim/slide_out_left"
app:popEnterAnim="@anim/slide_in_left"
app:popExitAnim="@anim/slide_out_right" />
-
Добавить ресурсы анимации
slide_in_left.xml
<?xml version="1.0" encoding="utf-8"?>
<setxmlns:android="http://schemas.android.com/apk/res/android">
<translate android:fromXDelta="-100%p" android:toXDelta="0" ndroid:duration="200"/>
</set>
slide_out_left.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate android:fromXDelta="0" android:toXDelta="-100%p" android:duration="200"/>
</set>
slide_in_right.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate android:fromXDelta="100%p" android:toXDelta="0" android:duration="200"/>
</set>
slide_out_right.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate android:fromXDelta="0" android:toXDelta="100%p" android:duration="200"/>
</set>
Другой полезный ответ Подробнее в документации разработчика Android
Другие примеры анимации:
Ответ 4
Это сработало для меня, чтобы добавить эту строку в анимацию
android:interpolator="@android:anim/linear_interpolator"