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

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

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

5 ответов


для анимации перехода между фрагментами или для анимации процесса отображения или скрытия фрагмента вы используете 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>

Если вам не нужно использовать библиотеку поддержки, посмотрите на Романа!--10--> ответ.

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

после консультации Рето это и blindstuff ответы я получил следующий код работает.

фрагменты появляются скольжение справа и скольжение влево при нажатии назад.

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>

выход.в 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 библиотеки поддержки.


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

fragmentTransaction.setCustomAnimations (android.Р. аним.slide_in_left, android.Р. аним.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



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

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