diff options
| author | 2014-07-14 21:16:55 +0000 | |
|---|---|---|
| committer | 2014-07-14 18:38:08 +0000 | |
| commit | 2178cee06465e71d6a04c7ed1dbf6cb991964ec5 (patch) | |
| tree | 123d68a54aaa30b1c04a59d84981603e2cef2476 | |
| parent | 915fcd1075e9402012fb9ebdf7da31d128f32171 (diff) | |
| parent | c18f4cc0f2dfb05b22c6187c5c2c2dead4f504a5 (diff) | |
Merge "ActivityTransition: restore callee activity shared element position" into lmp-dev
| -rw-r--r-- | core/java/android/app/ActivityTransitionCoordinator.java | 75 | ||||
| -rw-r--r-- | core/java/android/app/EnterTransitionCoordinator.java | 4 |
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 |