web-dev-qa-db-de.com

3D-Flip-Animation auf Android.support.v4.Fragment

Ich lese gerade dieses Tutorial:

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

on Animationen von Fragmenten umkehren . Leider ist der object-animator nur für Android.app.Fragment verfügbar und nicht für das Fragment.

Ich habe versucht, die .xml-Animationen mit Hilfe von Skalierungs- und Rotationsanimationen zu rekonstruieren. Aber jetzt werden die Animationen einfach nicht ausgeführt, und nach der Zeit, die ich in der .xml-Datei der Animationen eingestellt habe, erscheint das andere Fragment. anstatt zu spiegeln.

  • Habe ich bei der Implementierung der .xml-Animationen einfach einen Fehler gemacht? 
  • Oder ist es nicht möglich, eine 3D-Flip-Animation ohne Objektanimator auszuführen?
  • Oder ist es nicht möglich, eine 3D-Flip-Animation mit der Unterstützung Fragment zu erstellen?

Hier sind meine .xml-Animationen: 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>

Und hier ist der Code, wo sie ausgeführt werden:

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();
21
Philipp Jahoda

Sie können NineOldAndroids verwenden. Die Honeycomb-Animations-API (Android 3.0) wird bis zu Android 1.0 zurückgespielt. Sie erhalten ObjectAnimator, ValueAnimator und all die anderen guten Dinge.

3
Anup Cowkur

Vielen Dank für Ihre Hilfe.

Ich habe mein Problem gelöst. Die Lösung hat mit NineOldAndroids und einer anderen Library mit support-v4 für NineOldAndroids zu tun.

Was ich getan habe:

  • Ich habe diese Bibliothek heruntergeladen: https://github.com/kedzie/Support_v4_NineOldAndroids (Dies ist eine Support-Bibliothek für NineOldAndroids)
  • Ich habe es in meinen Arbeitsbereich importiert
  • Die NineOldAndroids Library wurde heruntergeladen und in meinen Arbeitsbereich importiert
  • Importierte die NineOldAndroids-Bibliothek in die support-v4-Bibliothek
  • Importierte die support-v4-nineoldandroids-Bibliothek in mein Projekt
  • Hat die Filp-Animation gemacht
2
Philipp Jahoda

Falls Sie nicht unter api <3 unterstützen

verwenden Sie den gleichen Code wie in: https://stuff.mit.edu/afs/sipb/project/Android/docs/training/animation/cardflip.html

die FlipCard-Methode wurde angepasst:

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();
}
0
ReeSen