Фрагменты и анимация Android

Как вам реализовать такой способ скользящего, который использует клиент Honeycomb Gmail?

Может TransactionManager обрабатывать это автоматически, добавляя и удаляя фрагменты, это довольно сложно проверить из-за того, что эмулятор является слайд-шоу:)

Ответ 1

Чтобы оживить переход между фрагментами или оживить процесс показа или скрытия фрагмента, вы используете Fragment Manager для создания Fragment Transaction.

В рамках каждой транзакции фрагмента вы можете указать анимацию в и из нее, которая будет использоваться для показа и скрытия соответственно (или и то и другое, когда используется замена).

Следующий код показывает, как вы заменили бы фрагмент, скользя один фрагмент и скользящий другой в нем.

FragmentTransaction ft = getFragmentManager().beginTransaction();
ft.setCustomAnimations(R.anim.slide_in_left, R.anim.slide_out_right);

DetailsFragment newFragment = DetailsFragment.newInstance();

ft.replace(R.id.details_fragment_container, newFragment, "detailFragment");

// Start the animated transition.
ft.commit();

Чтобы добиться того же самого со скрытием или показом фрагмента, вы просто вызываете ft.show или ft.hide, передавая фрагмент, который вы хотите показать или скрыть соответственно.

Для справки, определения анимации XML будут использовать тег objectAnimator. Пример slide_in_left может выглядеть примерно так:

<?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>

Ответ 2

Если вам не нужно использовать библиотеку поддержки, ознакомьтесь с ответом Roman.

Но если вы хотите использовать библиотеку поддержки, вам нужно использовать старую структуру анимации, как описано ниже.

После консультаций с ответами Reto's и вслепую я получил следующий код.

Фрагменты будут отображаться , скользящими справа и , сдвигающимися влево, когда будет нажата кнопка.

FragmentManager fragmentManager = getSupportFragmentManager();

FragmentTransaction transaction = fragmentManager.beginTransaction();
transaction.setCustomAnimations(R.anim.enter, R.anim.exit, R.anim.pop_enter, R.anim.pop_exit);

CustomFragment newCustomFragment = CustomFragment.newInstance();
transaction.replace(R.id.fragment_container, newCustomFragment );
transaction.addToBackStack(null);
transaction.commit();

Порядок важен. Это означает, что вы должны называть setCustomAnimations() до replace() или анимация не вступает в силу!

Затем эти файлы должны быть помещены в папку res/anim.

enter.xml:

<?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="@android:integer/config_mediumAnimTime"/>
</set>

exit.xml:

<set>
    <translate xmlns:android="http://schemas.android.com/apk/res/android"
               android:fromXDelta="0"
               android:toXDelta="-100%"
               android:interpolator="@android:anim/accelerate_interpolator"
               android:duration="@android:integer/config_mediumAnimTime"/>
</set>

pop_enter.xml:

<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="@android:integer/config_mediumAnimTime"/>
</set>

pop_exit.xml:

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

Продолжительность анимации может быть изменена на любое из значений по умолчанию, таких как @android:integer/config_shortAnimTime или любое другое число.

Обратите внимание, что если между заменами фрагментов происходит изменение конфигурации (например, вращение), заднее действие не анимируется. Это документированная ошибка, которая все еще существует в rev 20 библиотеки поддержки.

Ответ 3

Пожалуйста, используйте это, я думаю, что гораздо лучшие решения. Android Studio Предоставляет animation умолчанию.

fragTransaction.setCustomAnimations(android.R.anim.slide_in_left, android.R.anim.slide_out_right);

FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();              
fragmentTransaction.setCustomAnimations(android.R.anim.slide_in_left, android.R.anim.slide_out_right);
fragmentManager.addOnBackStackChangedListener(this);
fragmentTransaction.replace(R.id.frame, firstFragment, "h");
fragmentTransaction.addToBackStack("h");
fragmentTransaction.commit();

Выход:

enter image description here

Ответ 5

Я решаю этот способ ниже

Animation anim = AnimationUtils.loadAnimation(this, R.anim.slide);
fg.startAnimation(anim);
this.fg.setVisibility(View.VISIBLE); //fg is a View object indicate fragment