- Анимация фрагментов
- fragment1.xml
- fragment2.xml
- Fragment1.java
- slide_in_left.xml
- slide_in_right.xml
- Переворачиваем карту
- card_flip_left_enter.xml
- card_flip_left_exit.xml
- card_flip_right_enter.xml
- card_flip_right_exit.xml
- fragment_card_front.xml
- fragment_card_back.xml
- Не работает анимация фрагмента Android Fragment
- Не работает анимация выхода; Пользовательская анимация FragmentTransaction не работает для скрытия
- 5 ответов
- Fragment standard transition not animating
- 6 Answers 6
- Android — Custom Animation on fragment transaction not running
- 5 Answers 5
Анимация фрагментов
Android позволяет переключаться между фрагментами с помощью анимационных эффектов. Рассмотрим примеры с применением готовых эффектов, а также создадим свою собственную анимацию.
Создадим новый проект с главной активностью. В активность динамически будут подключаться фрагменты, между которыми будем переключаться с анимационными эффектами при помощи кнопки. Компонент FrameLayout послужит контейнером для подключаемых фрагментов.
Разметка для активности:
Создадим разметки для фрагментов.
fragment1.xml
fragment2.xml
Отличия между фрагментами — фоновый цвет (красный и зелёный) и текст, по которым будет проще различать фрагменты.
Фрагмент должен иметь свой класс. Для примера достаточно простейшего кода, где нужно указать разметку фрагмента.
Fragment1.java
По такому же принципу создайте класс для второго фрагмента самостоятельно.
Теперь перейдём к коду для главной активности:
В коде я закомментировал две строчки для анимации. В таком виде переключение между фрагментами происходит стандартным способом без анимации. Теперь раскомментируйте первую строчку transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);. В классе FragmentTransaction есть несколько готовых анимаций. С помощью метода setTransition(int transit) мы можем указать нужную анимацию и увидеть её в действии.
- TRANSIT_FRAGMENT_CLOSE
- TRANSIT_FRAGMENT_OPEN
- TRANSIT_FRAGMENT_FADE
- TRANSIT_NONE
Снова закомментируйте строку и раскомментируйте вторую строку transaction.setCustomAnimations(R.animator.slide_in_left, R.animator.slide_in_right);. Метод setCustomAnimations() позволяет указать собственную анимацию. Методу передаются два параметра. Первый параметр описывает анимацию для фрагмента, который появляется, а второй — описывает анимацию для фрагмента, который убирается с экрана устройства. Метод следует вызывать до появления фрагментов, иначе анимация не будет применена.
С методом setCustomAnimations() нужно быть осторожным при работе с фрагментами из support-библиотеки. В одной из версий библиотеки разработчики из Гугла всё поломали и код перестал работать. Неизвестно когда починят. Поэтому используйте стандартные фрагменты.
Для анимации нужно создать XML-файлы в папке res/animator (её тоже нужно создать вручную).
slide_in_left.xml
slide_in_right.xml
Элементы визуальных эффектов задаются в теге objectAnimator. У атрибута propertyName указывается свойство фрагмента, которое мы будем изменять при анимации, valueType указывает тип изменяемого параметра. Атрибуты valueFrom и valueTo указывают диапазон изменения параметра, указанного в propertyName. Если параметр valueFrom не указан, то значение берётся равное текущему. В нашем случае valueFrom равен -1280, это означает, что движение фрагмента по оси y будет начинаться со значения -1280 и перемещение будет происходить пока значение y не станет равным 0 для верхнего левого угла нашего фрагмента в течении 1500 миллисекунд (атрибут duration).
Тег set служит для объединения эффектов либо их разделения. В файле slide_in_right.xml используется атрибут ordering со значением together, что означает проигрывать эффекты одновременно, в противовес ему существует значение sequentially, которое требует последовательного отображения эффектов в анимации.
Переворачиваем карту
Напишем ещё один пример для закрепления материала.
Найдите в интернете две картинки, например, изображения карты и её рубашки. Подготовим четыре файла в папке res/animator.
card_flip_left_enter.xml
card_flip_left_exit.xml
card_flip_right_enter.xml
card_flip_right_exit.xml
В файле res/values/strings.xml добавьте пару новых ресурсов.
Теперь создадим два макета для двух фрагментов в папке res/layout. Фрагменты будут содержать по одной картинке.
fragment_card_front.xml
fragment_card_back.xml
Создаём два класса для фрагментов, которые загружают свои макеты.
Упростим макет активности.
Осталось написать код. Ещё раз напомню, что используйте стандартные фрагменты, а не из библиотеки совместимости.
Контейнер обрабатывает касание пальца как щелчок и переворачивает фрагмент на другой. Результат в видео.
Источник
Не работает анимация фрагмента Android Fragment
Я разрабатываю планшетную часть моего приложения, которая включает шаблон потока детализации. Когда я нажимаю кнопку на стороне детали, с этой стороны происходит анимация перехода фрагмента, причем один фрагмент заменяет другой:
Анимация в переходе работает отлично. Однако, когда я хочу вернуться к предыдущему фрагменту, нажав кнопку «Назад», фрагмент, который появляется, появляется с работающей анимацией push, но фрагмент, который уходит, не выполняет свою выходную анимацию push. Он просто исчезает, когда работает только одна анимация.
Я пробовал использовать разные анимации, но получаю тот же результат. Кто-нибудь имеет представление о том, что происходит, или если я не понимаю что-то о переходах фрагментов?
EDIT: My activity_skill_twopane.xml detail. FrameLayout — это контейнер фрагментов с его идентификатором как R.id.main_fragment_container. Похоже, что когда я помещал ImageView в детали FrameLayout в xml, он появляется в фоновом режиме, пока анимация также происходит. Кто-нибудь знает, почему это происходит?
EDIT: Моя анимация xml выглядит следующим образом:
ОБНОВЛЕНИЕ: мне удалось воссоздать проблему на телефоне. Если у вас есть одна функция фрагментации с помощью кнопки, которая выполняет транзакцию фрагмента с анимацией, подобной моей, и отмените вторую операцию, чтобы вызвать «popBackStackImmediate», вы заметите, что заменяемый фрагмент просто исчезает без анимации, а фрагмент, который заменяет, выполняет его анимация.
Источник
Не работает анимация выхода; Пользовательская анимация FragmentTransaction не работает для скрытия
Я использую show / hide для отображения фрагмента, занимающего часть экрана. По какой-то причине, когда фрагмент показан, воспроизводится анимация slide_in_left , но когда фрагмент скрывается, анимации нет, фрагмент просто исчезает. Я пробовал использовать анимацию slide_in_left как для exit , так и для enter , это не помогло. При отслеживании кода в пакете поддержки анимация создается, и код для ее отображения выполняется. (Я отследил звонок .hide )
На всякий случай вот xml для анимации slide_out_left
Изменить: Возможно, проблема связана с тем, что my_fragment разделяет ширину экрана с другим фрагментом, хранящим веб-просмотр. Когда .show выполняется для my_fragment, он становится видимым и разделяет пространство в горизонтальной линейной компоновке (сколько ширины экрана занимает каждый из двух фрагментов, определяется параметром веса).
5 ответов
Лично для меня это ошибка zPosition для анимации фрагментов.
Вы видите, что новый фрагмент «появляется», потому что новый фрагмент прикреплен под текущим.
Поэтому при попытке анимировать фрагмент «поверх» существующего фрагмента кажется, что ничего не происходит, тогда новый просто «появляется».
Я пробовал много обходных путей, играя с zPosition (влияет только на окна, а не на макеты, поэтому не влияет на фрагменты), onAnimationCreate() перенос корневого макета на передний план или даже при запуске и остановке анимации . похоже, ничего не делает.
Таким образом, на данный момент без написания полной пользовательской анимации для переходов фрагментов, на данный момент они немного глючны.
Возможно, вам придется поиграть. .add(Fragment) дождитесь его добавления, затем вызовите .remove(Fragment) , удаляя старый фрагмент, таким образом новый фрагмент физически помещается поверх существующего.
Попробуйте вместо этого использовать переходы. Вот пример из моего проекта:
Думаю, возникла такая же ситуация:
У меня есть N фрагментов, и я хотел иметь собственную анимацию, но я не хотел перезагружать фрагменты, поэтому выполнение add и remove или replace не было решением, и с show / hide мне не удалось синхронизировать анимацию между двумя фрагментами.
Чтобы исправить это, мне пришлось использовать FrameLayout для каждого фрагмента.
Затем, чтобы указать, какой фрагмент отображать:
Ключ находится в bringToFront
Надеюсь, это было полезно!
Попробуйте использовать setCustomAnimations (int enter, int exit, int popEnter, int popExit) вместо setCustomAnimations (int enter, int exit) Когда вы вызовете popupbackstack exit, анимация не будет вызываться
Источник
Fragment standard transition not animating
I’m using the v4 android compatibility library to develop a tablet UI using fragments specifically for Android 2.2 devices and up.
Everything is working as it should, except that I can’t get any animations to work, not even the standard animations.
Instead of using a transit animation, the fragment freezes for about a second and the just disappears and the new one appears.
doesn’t work either.
I read that the custom animation were broken in the compatibility library, but no one seems to be having issues with the standard transitions. I’ve tested this on a 3.2.1 Motorola Xoom, 2.3 Galaxy Tab 7″, 2.2 emulator, and even on a HTC G2 with 2.3.4.
What could be wrong here?
6 Answers 6
I finally got this to work after much trial and error.
First and foremost, get the lastest ACL, it did fix custom animations, and while this was not my exact problem, once those worked I ended up using them instead of standard transitions.
Right now I am using:
The key to making it work on both Android 2.1, 2.2 and 2.3, as well as Android 3.0+ was to do the following:
- Make sure you are using ONLY API´s available to the lowest API LEVEL you wish to support (in my case 2.1).
- Compile using Android 3.0.
- In the manifest file, set android:hardwareAccelerated=»true» inside your application tag.
Fragment animations now work on all devices. If you do not set the extra info in the application tag, the animation will occur, but in a very very choppy way, making it seem as though it did not happen at all.
Hope this helps someone in the future!
As a note, there are some API checking tools so you are sure you are not using any APIs that aren’t available to you. I prefer to work on 2.1 so the IDE doesn’t show anything I can’t use, once I have stable code I jump back to compiling on 3.0
Источник
Android — Custom Animation on fragment transaction not running
I’m using Google API 8 (Android 2.2) with support package v4.
It doesn’t give any error or animation.
slide_in_left.xml
slide_out_right.xml
Does anyone know what is happening here?
5 Answers 5
The manager was stacking my transaction before I set the animation, so it stacks the transaction without animations (sad but true), and that occurs even if I commit the transaction after the setCustomAnimations() .
The solution is to set the animations first:
As suggested above, separate statements will definitely work. But the trick here is to setCustomAnimation before setting transaction type viz. add , replace , etc. else it doesn’t. So, applying the same logic, method chaining also works. eg.
Putting it here, so that someone who prefers method chaining finds it helpful. Cheers!
Leaving this here as it’s the most popular question. I had the same problem with fragment transaction not animating. The culprit was having the attribute android:animateLayoutChanges set to true in the containing layout.
I hope it helps someone save some time looking for a solution as it can be hard to notice when having nested layouts in different files.
Источник