Фрагмент стандартного перехода не анимируется - PullRequest
44 голосов
/ 11 октября 2011

Я использую библиотеку совместимости Android v4 для разработки пользовательского интерфейса планшета с использованием фрагментов специально для устройств Android 2.2 и выше.

Все работает как надо, за исключением того, что я не могу получить анимацию дляработают, даже не стандартные анимации.

Код:

FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
    ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
    ABCFragment abcFragment = new ABCFragment();
    ft.replace(R.id.main_frame_layout_fragment_holder,abcFragment);     
    ft.addToBackStack(null);
    ft.commit();

Вместо использования транзитной анимации, фрагмент останавливается примерно на секунду, а просто исчезает и появляется новая.

Использование:

ft.setCustomAnimations(android.R.anim.slide_in_left,android.R.anim.slide_out_right);

тоже не работает.

XML:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res/com.synergygb.mycustomapp"
android:id="@+id/LinearLayout01" android:layout_width="fill_parent"
android:layout_height="fill_parent" android:orientation="vertical"
android:gravity="bottom">
<FrameLayout android:layout_width="fill_parent" android:layout_height="fill_parent" android:id="@+id/main_frame_layout_fragment_holder">
</FrameLayout>
<!-- OTHER FIXED UI ELEMENTS-->
</RelativeLayout>

Я прочитал, что пользовательская анимация была нарушена в совместимостибиблиотека, но, похоже, никто не испытывает проблем со стандартными переходами.Я проверял это на 3.2.1 Motorola Xoom, 2.3 Galaxy Tab 7 ", эмуляторе 2.2 и даже на HTC G2 с 2.3.4.

Что здесь может быть не так?

Ответы [ 6 ]

36 голосов
/ 25 октября 2011

Я наконец заставил это работать после долгих проб и ошибок.

Прежде всего, получите самый последний ACL, он исправил пользовательские анимации, и хотя это не было моей конкретной проблемой, как только они сработали, я закончилиспользовать их вместо стандартных переходов.

Сейчас я использую:

ft.setCustomAnimations(android.R.anim.fade_in,android.R.anim.fade_out,android.R.anim.fade_in,android.R.anim.fade_out);

Ключ к тому, чтобы он работал как на Android 2.1, 2.2 и 2.3, так и на Android 3.0+нужно было сделать следующее:

  • Убедитесь, что вы используете ТОЛЬКО API, доступный для самого низкого уровня API, который вы хотите поддерживать (в моем случае 2.1).
  • Компиляция с помощью Android3.0.
  • В файле манифеста установите android:hardwareAccelerated="true" внутри тега приложения.

Анимации фрагментов теперь работают на всех устройствах.Если вы не установите дополнительную информацию в теге приложения, анимация будет происходить, но очень прерывистым образом, создавая впечатление, что это вообще не произошло.

Надеюсь, это поможет кому-то вБудущее!

Как примечание, есть некоторые инструменты проверки API, поэтому вы уверены, что не используете API, которые вам недоступны.Я предпочитаю работать на 2.1, поэтому IDE не показывает ничего, что я не могу использовать, когда у меня есть стабильный код, я возвращаюсь к компиляции на 3.0

34 голосов
/ 25 октября 2011

Попробуйте снова получить самый последний ACL, они исправили его: http://code.google.com/p/android/issues/detail?id=15623#c19

Также я заметил, что для setCustomAnimations его необходимо установить перед вызовами транзакций, такими как замена, чтобы вступить в силу.

FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.setCustomAnimations(R.anim.in_from_left, R.anim.out_to_right, R.anim.in_from_right, R.anim.out_to_left);
ft.replace(android.R.id.content, newFrag);
ft.addToBackStack(null);
ft.commit();
4 голосов
/ 04 июня 2015

Вы должны позвонить setCustomAnimations до того, как добавите фрагмент. Это позволяет добавлять несколько фрагментов с разными анимациями.

4 голосов
/ 27 ноября 2012

для выполнения анимации top_to_bottom для фрагмента,

следуйте тому же, чтобы сделать сверху вниз

FragmentTransaction ft = getFragmentManager().beginTransaction();
ft.setCustomAnimations(R.anim.top_to_bottom_fragment,
android.R.animator.fade_out); ft.replace(R.id.simple_fragment,
fragment); 
ft.commit();

top_to_bottom_fragment.xml

<objectAnimator android:duration="400" android:valueFrom="-800"
    android:valueTo="0" android:propertyName="y"
    android:valueType="floatType"
    xmlns:android="http://schemas.android.com/apk/res/android" />

, где valueFrom="-800" обозначает дномакета вашего фрагмента.

3 голосов
/ 27 мая 2013

Я добавил поддержку NineOldAndroids в библиотеку поддержки Google. Подробнее см. http://www.github.com/kedzie/Support_v4_NineOldAndroids. Это позволяет использовать анимацию свойств для переходов фрагментов, PageTransformers и некоторых других вещей.

0 голосов
/ 12 апреля 2012

Надеюсь, это кому-нибудь поможет. Документы API говорят, что для анимации фрагментов используется objectAnimator, но даже с последним пакетом совместимости objectAnimator в xml не был принят компилятором.

Это работает для меня:

Для Android 3.0 или выше: объявите объектный аниматор xml в папке res / animator.

С пакетом совместимости менее 3,0: объявите анимацию XML в папке res / anim.

...