summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--api/current.txt6
-rw-r--r--core/java/android/view/transition/Crossfade.java36
-rw-r--r--core/java/android/view/transition/TextChange.java119
-rw-r--r--core/java/android/view/transition/Transition.java16
-rw-r--r--core/java/android/view/transition/TransitionManager.java9
-rw-r--r--tests/TransitionTests/AndroidManifest.xml7
-rw-r--r--tests/TransitionTests/res/drawable-nodpi/self_portrait_square_400.jpgbin0 -> 34679 bytes
-rw-r--r--tests/TransitionTests/res/layout/crossfade_multiple.xml84
-rw-r--r--tests/TransitionTests/res/values/strings.xml8
-rw-r--r--tests/TransitionTests/src/com/android/transitiontests/CrossfadeMultiple.java139
10 files changed, 397 insertions, 27 deletions
diff --git a/api/current.txt b/api/current.txt
index a5f05faf4987..14983f7ea0e2 100644
--- a/api/current.txt
+++ b/api/current.txt
@@ -28856,6 +28856,7 @@ package android.view.transition {
method public void setFadeBehavior(int);
method public void setResizeBehavior(int);
field public static final int FADE_BEHAVIOR_CROSSFADE = 0; // 0x0
+ field public static final int FADE_BEHAVIOR_OUT_IN = 2; // 0x2
field public static final int FADE_BEHAVIOR_REVEAL = 1; // 0x1
field public static final int RESIZE_BEHAVIOR_NONE = 0; // 0x0
field public static final int RESIZE_BEHAVIOR_SCALE = 1; // 0x1
@@ -28903,6 +28904,11 @@ package android.view.transition {
public class TextChange extends android.view.transition.Transition {
ctor public TextChange();
method protected void captureValues(android.view.transition.TransitionValues, boolean);
+ method public void setChangeBehavior(int);
+ field public static final int CHANGE_BEHAVIOR_IN = 2; // 0x2
+ field public static final int CHANGE_BEHAVIOR_KEEP = 0; // 0x0
+ field public static final int CHANGE_BEHAVIOR_OUT = 1; // 0x1
+ field public static final int CHANGE_BEHAVIOR_OUT_IN = 3; // 0x3
}
public abstract class Transition implements java.lang.Cloneable {
diff --git a/core/java/android/view/transition/Crossfade.java b/core/java/android/view/transition/Crossfade.java
index 7cfba7087b2d..18bb57fb4dd0 100644
--- a/core/java/android/view/transition/Crossfade.java
+++ b/core/java/android/view/transition/Crossfade.java
@@ -24,6 +24,7 @@ import android.animation.RectEvaluator;
import android.animation.ValueAnimator;
import android.graphics.Bitmap;
import android.graphics.Canvas;
+import android.graphics.Color;
import android.graphics.Rect;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
@@ -79,6 +80,15 @@ public class Crossfade extends Transition {
* @see #setFadeBehavior(int)
*/
public static final int FADE_BEHAVIOR_REVEAL = 1;
+ /**
+ * Flag specifying that the fading animation should first fade
+ * out the original representation completely and then fade in the
+ * new one. This effect may be more suitable than the other
+ * fade behaviors for views with.
+ *
+ * @see #setFadeBehavior(int)
+ */
+ public static final int FADE_BEHAVIOR_OUT_IN = 2;
/**
* Flag specifying that the transition should not animate any
@@ -112,7 +122,7 @@ public class Crossfade extends Transition {
* transition is run.
*/
public void setFadeBehavior(int fadeBehavior) {
- if (fadeBehavior >= FADE_BEHAVIOR_CROSSFADE && fadeBehavior <= FADE_BEHAVIOR_REVEAL) {
+ if (fadeBehavior >= FADE_BEHAVIOR_CROSSFADE && fadeBehavior <= FADE_BEHAVIOR_OUT_IN) {
mFadeBehavior = fadeBehavior;
}
}
@@ -145,6 +155,7 @@ public class Crossfade extends Transition {
if (startValues == null || endValues == null) {
return null;
}
+ final boolean useParentOverlay = mFadeBehavior != FADE_BEHAVIOR_REVEAL;
final View view = endValues.view;
Map<String, Object> startVals = startValues.values;
Map<String, Object> endVals = endValues.values;
@@ -159,8 +170,8 @@ public class Crossfade extends Transition {
" for start, end: " + startBitmap + ", " + endBitmap);
}
if (startDrawable != null && endDrawable != null && !startBitmap.sameAs(endBitmap)) {
- ViewOverlay overlay = (mFadeBehavior == FADE_BEHAVIOR_REVEAL) ?
- view.getOverlay() : ((ViewGroup) view.getParent()).getOverlay();
+ ViewOverlay overlay = useParentOverlay ?
+ ((ViewGroup) view.getParent()).getOverlay() : view.getOverlay();
if (mFadeBehavior == FADE_BEHAVIOR_REVEAL) {
overlay.add(endDrawable);
}
@@ -169,7 +180,13 @@ public class Crossfade extends Transition {
// gradually fading out the start drawable. So it's not really a cross-fade, but rather
// a reveal of the end scene over time. Also, animate the bounds of both drawables
// to mimic the change in the size of the view itself between scenes.
- ObjectAnimator anim = ObjectAnimator.ofInt(startDrawable, "alpha", 0);
+ ObjectAnimator anim;
+ if (mFadeBehavior == FADE_BEHAVIOR_OUT_IN) {
+ // Fade out completely halfway through the transition
+ anim = ObjectAnimator.ofInt(startDrawable, "alpha", 255, 0, 0);
+ } else {
+ anim = ObjectAnimator.ofInt(startDrawable, "alpha", 0);
+ }
anim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
@@ -178,7 +195,10 @@ public class Crossfade extends Transition {
}
});
ObjectAnimator anim1 = null;
- if (mFadeBehavior == FADE_BEHAVIOR_CROSSFADE) {
+ if (mFadeBehavior == FADE_BEHAVIOR_OUT_IN) {
+ // start fading in halfway through the transition
+ anim1 = ObjectAnimator.ofFloat(view, View.ALPHA, 0, 0, 1);
+ } else if (mFadeBehavior == FADE_BEHAVIOR_CROSSFADE) {
anim1 = ObjectAnimator.ofFloat(view, View.ALPHA, 0, 1);
}
if (Transition.DBG) {
@@ -188,8 +208,8 @@ public class Crossfade extends Transition {
anim.addListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
- ViewOverlay overlay = (mFadeBehavior == FADE_BEHAVIOR_REVEAL) ?
- view.getOverlay() : ((ViewGroup) view.getParent()).getOverlay();
+ ViewOverlay overlay = useParentOverlay ?
+ ((ViewGroup) view.getParent()).getOverlay() : view.getOverlay();
overlay.remove(startDrawable);
if (mFadeBehavior == FADE_BEHAVIOR_REVEAL) {
overlay.remove(endDrawable);
@@ -227,7 +247,7 @@ public class Crossfade extends Transition {
protected void captureValues(TransitionValues values, boolean start) {
View view = values.view;
Rect bounds = new Rect(0, 0, view.getWidth(), view.getHeight());
- if (mFadeBehavior == FADE_BEHAVIOR_CROSSFADE) {
+ if (mFadeBehavior != FADE_BEHAVIOR_REVEAL) {
bounds.offset(view.getLeft(), view.getTop());
}
values.values.put(PROPNAME_BOUNDS, bounds);
diff --git a/core/java/android/view/transition/TextChange.java b/core/java/android/view/transition/TextChange.java
index f033e633b30c..04ff70700340 100644
--- a/core/java/android/view/transition/TextChange.java
+++ b/core/java/android/view/transition/TextChange.java
@@ -18,7 +18,9 @@ package android.view.transition;
import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
+import android.animation.AnimatorSet;
import android.animation.ValueAnimator;
+import android.graphics.Color;
import android.util.ArrayMap;
import android.view.ViewGroup;
import android.widget.TextView;
@@ -34,15 +36,69 @@ import java.util.Map;
*/
public class TextChange extends Transition {
private static final String PROPNAME_TEXT = "android:textchange:text";
+ private static final String PROPNAME_TEXT_COLOR = "android:textchange:textColor";
- // TODO: think about other options we could have here, like cross-fading the text, or fading
- // it out/in. These could be parameters to supply to the constructors (and xml attributes).
+ private int mChangeBehavior = CHANGE_BEHAVIOR_KEEP;
+
+ /**
+ * Flag specifying that the text in affected/changing TextView targets will keep
+ * their original text during the transition, setting it to the final text when
+ * the transition ends. This is the default behavior.
+ *
+ * @see #setChangeBehavior(int)
+ */
+ public static final int CHANGE_BEHAVIOR_KEEP = 0;
+ /**
+ * Flag specifying that the text changing animation should first fade
+ * out the original text completely. The new text is set on the target
+ * view at the end of the fade-out animation. This transition is typically
+ * used with a later {@link #CHANGE_BEHAVIOR_IN} transition, allowing more
+ * flexibility than the {@link #CHANGE_BEHAVIOR_OUT_IN} by allowing other
+ * transitions to be run sequentially or in parallel with these fades.
+ *
+ * @see #setChangeBehavior(int)
+ */
+ public static final int CHANGE_BEHAVIOR_OUT = 1;
+ /**
+ * Flag specifying that the text changing animation should fade in the
+ * end text into the affected target view(s). This transition is typically
+ * used in conjunction with an earlier {@link #CHANGE_BEHAVIOR_OUT}
+ * transition, possibly with other transitions running as well, such as
+ * a sequence to fade out, then resize the view, then fade in.
+ *
+ * @see #setChangeBehavior(int)
+ */
+ public static final int CHANGE_BEHAVIOR_IN = 2;
+ /**
+ * Flag specifying that the text changing animation should first fade
+ * out the original text completely and then fade in the
+ * new text.
+ *
+ * @see #setChangeBehavior(int)
+ */
+ public static final int CHANGE_BEHAVIOR_OUT_IN = 3;
+
+ /**
+ * Sets the type of changing animation that will be run, one of
+ * {@link #CHANGE_BEHAVIOR_KEEP} and {@link #CHANGE_BEHAVIOR_OUT_IN}.
+ *
+ * @param changeBehavior The type of fading animation to use when this
+ * transition is run.
+ */
+ public void setChangeBehavior(int changeBehavior) {
+ if (changeBehavior >= CHANGE_BEHAVIOR_KEEP && changeBehavior <= CHANGE_BEHAVIOR_OUT_IN) {
+ mChangeBehavior = changeBehavior;
+ }
+ }
@Override
protected void captureValues(TransitionValues values, boolean start) {
if (values.view instanceof TextView) {
TextView textview = (TextView) values.view;
values.values.put(PROPNAME_TEXT, textview.getText());
+ if (mChangeBehavior > CHANGE_BEHAVIOR_KEEP) {
+ values.values.put(PROPNAME_TEXT_COLOR, textview.getCurrentTextColor());
+ }
}
}
@@ -59,13 +115,60 @@ public class TextChange extends Transition {
final String endText = (String) endVals.get(PROPNAME_TEXT);
if (!startText.equals(endText)) {
view.setText(startText);
- ValueAnimator anim = ValueAnimator.ofFloat(0, 1);
- anim.addListener(new AnimatorListenerAdapter() {
- @Override
- public void onAnimationEnd(Animator animation) {
- view.setText(endText);
+ Animator anim;
+ if (mChangeBehavior == CHANGE_BEHAVIOR_KEEP) {
+ anim = ValueAnimator.ofFloat(0, 1);
+ anim.addListener(new AnimatorListenerAdapter() {
+ @Override
+ public void onAnimationEnd(Animator animation) {
+ view.setText(endText);
+ }
+ });
+ } else {
+ // Fade out start text
+ final int startColor = (Integer) startVals.get(PROPNAME_TEXT_COLOR);
+ final int endColor = (Integer) endVals.get(PROPNAME_TEXT_COLOR);
+ ValueAnimator outAnim = null, inAnim = null;
+ if (mChangeBehavior == CHANGE_BEHAVIOR_OUT_IN ||
+ mChangeBehavior == CHANGE_BEHAVIOR_OUT) {
+ outAnim = ValueAnimator.ofInt(255, 0);
+ outAnim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
+ @Override
+ public void onAnimationUpdate(ValueAnimator animation) {
+ int currAlpha = (Integer) animation.getAnimatedValue();
+ view.setTextColor(currAlpha << 24 | Color.red(startColor) << 16 |
+ Color.green(startColor) << 8 | Color.red(startColor));
+ }
+ });
+ outAnim.addListener(new AnimatorListenerAdapter() {
+ @Override
+ public void onAnimationEnd(Animator animation) {
+ view.setText(endText);
+ }
+ });
+ }
+ if (mChangeBehavior == CHANGE_BEHAVIOR_OUT_IN ||
+ mChangeBehavior == CHANGE_BEHAVIOR_IN) {
+ inAnim = ValueAnimator.ofInt(0, 255);
+ inAnim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
+ @Override
+ public void onAnimationUpdate(ValueAnimator animation) {
+ int currAlpha = (Integer) animation.getAnimatedValue();
+ view.setTextColor(currAlpha << 24 | Color.red(endColor) << 16 |
+ Color.green(endColor) << 8 | Color.red(endColor));
+ }
+ });
+ }
+ if (outAnim != null && inAnim != null) {
+ anim = new AnimatorSet();
+ ((AnimatorSet) anim).playSequentially(outAnim, inAnim);
+ } else if (outAnim != null) {
+ anim = outAnim;
+ } else {
+ // Must be an in-only animation
+ anim = inAnim;
}
- });
+ }
return anim;
}
return null;
diff --git a/core/java/android/view/transition/Transition.java b/core/java/android/view/transition/Transition.java
index 2cffd268940a..6d5e61ab8209 100644
--- a/core/java/android/view/transition/Transition.java
+++ b/core/java/android/view/transition/Transition.java
@@ -509,6 +509,15 @@ public abstract class Transition implements Cloneable {
* false otherwise
*/
void captureValues(ViewGroup sceneRoot, boolean start) {
+ if (start) {
+ mStartValues.viewValues.clear();
+ mStartValues.idValues.clear();
+ mStartValues.itemIdValues.clear();
+ } else {
+ mEndValues.viewValues.clear();
+ mEndValues.idValues.clear();
+ mEndValues.itemIdValues.clear();
+ }
if (mTargetIds != null && mTargetIds.length > 0 ||
mTargets != null && mTargets.length > 0) {
if (mTargetIds != null) {
@@ -774,13 +783,6 @@ public abstract class Transition implements Cloneable {
v.setHasTransientState(false);
}
}
- mStartValues.viewValues.clear();
- mStartValues.idValues.clear();
- mStartValues.itemIdValues.clear();
- mEndValues.viewValues.clear();
- mEndValues.idValues.clear();
- mEndValues.itemIdValues.clear();
- mCurrentAnimators.clear();
}
}
diff --git a/core/java/android/view/transition/TransitionManager.java b/core/java/android/view/transition/TransitionManager.java
index 59b07b196e2f..b200a6d5f117 100644
--- a/core/java/android/view/transition/TransitionManager.java
+++ b/core/java/android/view/transition/TransitionManager.java
@@ -182,16 +182,17 @@ public class TransitionManager {
private static void sceneChangeSetup(ViewGroup sceneRoot, Transition transition) {
+ // Capture current values
Transition runningTransition = sRunningTransitions.get(sceneRoot);
- if (runningTransition != null) {
- runningTransition.cancelTransition();
- }
- // Capture current values
if (transition != null) {
transition.captureValues(sceneRoot, true);
}
+ if (runningTransition != null) {
+ runningTransition.cancelTransition();
+ }
+
// Notify previous scene that it is being exited
Scene previousScene = sceneRoot.getCurrentScene();
if (previousScene != null) {
diff --git a/tests/TransitionTests/AndroidManifest.xml b/tests/TransitionTests/AndroidManifest.xml
index 9a399d044af6..35e7b6979b7e 100644
--- a/tests/TransitionTests/AndroidManifest.xml
+++ b/tests/TransitionTests/AndroidManifest.xml
@@ -240,6 +240,13 @@
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
+ <activity android:label="CrossfadeMultiple"
+ android:name=".CrossfadeMultiple">
+ <intent-filter>
+ <action android:name="android.intent.action.MAIN" />
+ <category android:name="android.intent.category.LAUNCHER" />
+ </intent-filter>
+ </activity>
</application>
diff --git a/tests/TransitionTests/res/drawable-nodpi/self_portrait_square_400.jpg b/tests/TransitionTests/res/drawable-nodpi/self_portrait_square_400.jpg
new file mode 100644
index 000000000000..3923fd1bb900
--- /dev/null
+++ b/tests/TransitionTests/res/drawable-nodpi/self_portrait_square_400.jpg
Binary files differ
diff --git a/tests/TransitionTests/res/layout/crossfade_multiple.xml b/tests/TransitionTests/res/layout/crossfade_multiple.xml
new file mode 100644
index 000000000000..ca32ecbe29fd
--- /dev/null
+++ b/tests/TransitionTests/res/layout/crossfade_multiple.xml
@@ -0,0 +1,84 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:orientation="vertical"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent">
+
+ <RadioGroup android:orientation="horizontal"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content">
+ <RadioButton android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:onClick="changeTransitionType"
+ android:id="@+id/reveal"
+ android:text="@string/reveal"/>
+ <RadioButton android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:onClick="changeTransitionType"
+ android:id="@+id/crossfade"
+ android:text="@string/crossfade"/>
+ <RadioButton android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:onClick="changeTransitionType"
+ android:id="@+id/inout"
+ android:text="@string/inout"/>
+ <RadioButton android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:onClick="changeTransitionType"
+ android:id="@+id/textfade1"
+ android:text="@string/textfade1"/>
+ <RadioButton android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:onClick="changeTransitionType"
+ android:id="@+id/textfade2"
+ android:text="@string/textfade2"/>
+ </RadioGroup>
+ <LinearLayout android:orientation="horizontal"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content">
+ <Button
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:onClick="sendMessage"
+ android:text="@string/state1"
+ android:id="@+id/button1"/>
+ <Button
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:onClick="sendMessage"
+ android:text="@string/state2"
+ android:id="@+id/button2"/>
+ <Button
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:onClick="sendMessage"
+ android:text="@string/state3"
+ android:id="@+id/button3"/>
+ </LinearLayout>
+
+ <LinearLayout android:orientation="vertical"
+ android:id="@+id/container"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent">
+ <Button
+ android:layout_width="100dip"
+ android:layout_height="100dip"
+ android:textSize="40dip"
+ android:text="@string/a"
+ android:id="@+id/button"/>
+ <TextView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:textSize="40dip"
+ android:text="@string/state1"
+ android:id="@+id/textview"/>
+ <ImageView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:src="@drawable/self_portrait_square_100"
+ android:onClick="sendMessage"
+ android:id="@+id/imageview"/>
+ </LinearLayout>
+
+</LinearLayout> \ No newline at end of file
diff --git a/tests/TransitionTests/res/values/strings.xml b/tests/TransitionTests/res/values/strings.xml
index 9b80a265e1ad..9cf7a94ec4c5 100644
--- a/tests/TransitionTests/res/values/strings.xml
+++ b/tests/TransitionTests/res/values/strings.xml
@@ -49,4 +49,12 @@
<string name="button3">Button 3</string>
<string name="button4">Button 4</string>
<string name="button5">Button 5</string>
+ <string name="a">A</string>
+ <string name="b">B</string>
+ <string name="c">C</string>
+ <string name="reveal">Reveal</string>
+ <string name="crossfade">Crossfade</string>
+ <string name="inout">In/Out</string>
+ <string name="textfade1">T1</string>
+ <string name="textfade2">T2</string>
</resources>
diff --git a/tests/TransitionTests/src/com/android/transitiontests/CrossfadeMultiple.java b/tests/TransitionTests/src/com/android/transitiontests/CrossfadeMultiple.java
new file mode 100644
index 000000000000..b82dbd8b831a
--- /dev/null
+++ b/tests/TransitionTests/src/com/android/transitiontests/CrossfadeMultiple.java
@@ -0,0 +1,139 @@
+/*
+ * Copyright (C) 2013 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.transitiontests;
+
+import android.app.Activity;
+import android.os.Bundle;
+import android.view.View;
+import android.view.ViewGroup;
+import android.view.transition.Crossfade;
+import android.view.transition.Move;
+import android.view.transition.TextChange;
+import android.view.transition.Transition;
+import android.view.transition.TransitionGroup;
+import android.view.transition.TransitionManager;
+import android.widget.Button;
+import android.widget.ImageView;
+import android.widget.TextView;
+
+import static android.widget.LinearLayout.LayoutParams;
+
+public class CrossfadeMultiple extends Activity {
+ ViewGroup mSceneRoot;
+ static int mCurrentScene;
+ TransitionManager mTransitionManager;
+ Transition mTransition;
+ ImageView mImageView;
+ TextView mTextView;
+ Button mButton;
+ Crossfade mCrossfade;
+ TransitionGroup mCrossfadeGroup;
+ TransitionGroup mTextChangeGroup1, mTextChangeGroup2;
+ TransitionGroup mInOutGroup;
+
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.crossfade_multiple);
+
+ ViewGroup container = (ViewGroup) findViewById(R.id.container);
+ mSceneRoot = container;
+
+ mButton = (Button) findViewById(R.id.button);
+ mImageView = (ImageView) findViewById(R.id.imageview);
+ mTextView = (TextView) findViewById(R.id.textview);
+
+ mCrossfade = new Crossfade();
+ mCrossfade.setTargetIds(R.id.button, R.id.textview, R.id.imageview);
+
+ mCrossfadeGroup = new TransitionGroup();
+ mCrossfadeGroup.setDuration(300);
+ mCrossfadeGroup.addTransitions(mCrossfade, new Move());
+ mTransition = mCrossfadeGroup;
+
+ mInOutGroup = new TransitionGroup();
+ Crossfade inOut = new Crossfade();
+ inOut.setDuration(300);
+ inOut.setFadeBehavior(Crossfade.FADE_BEHAVIOR_OUT_IN);
+ Move move = new Move();
+ move.setStartDelay(150);
+ move.setDuration(0);
+ mInOutGroup.addTransitions(inOut, move);
+
+ mTextChangeGroup1 = new TransitionGroup();
+ TextChange textChangeInOut = new TextChange();
+ textChangeInOut.setChangeBehavior(TextChange.CHANGE_BEHAVIOR_OUT_IN);
+ mTextChangeGroup1.addTransitions(textChangeInOut, new Move());
+
+ mTextChangeGroup2 = new TransitionGroup();
+ mTextChangeGroup2.setOrdering(TransitionGroup.SEQUENTIALLY);
+ TextChange textChangeOut = new TextChange();
+ textChangeOut.setChangeBehavior(TextChange.CHANGE_BEHAVIOR_OUT);
+ TextChange textChangeIn = new TextChange();
+ textChangeIn.setChangeBehavior(TextChange.CHANGE_BEHAVIOR_IN);
+ mTextChangeGroup2.addTransitions(textChangeOut, new Move(), textChangeIn);
+ }
+
+ public void sendMessage(View view) {
+ TransitionManager.beginDelayedTransition(mSceneRoot, mTransition);
+ int id = view.getId();
+ LayoutParams params = null;
+ switch (id) {
+ case R.id.button1:
+ params = new LayoutParams(200, 200);
+ mButton.setText("A");
+ mTextView.setText("1111111");
+ mImageView.setImageResource(R.drawable.self_portrait_square_100);
+ break;
+ case R.id.button2:
+ params = new LayoutParams(400, 200);
+ mButton.setText("B");
+ mTextView.setText("2222222");
+ mImageView.setImageResource(R.drawable.self_portrait_square_200);
+ break;
+ case R.id.button3:
+ params = new LayoutParams(200, 400);
+ mButton.setText("C");
+ mTextView.setText("3333333");
+ mImageView.setImageResource(R.drawable.self_portrait_square_400);
+ break;
+ }
+ mButton.setLayoutParams(params);
+ }
+
+ public void changeTransitionType(View view) {
+ int id = view.getId();
+ switch (id) {
+ case R.id.reveal:
+ mCrossfade.setFadeBehavior(Crossfade.FADE_BEHAVIOR_REVEAL);
+ mTransition = mCrossfadeGroup;
+ break;
+ case R.id.crossfade:
+ mCrossfade.setFadeBehavior(Crossfade.FADE_BEHAVIOR_CROSSFADE);
+ mTransition = mCrossfadeGroup;
+ break;
+ case R.id.inout:
+ mTransition = mInOutGroup;
+ break;
+ case R.id.textfade1:
+ mTransition = mTextChangeGroup1;
+ break;
+ case R.id.textfade2:
+ mTransition = mTextChangeGroup2;
+ break;
+ }
+ }
+}