page.title=Displaying Card Flip Animations
trainingnavtop=true

@jd:body
    <div id="tb-wrapper">
      <div id="tb">
        <h2>
          This lesson teaches you to
        </h2>
        <ol>
          <li>
            <a href="#animators">Create the Animators</a>
          </li>
          <li>
            <a href="#views">Create the Views</a>
          </li>
          <li>
            <a href="#fragment">Create the Fragment</a>
          </li>
          <li>
            <a href="#animate">Animate the Card Flip</a>
          </li>
        </ol>
        <h2>
          Try it out
        </h2>
        <div class="download-box">
          <a href="{@docRoot}shareables/training/Animations.zip" class=
          "button">Download the sample app</a>
          <p class="filename">
            Animations.zip
          </p>
        </div>
      </div>
    </div>
    <p> This lesson shows you how to do a card flip
      animation with custom fragment animations.
      Card flips animate between views of content by showing an animation that emulates
      a card flipping over. 
    </p>
    <p>Here's what a card flip looks like:
    </p>

    <div class="framed-galaxynexus-land-span-8">
      <video class="play-on-hover" autoplay>
        <source src="anim_card_flip.mp4" type="video/mp4">
        <source src="anim_card_flip.webm" type="video/webm">
        <source src="anim_card_flip.ogv" type="video/ogg">
      </video>
    </div>
    <div class="figure-caption">
      Card flip animation
      <div class="video-instructions">&nbsp;</div>
    </div>

    <p>
      If you want to jump ahead and see a full working example,
      <a href="{@docRoot}shareables/training/Animations.zip">download</a> and
      run the sample app and select the Card Flip example. See the following
      files for the code implementation:
    </p>
    <ul>
      <li>
        <code>src/CardFlipActivity.java</code>
      </li>
      <li>
        <code>animator/card_flip_right_in.xml</code>
      </li>
      <li>
        <code>animator/card_flip_right_out.xml</code>
      </li>
      <li>
        <code>animator/card_flip_right_in.xml</code>
      </li>
      <li>
        <code>animator/card_flip_left_out.xml</code>
      </li>
      <li>
        <code>layout/fragment_card_back.xml</code>
      </li>
      <li>
        <code>layout/fragment_card_front.xml</code>
      </li>
    </ul>

    <h2 id="animate">
      Create the Animators
    </h2>
    <p>
      Create the animations for the card flips. You'll need two animators for when the front
      of the card animates out and to the left and in and from the left. You'll also need two animators
      for when the back of the card animates in and from the right and out and to the right.
    </p>
    <h4>
      card_flip_left_in.xml
    </h4>
<pre>
&lt;set xmlns:android="http://schemas.android.com/apk/res/android"&gt;
    &lt;!-- Before rotating, immediately set the alpha to 0. --&gt;
    &lt;objectAnimator
        android:valueFrom="1.0"
        android:valueTo="0.0"
        android:propertyName="alpha"
        android:duration="0" /&gt;

    &lt;!-- Rotate. --&gt;
    &lt;objectAnimator
        android:valueFrom="-180"
        android:valueTo="0"
        android:propertyName="rotationY"
        android:interpolator="@android:interpolator/accelerate_decelerate"
        android:duration="@integer/card_flip_time_full" /&gt;

    &lt;!-- Half-way through the rotation (see startOffset), set the alpha to 1. --&gt;
    &lt;objectAnimator
        android:valueFrom="0.0"
        android:valueTo="1.0"
        android:propertyName="alpha"
        android:startOffset="@integer/card_flip_time_half"
        android:duration="1" /&gt;
&lt;/set&gt;
</pre>
    <h4>
      card_flip_left_out.xml
    </h4>
    <pre>
&lt;set xmlns:android="http://schemas.android.com/apk/res/android"&gt;
    &lt;!-- Rotate. --&gt;
    &lt;objectAnimator
        android:valueFrom="0"
        android:valueTo="180"
        android:propertyName="rotationY"
        android:interpolator="@android:interpolator/accelerate_decelerate"
        android:duration="@integer/card_flip_time_full" /&gt;

    &lt;!-- Half-way through the rotation (see startOffset), set the alpha to 0. --&gt;
    &lt;objectAnimator
        android:valueFrom="1.0"
        android:valueTo="0.0"
        android:propertyName="alpha"
        android:startOffset="@integer/card_flip_time_half"
        android:duration="1" /&gt;
&lt;/set&gt;
    </pre>
    <h4>
      card_flip_right_in.xml
    </h4>
    <pre>
&lt;set xmlns:android="http://schemas.android.com/apk/res/android"&gt;
    &lt;!-- Before rotating, immediately set the alpha to 0. --&gt;
    &lt;objectAnimator
        android:valueFrom="1.0"
        android:valueTo="0.0"
        android:propertyName="alpha"
        android:duration="0" /&gt;

    &lt;!-- Rotate. --&gt;
    &lt;objectAnimator
        android:valueFrom="180"
        android:valueTo="0"
        android:propertyName="rotationY"
        android:interpolator="@android:interpolator/accelerate_decelerate"
        android:duration="@integer/card_flip_time_full" /&gt;

    &lt;!-- Half-way through the rotation (see startOffset), set the alpha to 1. --&gt;
    &lt;objectAnimator
        android:valueFrom="0.0"
        android:valueTo="1.0"
        android:propertyName="alpha"
        android:startOffset="@integer/card_flip_time_half"
        android:duration="1" /&gt;
</set>

</pre>
    <h4>
      card_flip_right_out.xml
    </h4>
    <pre>
&lt;set xmlns:android="http://schemas.android.com/apk/res/android"&gt;
    &lt;!-- Rotate. --&gt;
    &lt;objectAnimator
        android:valueFrom="0"
        android:valueTo="-180"
        android:propertyName="rotationY"
        android:interpolator="@android:interpolator/accelerate_decelerate"
        android:duration="@integer/card_flip_time_full" /&gt;

    &lt;!-- Half-way through the rotation (see startOffset), set the alpha to 0. --&gt;
    &lt;objectAnimator
        android:valueFrom="1.0"
        android:valueTo="0.0"
        android:propertyName="alpha"
        android:startOffset="@integer/card_flip_time_half"
        android:duration="1" /&gt;
&lt;/set&gt;
</pre>
    <h2 id="views">
      Create the Views
    </h2>
    <p>
      Each side of the "card" is a separate layout that can contain any content you want,
      such as two screens of text, two images, or any combination of views to flip between. You'll then
      use the two layouts in the fragments that you'll later animate. The following layouts
      create one side of a card that shows text:
    </p>

    <pre>
&lt;LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:background="#a6c"
    android:padding="16dp"
    android:gravity="bottom"&gt;

    &lt;TextView android:id="@android:id/text1"
        style="?android:textAppearanceLarge"
        android:textStyle="bold"
        android:textColor="#fff"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="@string/card_back_title" /&gt;

    &lt;TextView style="?android:textAppearanceSmall"
        android:textAllCaps="true"
        android:textColor="#80ffffff"
        android:textStyle="bold"
        android:lineSpacingMultiplier="1.2"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="@string/card_back_description" /&gt;

&lt;/LinearLayout&gt;
</pre>
<p>
and the other side of the card that displays an {@link android.widget.ImageView}:
</p>
<pre>
&lt;ImageView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:src="@drawable/image1"
    android:scaleType="centerCrop"
    android:contentDescription="@string/description_image_1" /&gt;
</pre>
    <h2 id="fragment">
      Create the Fragment
    </h2>
    <p>
      Create fragment classes for the front and back of the card. These classes return the layouts
      that you created previously in the {@link android.app.Fragment#onCreateView onCreateView()} method
      of each fragment. You can then create instances of this fragment in the parent activity
      where you want to show the card. The following example shows nested fragment classes inside
      of the parent activity that uses them:
    </p>
    <pre>
public class CardFlipActivity extends Activity {
    ...
    /**
     * A fragment representing the front of the card.
     */
    public class CardFrontFragment extends Fragment {
        &#64;Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                Bundle savedInstanceState) {
            return inflater.inflate(R.layout.fragment_card_front, container, false);
        }
    }

    /**
     * A fragment representing the back of the card.
     */
    public class CardBackFragment extends Fragment {
        &#64;Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                Bundle savedInstanceState) {
            return inflater.inflate(R.layout.fragment_card_back, container, false);
        }
    }
}
</pre>
    <h2 id="animate">
      Animate the Card Flip
    </h2>

    <p> Now, you'll need to display the fragments inside of a parent activity.
    To do this, first create the layout for your activity. The following example creates a
    {@link android.widget.FrameLayout} that you
    can add fragments to at runtime:</p>

    <pre>
&lt;FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/container"
    android:layout_width="match_parent"
    android:layout_height="match_parent" /&gt;
</pre>

    <p>In the activity code, set the content view to be the layout that you just created. It's also
      good idea to show a default fragment when the activity is created, so the following example
      activity shows you how to display the front of the card by default:
    </p>



<pre>
public class CardFlipActivity extends Activity {

    &#64;Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_activity_card_flip);

        if (savedInstanceState == null) {
            getFragmentManager()
                    .beginTransaction()
                    .add(R.id.container, new CardFrontFragment())
                    .commit();
        }
    }
    ...
}
</pre>
    <p>
      Now that you have the front of the card showing, you can show the back of the card
      with the flip animation at an appropriate time. Create a method to show the other
      side of the card that does the following things:
    </p>
    <ul>
      <li>Sets the custom animations that you created earlier for the fragment transitions.
      </li>
      <li>Replaces the currently displayed fragment with a new fragment and animates this event
      with the custom animations that you created.
      </li>
      <li>Adds the previously displayed fragment to the fragment back stack
      so when the user presses the <em>Back</em> button, the card flips back over.
      </li>
    </ul>
    <pre>
private void flipCard() {
    if (mShowingBack) {
        getFragmentManager().popBackStack();
        return;
    }

    // Flip to the back.

    mShowingBack = true;

    // Create and commit a new fragment transaction that adds the fragment for the back of
    // the card, uses custom animations, and is part of the fragment manager's back stack.

    getFragmentManager()
            .beginTransaction()

            // Replace the default fragment animations with animator resources representing
            // rotations when switching to the back of the card, as well as animator
            // resources representing rotations when flipping back to the front (e.g. when
            // the system Back button is pressed).
            .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 any fragments currently in the container view with a fragment
            // representing the next page (indicated by the just-incremented currentPage
            // variable).
            .replace(R.id.container, new CardBackFragment())

            // Add this transaction to the back stack, allowing users to press Back
            // to get to the front of the card.
            .addToBackStack(null)

            // Commit the transaction.
            .commit();
}
</pre>