summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Dake Gu <dake@google.com> 2014-07-14 21:16:55 +0000
committer Android (Google) Code Review <android-gerrit@google.com> 2014-07-14 18:38:08 +0000
commit2178cee06465e71d6a04c7ed1dbf6cb991964ec5 (patch)
tree123d68a54aaa30b1c04a59d84981603e2cef2476
parent915fcd1075e9402012fb9ebdf7da31d128f32171 (diff)
parentc18f4cc0f2dfb05b22c6187c5c2c2dead4f504a5 (diff)
Merge "ActivityTransition: restore callee activity shared element position" into lmp-dev
-rw-r--r--core/java/android/app/ActivityTransitionCoordinator.java75
-rw-r--r--core/java/android/app/EnterTransitionCoordinator.java4
2 files changed, 53 insertions, 26 deletions
diff --git a/core/java/android/app/ActivityTransitionCoordinator.java b/core/java/android/app/ActivityTransitionCoordinator.java
index 15be9b18289b..e07421983f1b 100644
--- a/core/java/android/app/ActivityTransitionCoordinator.java
+++ b/core/java/android/app/ActivityTransitionCoordinator.java
@@ -403,20 +403,18 @@ abstract class ActivityTransitionCoordinator extends ResultReceiver {
view.layout(left, top, right, bottom);
}
- protected ArrayMap<ImageView, Pair<ImageView.ScaleType, Matrix>> setSharedElementState(
+ protected ArrayList<SharedElementOriginalState> setSharedElementState(
Bundle sharedElementState, final ArrayList<View> snapshots) {
- ArrayMap<ImageView, Pair<ImageView.ScaleType, Matrix>> originalImageState =
- new ArrayMap<ImageView, Pair<ImageView.ScaleType, Matrix>>();
+ ArrayList<SharedElementOriginalState> originalImageState =
+ new ArrayList<SharedElementOriginalState>();
if (sharedElementState != null) {
int[] tempLoc = new int[2];
for (int i = 0; i < mSharedElementNames.size(); i++) {
View sharedElement = mSharedElements.get(i);
String name = mSharedElementNames.get(i);
- Pair<ImageView.ScaleType, Matrix> originalState = getOldImageState(sharedElement,
+ SharedElementOriginalState originalState = getOldSharedElementState(sharedElement,
name, sharedElementState);
- if (originalState != null) {
- originalImageState.put((ImageView) sharedElement, originalState);
- }
+ originalImageState.add(originalState);
View parent = (View) sharedElement.getParent();
parent.getLocationOnScreen(tempLoc);
setSharedElementState(sharedElement, name, sharedElementState, tempLoc);
@@ -438,29 +436,34 @@ abstract class ActivityTransitionCoordinator extends ResultReceiver {
return originalImageState;
}
- private static Pair<ImageView.ScaleType, Matrix> getOldImageState(View view, String name,
+ private static SharedElementOriginalState getOldSharedElementState(View view, String name,
Bundle transitionArgs) {
+
+ SharedElementOriginalState state = new SharedElementOriginalState();
+ state.mLeft = view.getLeft();
+ state.mTop = view.getTop();
+ state.mRight = view.getRight();
+ state.mBottom = view.getBottom();
+ state.mMeasuredWidth = view.getMeasuredWidth();
+ state.mMeasuredHeight = view.getMeasuredHeight();
if (!(view instanceof ImageView)) {
- return null;
+ return state;
}
Bundle bundle = transitionArgs.getBundle(name);
if (bundle == null) {
- return null;
+ return state;
}
int scaleTypeInt = bundle.getInt(KEY_SCALE_TYPE, -1);
if (scaleTypeInt < 0) {
- return null;
+ return state;
}
ImageView imageView = (ImageView) view;
- ImageView.ScaleType originalScaleType = imageView.getScaleType();
-
- Matrix originalMatrix = null;
- if (originalScaleType == ImageView.ScaleType.MATRIX) {
- originalMatrix = new Matrix(imageView.getImageMatrix());
+ state.mScaleType = imageView.getScaleType();
+ if (state.mScaleType == ImageView.ScaleType.MATRIX) {
+ state.mMatrix = new Matrix(imageView.getImageMatrix());
}
-
- return Pair.create(originalScaleType, originalMatrix);
+ return state;
}
protected ArrayList<View> createSnapshots(Bundle state, Collection<String> names) {
@@ -489,13 +492,26 @@ abstract class ActivityTransitionCoordinator extends ResultReceiver {
return snapshots;
}
- protected static void setOriginalImageViewState(
- ArrayMap<ImageView, Pair<ImageView.ScaleType, Matrix>> originalState) {
+ protected static void setOriginalSharedElementState(ArrayList<View> sharedElements,
+ ArrayList<SharedElementOriginalState> originalState) {
for (int i = 0; i < originalState.size(); i++) {
- ImageView imageView = originalState.keyAt(i);
- Pair<ImageView.ScaleType, Matrix> state = originalState.valueAt(i);
- imageView.setScaleType(state.first);
- imageView.setImageMatrix(state.second);
+ View view = sharedElements.get(i);
+ SharedElementOriginalState state = originalState.get(i);
+ if (view instanceof ImageView && state.mScaleType != null) {
+ ImageView imageView = (ImageView) view;
+ imageView.setScaleType(state.mScaleType);
+ if (state.mScaleType == ImageView.ScaleType.MATRIX) {
+ imageView.setImageMatrix(state.mMatrix);
+ }
+ }
+ // origignal widthspec might be AT_MOST, but it should work for most
+ // cases.
+ int widthSpec = View.MeasureSpec.makeMeasureSpec(state.mMeasuredWidth,
+ View.MeasureSpec.EXACTLY);
+ int heightSpec = View.MeasureSpec.makeMeasureSpec(state.mMeasuredHeight,
+ View.MeasureSpec.EXACTLY);
+ view.measure(widthSpec, heightSpec);
+ view.layout(state.mLeft, state.mTop, state.mRight, state.mBottom);
}
}
@@ -622,4 +638,15 @@ abstract class ActivityTransitionCoordinator extends ResultReceiver {
}
}
+ static class SharedElementOriginalState {
+ int mLeft;
+ int mTop;
+ int mRight;
+ int mBottom;
+ int mMeasuredWidth;
+ int mMeasuredHeight;
+ ImageView.ScaleType mScaleType;
+ Matrix mMatrix;
+ }
+
}
diff --git a/core/java/android/app/EnterTransitionCoordinator.java b/core/java/android/app/EnterTransitionCoordinator.java
index f50c93b3cc0e..132606434100 100644
--- a/core/java/android/app/EnterTransitionCoordinator.java
+++ b/core/java/android/app/EnterTransitionCoordinator.java
@@ -282,7 +282,7 @@ class EnterTransitionCoordinator extends ActivityTransitionCoordinator {
ArrayList<View> sharedElementSnapshots = createSnapshots(sharedElementState,
mSharedElementNames);
setTransitionAlpha(mSharedElements, 1);
- ArrayMap<ImageView, Pair<ImageView.ScaleType, Matrix>> originalImageViewState =
+ ArrayList<SharedElementOriginalState> originalImageViewState =
setSharedElementState(sharedElementState, sharedElementSnapshots);
requestLayoutForSharedElements();
@@ -294,7 +294,7 @@ class EnterTransitionCoordinator extends ActivityTransitionCoordinator {
startEnterTransition(transition);
}
- setOriginalImageViewState(originalImageViewState);
+ setOriginalSharedElementState(mSharedElements, originalImageViewState);
if (mResultReceiver != null) {
// We can't trust that the view will disappear on the same frame that the shared