обменять фрагмент в действии с помощью анимации


94

Я хочу поменять местами два фрагмента в действии с помощью анимации. Предположим, что страница A предназначена для фрагмента A и левой стороны экрана, а страница B предназначена для фрагмента B, то есть в правой части экрана. Теперь я хочу, чтобы, когда я нажимаю кнопку на странице A, страница A перемещается в правую часть экрана с некоторой анимацией перехода.

Я попробовал приведенный ниже код заменить позицию

FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.replace(R.id.container, new FragB());
fragmentTransaction.commit();

Ищу ключ к разгадке.

Заранее спасибо.


Ответы:


285

Старый вопрос, и вы, вероятно, уже поняли это, но для справки в будущем:

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

FragmentTransaction ft = getSupportFragmentManager().beginTransaction();

ft.setCustomAnimations(R.anim.slide_in_left, R.anim.slide_out_right);
ft.replace(R.id.fragment_container, newFragment, "fragment");
// Start the animated transition.
ft.commit();

Вот пример анимации slide_in_left:

<?xml version="1.0" encoding="utf-8"?>
<set>
  <translate xmlns:android="http://schemas.android.com/apk/res/android"
   android:fromXDelta="-100%"
   android:toXDelta="0"
   android:interpolator="@android:anim/decelerate_interpolator"
   android:duration="500"/>
</set>

Обратите внимание, что это анимация, если вы используете библиотеку совместимости. Вместо этого, если вы используете SDK со встроенной поддержкой FragmentManager, ваша анимация будет выглядеть так:

<?xml version="1.0" encoding="utf-8"?>
<set>
  <objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"
    android:propertyName="x" 
    android:valueType="floatType"
    android:valueFrom="-1280"
    android:valueTo="0" 
    android:duration="500"/>
</set>

Это связано с тем, что библиотека совместимости не поддерживает новый тип objectAnimator и вместо этого реализует только старую структуру анимации.


92
Это определенно правильный ответ. Обратите внимание, что порядок имеет значение! У вас должен быть вызов setCustomAnimations () перед вызовами добавления / замены!
theelfismike

2
Итак, какой подход вам следует использовать, если вы хотите лучший комп?
basickarl

17
Эти разные анимации не совсем равны. Вы предполагаете, что ширина вашего фрагмента равна 1280, используя valueFrom равным -1280. Если ширина была больше, он не запускался полностью за пределами экрана.
egfconnor 05

53
Вместо этого U может использовать предопределенные анимации из пространства имен android: transaction.setCustomAnimations (android.R.anim.slide_in_left, android.R.anim.slide_out_right);
Джорди

2
Предопределенные анимации вызывают исключение времени выполнения, FWIW, потому что они полагаются на тег «translate».
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.