Android фрагменты и анимация
Как вы должны реализовать вид скольжения, который, например, использует клиент Honeycomb Gmail?
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 это!--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();
выход:
новое библиотека поддерживает использование обоих видов анимации (т. е.
<translate>, <rotate>
) и аниматоры объектов (т. е.<objectAnimator>
) для перехода фрагмента. Он реализован с помощью NineOldAndroids. Дополнительную информацию см. В моей документации по github.