2011-01-27 1 views
232

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

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

ответ

346

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

Awesome, спасибо. – alexanderblom

+56

Когда я попробовал это, он покажет * RuntimeException: Неизвестное имя аниматора: translate *. –

+3

Убедитесь, что анимации, определенные в slide_in_left и right, построены с использованием набора определений объектных атрибутов, а не старого определения анимации. –

211

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

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

После консультаций Reto's и blindstuff'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 или любой другой номер.

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

+41

Это только что спасло меня. Обратите внимание, обратите внимание на ** порядок важен **, который, естественно, я пропустил в первый раз. Это означает, что вы должны вызвать setCustomAnimations() перед заменой(). –

+3

Я попытался реализовать на своих фрагментах. Я написал все, как вы упомянули, но logcat говорит: unknow имя аниматора перевести Как я могу решить эту проблему? Кстати, я вызываю свой фрагмент в навигационном ящике (Sliding Menu) –

+0

Отлично работает, но выясняется, что построение этого с помощью инструментов построения 21.1 генерирует сообщение об ошибке «Недопустимое имя файла: должно содержать только строчные буквы и цифры ([a- z0-9_.])». Я предлагаю редактировать имена файлов в ответ на pop_enter.xml и pop_exit.xml. – smichak

5

Модифицированный support library поддерживает использование анимаций вида (то есть <translate>, <rotate>) и объектных аниматоров (то есть <objectAnimator>) для фрагментарных переходов. Он реализован с NineOldAndroids. Подробнее см. В моей документации по github.

1

Я решить этот путь Ниже

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

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

fragmentTransaction.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

+0

Надеюсь, это поможет вам, ребята. Ответ очень полезен, пожалуйста, повысьте, мой ответ. –

+0

Спасибо за сторонних ребята .... держите больше upvote, если это полезно. –

 Смежные вопросы

  • Нет связанных вопросов^_^