3D Flip Animation на android.support.v4.Fragment

Я сейчас читаю этот учебник:

http://developer.android.com/training/animation/cardflip.html

на анимациях переворачивания фрагментов. К сожалению, object-animator доступен только для android.app.Fragment, а не для фрагмента поддержки.

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

  • Я просто допустил ошибку при реализации анимации .xml?
  • Или без объектно-аниматора нельзя сделать флип-анимацию в 3D?
  • Или невозможно сделать 3D-флип-анимацию с поддержкой Fragment?

Вот мои анимации .xml: flip_left_in.xml

<set xmlns:android="http://schemas.android.com/apk/res/android" >

  <!-- Before rotating, immediately set the alpha to 0. -->
 <alpha
    android:valueFrom="1.0"
    android:valueTo="0.0"
    android:propertyName="alpha"
    android:duration="0" />

 <!-- Rotate. -->
 <rotate
    android:valueFrom="-180"
    android:valueTo="0"
    android:propertyName="rotationY"
    android:interpolator="@android:anim/accelerate_decelerate_interpolator"
    android:duration="800"/>

<!-- Half-way through the rotation (see startOffset), set the alpha to 1. -->
<alpha
    android:valueFrom="0.0"
    android:valueTo="1.0"
    android:startOffset="400"
    android:duration="1" /> 
</set>

flip_left_out.xml

 <set xmlns:android="http://schemas.android.com/apk/res/android" >

   <!-- Rotate. -->
   <rotate
    android:duration="800"
    android:interpolator="@android:anim/accelerate_decelerate_interpolator"
    android:propertyName="rotationY"
    android:valueFrom="0"
    android:valueTo="180" />

<!-- Half-way through the rotation (see startOffset), set the alpha to 0. -->
<alpha
    android:duration="1"
    android:propertyName="alpha"
    android:startOffset="400"
    android:valueFrom="1.0"
    android:valueTo="0.0" />

 </set>

flip_right_in.xml

<set xmlns:android="http://schemas.android.com/apk/res/android" >
<!-- Before rotating, immediately set the alpha to 0. -->
<alpha
    android:duration="0"
    android:propertyName="alpha"
    android:valueFrom="1.0"
    android:valueTo="0.0" />

<!-- Rotate. -->
<rotate
    android:duration="800"
    android:interpolator="@android:anim/accelerate_decelerate_interpolator"
    android:propertyName="rotationY"
    android:valueFrom="180"
    android:valueTo="0" />

<!-- Half-way through the rotation (see startOffset), set the alpha to 1. -->
<alpha
    android:duration="1"
    android:propertyName="alpha"
    android:startOffset="400"
    android:valueFrom="0.0"
    android:valueTo="1.0" />

  </set>

flip_right_out.xml

<set xmlns:android="http://schemas.android.com/apk/res/android" >
<!-- Rotate. -->
<rotate
    android:duration="800"
    android:interpolator="@android:anim/accelerate_decelerate_interpolator"
    android:propertyName="rotationY"
    android:valueFrom="0"
    android:valueTo="-180" />

<!-- Half-way through the rotation (see startOffset), set the alpha to 0. -->
<alpha
    android:duration="1"
    android:propertyName="alpha"
    android:startOffset="400"
    android:valueFrom="1.0"
    android:valueTo="0.0" />

 </set>

А вот код, где они выполняются:

FragmentTransaction trans = getActivity().getSupportFragmentManager().beginTransaction();

trans.setCustomAnimations(R.anim.flip_right_in, R.anim.flip_right_out, 
                           R.anim.flip_left_in, R.anim.flip_left_out);
trans.addToBackStack(null);

trans.replace(R.id.content_frame, new MyFragment()).commit();

person Philipp Jahoda    schedule 27.08.2013    source источник
comment
Вы сделали эффект 3D флип? не могли бы вы рассказать мне, как вы заменили приведенный выше код аниматором объектов?   -  person    schedule 26.09.2016


Ответы (3)


Вы можете использовать NineOldAndroids. Он поддерживает API анимации Honeycomb (Android 3.0) вплоть до Android 1.0. Вы получите ObjectAnimator, ValueAnimator и все другие полезные вещи.

person Anup Cowkur    schedule 27.08.2013
comment
И как тогда будет работать 3D флип анимация? Смогу ли я просто использовать объектный аниматор даже на моем фрагменте поддержки? - person Philipp Jahoda; 27.08.2013
comment
Ага. Это все, что вам нужно сделать. - person Anup Cowkur; 27.08.2013
comment
Я импортировал библиотеку, заменил свои XML-анимации XML-файлами объектного аниматора, но получаю сообщение об ошибке: Неизвестное имя анимации: объектный аниматор - person Philipp Jahoda; 27.08.2013
comment
Вы уверены, что импортировали и использовали его правильно? См. образец XML-файла здесь: github.com/JakeWharton. /NineOldAndroids/blob/master/sample/res/ - person Anup Cowkur; 27.08.2013
comment
Я скопировал анимацию штампа из учебника Google и добавил библиотеку, как и любую другую библиотеку. :) Но я постараюсь прочитать, добавить идентификатор и сделать что-то вроде очистки ^^ - person Philipp Jahoda; 27.08.2013
comment
@PhilippJahoda, не могли бы вы сказать мне, где я могу найти ваш ответ :) Спасибо. - person Arkadiusz 'flies' Rzadkowolski; 06.03.2014
comment
Привет @PhilippJahoda Можете ли вы поделиться, как вы это решили? Я сталкиваюсь с той же проблемой. Спасибо - person Martin Vandzura; 06.03.2014
comment
Да, пожалуйста, взгляните на мой ответ ниже, я только что восстановил его. Первоначально я удалил его, потому что он каким-то образом проголосовал. - person Philipp Jahoda; 06.03.2014
comment
@AnupCowkur Вы уверены, что можете просто использовать NineOldAndroids? Я также получаю сообщение об ошибке Unknown animation name: object Animator. - person theblang; 20.08.2014

Спасибо за вашу помощь.

Мне удалось решить мою проблему. Решение связано с NineOldAndroids и другой библиотекой с поддержкой support-v4 для NineOldAndroids.

Что я сделал:

  • Я скачал эту библиотеку: https://github.com/kedzie/Support_v4_NineOldAndroids (это библиотека поддержки для девять старых андроидов)
  • Импортировал его в свою рабочую область
  • Скачал библиотеку NineOldAndroids и импортировал ее в свою рабочую область.
  • Импортирована библиотека NineOldAndroids в библиотеку support-v4.
  • Импортировал библиотеку support-v4-nineoldandroids в свой проект.
  • Делал Filp-анимацию
person Philipp Jahoda    schedule 29.08.2013
comment
Если у кого-то есть проблемы с поддержкой support-v4 для импорта NineOldAndroids и т. д., убедитесь, что ваш ADT обновлен. Например, если эта поддержка v4 создана для API 19, она должна быть доступна в вашем ADT. У меня были проблемы, потому что у моего ADT был только API 18. Решение состояло в том, чтобы обновить ADT до последней версии. - person Stan; 20.04.2014
comment
как сделать с поддержкой support-v4 для NineOldAndroids с помощью Android Studio - person Sathish Kumar J; 13.06.2017

В случае, если вы не поддерживаете API ниже 3

используйте тот же код, что и в: https://stuff.mit.edu/afs/sipb/project/android/docs/training/animation/cardflip.html

только что изменил метод flipCard:

private void flipCard() {
if (mShowingBack) {
    mShowingBack = false;
    FragmentTransaction trans = getActivity().getFragmentManager().beginTransaction();
    trans.setCustomAnimations(R.animator.card_flip_right_in,
            R.animator.card_flip_right_out,
            R.animator.card_flip_left_in,
            R.animator.card_flip_left_out)
         .replace(R.id.memberCardContainer, new CardFrontFragment())
         .commit();
    return;
}

// Flip to the back.
mShowingBack = true;
FragmentTransaction trans = getActivity().getFragmentManager().beginTransaction();
trans.setCustomAnimations(R.animator.card_flip_right_in,
        R.animator.card_flip_right_out,
        R.animator.card_flip_left_in,
        R.animator.card_flip_left_out)
     .replace(R.id.memberCardContainer, new CardBackFragment())
     .commit();
}
person ReeSen    schedule 09.06.2017
comment
Это дает ошибку преобразования, когда ваши классы фрагментов расширяют фрагмент поддержки v4. - person Elisabeth; 06.08.2017