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();
выход:
новое библиотека поддерживает использование обеих анимаций просмотра (т. е. <translate>, <rotate>
) и аниматоры объектов (т. е. <objectAnimator>
) для перехода фрагмента. Он реализован с помощью NineOldAndroids. Подробности см. В моей документации по github.
Я решаю это способом ниже
Animation anim = AnimationUtils.loadAnimation(this, R.anim.slide);
fg.startAnimation(anim);
this.fg.setVisibility(View.VISIBLE); //fg is a View object indicate fragment