| page.title=Applying a Transition |
| |
| @jd:body |
| |
| <div id="tb-wrapper"> |
| <div id="tb"> |
| <h2>This lesson teaches you to</h2> |
| <ol> |
| <li><a href="#Create">Create a Transition</a></li> |
| <li><a href="#Apply">Apply a Transition</a></li> |
| <li><a href="#Targets">Choose Specific Target Views</a></li> |
| <li><a href="#Multiple">Specify Multiple Transitions</a></li> |
| <li><a href="#NoScenes">Apply a Transition Without Scenes</a></li> |
| <li><a href="#Callbacks">Define Transition Lifecycle Callbacks</a></li> |
| </ol> |
| </div> |
| </div> |
| |
| <p>In the transitions framework, animations create a series of frames that depict a change |
| between the view hierarchies in the starting and ending scenes. The framework represents |
| these animations as transition objects, which contain information about an animation. To |
| run an animation, you provide the transition to use and the ending scene to a transition |
| manager.</p> |
| |
| <p>This lesson teaches you run an animation between two scenes using built-in transitions |
| to move, resize, and fade views. The next lesson shows you how to define custom transitions.</p> |
| |
| |
| |
| <h2 id="Create">Create a Transition</h2> |
| |
| <p>In the previous lesson, you learned how to create scenes that represent the state of |
| different view hierarchies. Once you have defined the starting scene and the ending scene you |
| want to change between, you need to create a {@link android.transition.Transition} object |
| that defines an animation. The framework enables you to specify a built-in transition in a |
| resource file and inflate it in your code or to create an instance of a built-in transition |
| directly in your code.</p> |
| |
| <!-- Built in transition table --> |
| <p class="table-caption" id="table1"><strong>Table 1.</strong> Built-in transition types.</p> |
| <table> |
| <tr> |
| <th scope="col">Class</th> |
| <th scope="col">Tag</th> |
| <th scope="col">Attributes</th> |
| <th scope="col">Effect</th> |
| </tr> |
| <tr> |
| <td><code><a href="/reference/android/transition/AutoTransition.html">AutoTransition</a></code></td> |
| <td><autoTransition/></td> |
| <td style="text-align=center;"> - </td> |
| <td>Default transition. Fade out, move and resize, and fade in views, in that order.</td> |
| </tr> |
| <tr> |
| <td><code><a href="/reference/android/transition/Fade.html">Fade</a></code></td> |
| <td><fade/></td> |
| <td><code>android:fadingMode="[fade_in |<br> fade_out |<br> fade_in_out]"</code></td> |
| <td> |
| <code>fade_in</code> fades in views<br> |
| <code>fade_out</code> fades out views<br> |
| <code>fade_in_out</code> (default) does a <code>fade_out</code> followed by a <code>fade_in</code>. |
| </td> |
| </tr> |
| <tr> |
| <td><code><a href="/reference/android/transition/ChangeBounds.html">ChangeBounds</a></code></td> |
| <td><changeBounds/></td> |
| <td style="text-align=center;"> - </td> |
| <td>Moves and resizes views.</td> |
| </tr> |
| </table> |
| |
| |
| <h3 id="FromFile">Create a transition instance from a resource file</h3> |
| |
| <p>This technique enables you to modify your transition definition without having to change |
| the code of your activity. This technique is also useful to separate complex transition |
| definitions from your application code, as shown in <a href="#Multiple">Specify Multiple |
| Transitions</a>.</p> |
| |
| <p>To specify a built-in transition in a resource file, follow these steps:</p> |
| |
| <ol> |
| <li>Add the <code>res/transition/</code> directory to your project.</li> |
| <li>Create a new XML resource file inside this directory.</li> |
| <li>Add an XML node for one of the built-in transitions.</li> |
| </ol> |
| |
| <p>For example, the following resource file specifies the {@link android.transition.Fade} |
| transition:</p> |
| |
| <p class="code-caption">res/transition/fade_transition.xml</p> |
| |
| <pre> |
| <fade xmlns:android="http://schemas.android.com/apk/res/android" /> |
| </pre> |
| |
| <p>The following code snippet shows how to inflate a {@link android.transition.Transition} |
| instance inside your activity from a resource file:</p> |
| |
| <pre> |
| Transition mFadeTransition = |
| TransitionInflater.from(this). |
| inflateTransition(R.transition.fade_transition); |
| </pre> |
| |
| |
| <h3 id="FromCode">Create a transition instance in your code</h3> |
| |
| <p>This technique is useful for creating transition objects dynamically if you modify the user |
| interface in your code, and to create simple built-in transition instances with few or |
| no parameters.</p> |
| |
| <p>To create an instance of a built-in transition, invoke one of the public constructors in |
| the subclasses of the {@link android.transition.Transition} class. For example, the following |
| code snippet creates an instance of the {@link android.transition.Fade} transition:</p> |
| |
| <pre> |
| Transition mFadeTransition = new Fade(); |
| </pre> |
| |
| |
| |
| <h2 id="Apply">Apply a Transition</h2> |
| |
| <p>You typically apply a transition to change between different view hierarchies in response |
| to an event, such as a user action. For example, consider a search app: when the user enters |
| a search term and clicks the search button, the app changes to the scene that represents the |
| results layout while applying a transition that fades out the search button and fades in the |
| search results.</p> |
| |
| <p>To make a scene change while applying a transition in response to some event in your |
| activity, call the {@link android.transition.TransitionManager#go TransitionManager.go()} |
| static method with the ending scene and the transition instance to use for the animation, |
| as shown in the following snippet:</p> |
| |
| <pre> |
| TransitionManager.go(mEndingScene, mFadeTransition); |
| </pre> |
| |
| <p>The framework changes the view hierarchy inside the scene root with the view hierarchy |
| from the ending scene while running the animation specified by the transition instance. The |
| starting scene is the ending scene from the last transition. If there was no previous |
| transition, the starting scene is determined automatically from the current state of the |
| user interface.</p> |
| |
| <p>If you do not specify a transition instance, the transition manager can apply an automatic |
| transition that does something reasonable for most situations. For more information, see the |
| API reference for the {@link android.transition.TransitionManager} class.</p> |
| |
| |
| |
| <h2 id="Targets">Choose Specific Target Views</h2> |
| |
| <p>The framework applies transitions to all views in the starting and ending scenes by |
| default. In some cases, you may only want to apply an animation to a subset of views in a |
| scene. For example, the framework does not support animating changes to |
| {@link android.widget.ListView} objects, so you should not try to animate them during a |
| transition. The framework enables you to select specific views you want to animate.</p> |
| |
| <p>Each view that the transition animates is called a <em>target</em>. You can only |
| select targets that are part of the view hierarchy associated with a scene.</p> |
| |
| <p>To remove one or more views from the list of targets, call the {@link |
| android.transition.Transition#removeTarget removeTarget()} method before starting |
| the transition. To add only the views you specify to the list of targets, call the |
| {@link android.transition.Transition#addTarget addTarget()} method. For more |
| information, see the API reference for the {@link android.transition.Transition} class.</p> |
| |
| |
| |
| <h2 id="Multiple">Specify Multiple Transitions</h2> |
| |
| <p>To get the most impact from an animation, you should match it to the type of changes |
| that occur between the scenes. For example, if you are removing some views and adding others |
| between scenes, a fade out/fade in animation provides a noticeable indication that some views |
| are no longer available. If you are moving views to different points on the screen, a better |
| choice would be to animate the movement so that users notice the new location of the views.</p> |
| |
| <p>You do not have to choose only one animation, since the transitions framework enables you |
| to combine animation effects in a transition set that contains a group of individual built-in |
| or custom transitions.</p> |
| |
| <p>To define a transition set from a collection of transitions in XML, create a resource file |
| in the <code>res/transitions/</code> directory and list the transitions under the |
| <code>transitionSet</code> element. For example, the following snippet shows how to specify a |
| transition set that has the same behaviour as the {@link android.transition.AutoTransition} |
| class:</p> |
| |
| <pre> |
| <transitionSet xmlns:android="http://schemas.android.com/apk/res/android" |
| android:transitionOrdering="sequential"> |
| <fade android:fadingMode="fade_out" /> |
| <changeBounds /> |
| <fade android:fadingMode="fade_in" /> |
| </transitionSet> |
| </pre> |
| |
| <p>To inflate the transition set into a {@link android.transition.TransitionSet} object in |
| your code, call the {@link android.transition.TransitionInflater#from TransitionInflater.from()} |
| method in your activity. The {@link android.transition.TransitionSet} class extends from the |
| {@link android.transition.Transition} class, so you can use it with a transition manager just |
| like any other {@link android.transition.Transition} instance.</p> |
| |
| |
| |
| <h2 id="NoScenes">Apply a Transition Without Scenes</h2> |
| |
| <p>Changing view hierarchies is not the only way to modify your user interface. You can also |
| make changes by adding, modifying, and removing child views within the current hierarchy. For |
| example, you can implement a search interaction with just a single layout. Start with the |
| layout showing a search entry field and a search icon. To change the user interface to show |
| the results, remove the search button when the user clicks it by calling the {@link |
| android.view.ViewGroup#removeView ViewGroup.removeView()} method, and add the search results by |
| calling {@link android.view.ViewGroup#addView ViewGroup.addView()} method.</p> |
| |
| <p>You may want to use this approach if the alternative is to have two hierarchies that are |
| nearly identical. Rather than having to create and maintain two separate layout files for a |
| minor difference in the user interface, you can have one layout file containing a view |
| hierarchy that you modify in code.</p> |
| |
| <p>If you make changes within the current view hierarchy in this fashion, you do not need to |
| create a scene. Instead, you can create and apply a transition between two states of a view |
| hierarchy using a <em>delayed transition</em>. This feature of the transitions framework |
| starts with the current view hierarchy state, records changes you make to its views, and applies |
| a transition that animates the changes when the system redraws the user interface.</p> |
| |
| <p>To create a delayed transition within a single view hierarchy, follow these steps:</p> |
| |
| <ol> |
| <li>When the event that triggers the transition occurs, call the {@link |
| android.transition.TransitionManager#beginDelayedTransition |
| TransitionManager.beginDelayedTransition()} method providing the parent view of all the views |
| you want to change and the transition to use. The framework stores the current state of the |
| child views and their property values.</li> |
| <li>Make changes to the child views as required by your use case. The framework records |
| the changes you make to the child views and their properties.</li> |
| <li>When the system redraws the user interface according to your changes, the framework |
| animates the changes between the original state and the new state.</li> |
| </ol> |
| |
| <p>The following example shows how to animate the addition of a text view to a view hierarchy |
| using a delayed transition. The first snippet shows the layout definition file:</p> |
| |
| <p class="code-caption">res/layout/activity_main.xml</p> |
| |
| <pre> |
| <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" |
| android:id="@+id/mainLayout" |
| android:layout_width="match_parent" |
| android:layout_height="match_parent" > |
| <EditText |
| android:id="@+id/inputText" |
| android:layout_alignParentLeft="true" |
| android:layout_alignParentTop="true" |
| android:layout_width="match_parent" |
| android:layout_height="wrap_content" /> |
| ... |
| </RelativeLayout> |
| </pre> |
| |
| <p>The next snippet shows the code that animates the addition of the text view:</p> |
| |
| <p class="code-caption">MainActivity.java</p> |
| |
| <pre> |
| private TextView mLabelText; |
| private Fade mFade; |
| private ViewGroup mRootView; |
| ... |
| |
| // Load the layout |
| this.setContentView(R.layout.activity_main); |
| ... |
| |
| // Create a new TextView and set some View properties |
| mLabelText = new TextView(); |
| mLabelText.setText("Label").setId("1"); |
| |
| // Get the root view and create a transition |
| mRootView = (ViewGroup) findViewById(R.id.mainLayout); |
| mFade = new Fade(IN); |
| |
| // Start recording changes to the view hierarchy |
| TransitionManager.beginDelayedTransition(mRootView, mFade); |
| |
| // Add the new TextView to the view hierarchy |
| mRootView.addView(mLabelText); |
| |
| // When the system redraws the screen to show this update, |
| // the framework will animate the addition as a fade in |
| </pre> |
| |
| |
| |
| <h2 id="Callbacks">Define Transition Lifecycle Callbacks</h2> |
| |
| <p>The transition lifecycle is similar to the activity lifecycle. It represents the transition |
| states that the framework monitors during the time between a call to the {@link |
| android.transition.TransitionManager#go TransitionManager.go()} method and the completion of |
| the animation. At important lifecycle states, the framework invokes callbacks defined by |
| the {@link android.transition.Transition.TransitionListener TransitionListener} |
| interface.</p> |
| |
| <p>Transition lifecycle callbacks are useful, for example, for copying a view property value |
| from the starting view hierarchy to the ending view hierarchy during a scene change. You |
| cannot simply copy the value from its starting view to the view in the ending view hierarchy, |
| because the ending view hierarchy is not inflated until the transition is completed. |
| Instead, you need to store the value in a variable and then copy it into the ending view |
| hierarchy when the framework has finished the transition. To get notified when the transition |
| is completed, you can implement the {@link |
| android.transition.Transition.TransitionListener#onTransitionEnd |
| TransitionListener.onTransitionEnd()} method in your activity.</p> |
| |
| <p>For more information, see the API reference for the {@link |
| android.transition.Transition.TransitionListener TransitionListener} class.</p> |