обміняти фрагменти в дії за допомогою анімації


94

Я хочу поміняти місцями два фрагменти в діяльності за допомогою анімації. Припустимо, PageA призначена для фрагмента A та лівої сторони на екрані, а PageB - для фрагмента B, тобто правої сторони екрану. Тепер я хочу, щоб, коли я натискаю кнопку на сторінці A, тоді сторінка A перемістилася в праву частину екрана з деякою анімацією переходу.

Я спробував наведений нижче код, щоб замінити позицію

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

Шукає якусь підказку.

Заздалегідь спасибі.


Відповіді:


282

Старе запитання, і ви, напевно, вже це зрозуміли, але для подальшого використання:

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

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, використовуючи значенняFrom -1280. Якщо ширина була більшою, вона не розпочнеться повністю поза екраном.
egfconnor

53
Ви можете замість цього використовувати заздалегідь визначені анімації з простору імен android: transaction.setCustomAnimations (android.R.anim.slide_in_left, android.R.anim.slide_out_right);
Jordy

2
Заздалегідь визначені анімації викликають виняток виконання, FWIW, оскільки вони покладаються на тег "перекласти".
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.