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


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

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

5 246

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 это!--10--> ответы я получил следующий код работает.

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

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