Loading core/java/android/widget/StackView.java +55 −37 Original line number Diff line number Diff line Loading @@ -22,6 +22,7 @@ import android.content.Context; import android.graphics.Bitmap; import android.graphics.BlurMaskFilter; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Matrix; import android.graphics.Paint; import android.graphics.PorterDuff; Loading Loading @@ -52,14 +53,17 @@ public class StackView extends AdapterViewAnimator { * Default animation parameters */ private static final int DEFAULT_ANIMATION_DURATION = 400; private static final int FADE_IN_ANIMATION_DURATION = 800; private static final int MINIMUM_ANIMATION_DURATION = 50; /** * Parameters effecting the perspective visuals */ private static float PERSPECTIVE_SHIFT_FACTOR = 0.12f; private static final float PERSPECTIVE_SHIFT_FACTOR_Y = 0.1f; private static final float PERSPECTIVE_SHIFT_FACTOR_X = 0.1f; @SuppressWarnings({"FieldCanBeLocal"}) private static float PERSPECTIVE_SCALE_FACTOR = 0.35f; private static final float PERSPECTIVE_SCALE_FACTOR = 0.f; /** * Represent the two possible stack modes, one where items slide up, and the other Loading Loading @@ -184,7 +188,7 @@ public class StackView extends AdapterViewAnimator { * Animate the views between different relative indexes within the {@link AdapterViewAnimator} */ void animateViewForTransition(int fromIndex, int toIndex, View view) { if (fromIndex == -1 && toIndex != 0) { if (fromIndex == -1 && toIndex > 0) { // Fade item in if (view.getAlpha() == 1) { view.setAlpha(0); Loading @@ -192,7 +196,7 @@ public class StackView extends AdapterViewAnimator { view.setVisibility(VISIBLE); ObjectAnimator fadeIn = ObjectAnimator.ofFloat(view, "alpha", view.getAlpha(), 1.0f); fadeIn.setDuration(DEFAULT_ANIMATION_DURATION); fadeIn.setDuration(FADE_IN_ANIMATION_DURATION); fadeIn.start(); } else if (fromIndex == 0 && toIndex == 1) { // Slide item in Loading Loading @@ -239,12 +243,46 @@ public class StackView extends AdapterViewAnimator { } } private void transformViewAtIndex(int index, View view) { float maxPerspectiveShiftY = getMeasuredHeight() * PERSPECTIVE_SHIFT_FACTOR_Y; float maxPerspectiveShiftX = getMeasuredHeight() * PERSPECTIVE_SHIFT_FACTOR_X; index = mMaxNumActiveViews - index - 1; if (index == mMaxNumActiveViews - 1) index--; float r = (index * 1.0f) / (mMaxNumActiveViews - 2); float scale = 1 - PERSPECTIVE_SCALE_FACTOR * (1 - r); PropertyValuesHolder scalePropX = PropertyValuesHolder.ofFloat("scaleX", scale); PropertyValuesHolder scalePropY = PropertyValuesHolder.ofFloat("scaleY", scale); int stackDirection = (mStackMode == ITEMS_SLIDE_UP) ? 1 : -1; float perspectiveTranslationY = -stackDirection * r * maxPerspectiveShiftY; float scaleShiftCorrectionY = stackDirection * (1 - scale) * (getMeasuredHeight() * (1 - PERSPECTIVE_SHIFT_FACTOR_Y) / 2.0f); float transY = perspectiveTranslationY + scaleShiftCorrectionY; float perspectiveTranslationX = (1 - r) * maxPerspectiveShiftX; float scaleShiftCorrectionX = (1 - scale) * (getMeasuredWidth() * (1 - PERSPECTIVE_SHIFT_FACTOR_X) / 2.0f); float transX = perspectiveTranslationX + scaleShiftCorrectionX; PropertyValuesHolder translationX = PropertyValuesHolder.ofFloat("translationX", transX); PropertyValuesHolder translationY = PropertyValuesHolder.ofFloat("translationY", transY); ObjectAnimator pa = ObjectAnimator.ofPropertyValuesHolder(view, scalePropX, scalePropY, translationY, translationX); pa.setDuration(100); pa.start(); } private void setupStackSlider(View v, int mode) { mStackSlider.setMode(mode); if (v != null) { mHighlight.setImageBitmap(sHolographicHelper.createOutline(v)); mHighlight.setRotation(v.getRotation()); mHighlight.setTranslationY(v.getTranslationY()); mHighlight.setTranslationX(v.getTranslationX()); mHighlight.bringToFront(); v.bringToFront(); mStackSlider.setView(v); Loading Loading @@ -283,32 +321,6 @@ public class StackView extends AdapterViewAnimator { super.showPrevious(); } private void transformViewAtIndex(int index, View view) { float maxPerpectiveShift = getMeasuredHeight() * PERSPECTIVE_SHIFT_FACTOR; index = mMaxNumActiveViews - index - 1; if (index == mMaxNumActiveViews - 1) index--; float r = (index * 1.0f) / (mMaxNumActiveViews - 2); float scale = 1 - PERSPECTIVE_SCALE_FACTOR * (1 - r); PropertyValuesHolder scaleX = PropertyValuesHolder.ofFloat("scaleX", scale); PropertyValuesHolder scaleY = PropertyValuesHolder.ofFloat("scaleY", scale); r = (float) Math.pow(r, 2); int stackDirection = (mStackMode == ITEMS_SLIDE_UP) ? 1 : -1; float perspectiveTranslation = -stackDirection * r * maxPerpectiveShift; float scaleShiftCorrection = stackDirection * (1 - scale) * (getMeasuredHeight() * (1 - PERSPECTIVE_SHIFT_FACTOR) / 2.0f); float transY = perspectiveTranslation + scaleShiftCorrection; PropertyValuesHolder translationY = PropertyValuesHolder.ofFloat("translationY", transY); ObjectAnimator pa = ObjectAnimator.ofPropertyValuesHolder(view, scaleX, scaleY, translationY); pa.setDuration(100); pa.start(); } @Override void showOnly(int childIndex, boolean animate, boolean onLayout) { super.showOnly(childIndex, animate, onLayout); Loading Loading @@ -910,8 +922,9 @@ public class StackView extends AdapterViewAnimator { private void measureChildren() { final int count = getChildCount(); final int childWidth = getMeasuredWidth() - mPaddingLeft - mPaddingRight; final int childHeight = Math.round(getMeasuredHeight()*(1-PERSPECTIVE_SHIFT_FACTOR)) final int childWidth = Math.round(getMeasuredWidth()*(1-PERSPECTIVE_SHIFT_FACTOR_X)) - mPaddingLeft - mPaddingRight; final int childHeight = Math.round(getMeasuredHeight()*(1-PERSPECTIVE_SHIFT_FACTOR_Y)) - mPaddingTop - mPaddingBottom; for (int i = 0; i < count; i++) { Loading @@ -932,14 +945,14 @@ public class StackView extends AdapterViewAnimator { // We need to deal with the case where our parent hasn't told us how // big we should be. In this case we should float factor = 1/(1 - PERSPECTIVE_SHIFT_FACTOR); float factorY = 1/(1 - PERSPECTIVE_SHIFT_FACTOR_Y); if (heightSpecMode == MeasureSpec.UNSPECIFIED) { heightSpecSize = haveChildRefSize ? Math.round(mReferenceChildHeight * (1 + factor)) + Math.round(mReferenceChildHeight * (1 + factorY)) + mPaddingTop + mPaddingBottom : 0; } else if (heightSpecMode == MeasureSpec.AT_MOST) { if (haveChildRefSize) { int height = Math.round(mReferenceChildHeight * (1 + factor)) int height = Math.round(mReferenceChildHeight * (1 + factorY)) + mPaddingTop + mPaddingBottom; if (height <= heightSpecSize) { heightSpecSize = height; Loading @@ -951,9 +964,11 @@ public class StackView extends AdapterViewAnimator { } } float factorX = 1/(1 - PERSPECTIVE_SHIFT_FACTOR_X); if (widthSpecMode == MeasureSpec.UNSPECIFIED) { widthSpecSize = haveChildRefSize ? mReferenceChildWidth + mPaddingLeft + mPaddingRight : 0; widthSpecSize = haveChildRefSize ? Math.round(mReferenceChildWidth * (1 + factorX)) + mPaddingLeft + mPaddingRight : 0; } else if (heightSpecMode == MeasureSpec.AT_MOST) { if (haveChildRefSize) { int width = mReferenceChildWidth + mPaddingLeft + mPaddingRight; Loading Loading @@ -1122,13 +1137,16 @@ public class StackView extends AdapterViewAnimator { float rotationX = v.getRotationX(); float rotation = v.getRotation(); float translationY = v.getTranslationY(); float translationX = v.getTranslationX(); v.setRotationX(0); v.setRotation(0); v.setTranslationY(0); v.setTranslationX(0); v.draw(mCanvas); v.setRotationX(rotationX); v.setRotation(rotation); v.setTranslationY(translationY); v.setTranslationX(translationX); drawOutline(mCanvas, bitmap); return bitmap; Loading Loading
core/java/android/widget/StackView.java +55 −37 Original line number Diff line number Diff line Loading @@ -22,6 +22,7 @@ import android.content.Context; import android.graphics.Bitmap; import android.graphics.BlurMaskFilter; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Matrix; import android.graphics.Paint; import android.graphics.PorterDuff; Loading Loading @@ -52,14 +53,17 @@ public class StackView extends AdapterViewAnimator { * Default animation parameters */ private static final int DEFAULT_ANIMATION_DURATION = 400; private static final int FADE_IN_ANIMATION_DURATION = 800; private static final int MINIMUM_ANIMATION_DURATION = 50; /** * Parameters effecting the perspective visuals */ private static float PERSPECTIVE_SHIFT_FACTOR = 0.12f; private static final float PERSPECTIVE_SHIFT_FACTOR_Y = 0.1f; private static final float PERSPECTIVE_SHIFT_FACTOR_X = 0.1f; @SuppressWarnings({"FieldCanBeLocal"}) private static float PERSPECTIVE_SCALE_FACTOR = 0.35f; private static final float PERSPECTIVE_SCALE_FACTOR = 0.f; /** * Represent the two possible stack modes, one where items slide up, and the other Loading Loading @@ -184,7 +188,7 @@ public class StackView extends AdapterViewAnimator { * Animate the views between different relative indexes within the {@link AdapterViewAnimator} */ void animateViewForTransition(int fromIndex, int toIndex, View view) { if (fromIndex == -1 && toIndex != 0) { if (fromIndex == -1 && toIndex > 0) { // Fade item in if (view.getAlpha() == 1) { view.setAlpha(0); Loading @@ -192,7 +196,7 @@ public class StackView extends AdapterViewAnimator { view.setVisibility(VISIBLE); ObjectAnimator fadeIn = ObjectAnimator.ofFloat(view, "alpha", view.getAlpha(), 1.0f); fadeIn.setDuration(DEFAULT_ANIMATION_DURATION); fadeIn.setDuration(FADE_IN_ANIMATION_DURATION); fadeIn.start(); } else if (fromIndex == 0 && toIndex == 1) { // Slide item in Loading Loading @@ -239,12 +243,46 @@ public class StackView extends AdapterViewAnimator { } } private void transformViewAtIndex(int index, View view) { float maxPerspectiveShiftY = getMeasuredHeight() * PERSPECTIVE_SHIFT_FACTOR_Y; float maxPerspectiveShiftX = getMeasuredHeight() * PERSPECTIVE_SHIFT_FACTOR_X; index = mMaxNumActiveViews - index - 1; if (index == mMaxNumActiveViews - 1) index--; float r = (index * 1.0f) / (mMaxNumActiveViews - 2); float scale = 1 - PERSPECTIVE_SCALE_FACTOR * (1 - r); PropertyValuesHolder scalePropX = PropertyValuesHolder.ofFloat("scaleX", scale); PropertyValuesHolder scalePropY = PropertyValuesHolder.ofFloat("scaleY", scale); int stackDirection = (mStackMode == ITEMS_SLIDE_UP) ? 1 : -1; float perspectiveTranslationY = -stackDirection * r * maxPerspectiveShiftY; float scaleShiftCorrectionY = stackDirection * (1 - scale) * (getMeasuredHeight() * (1 - PERSPECTIVE_SHIFT_FACTOR_Y) / 2.0f); float transY = perspectiveTranslationY + scaleShiftCorrectionY; float perspectiveTranslationX = (1 - r) * maxPerspectiveShiftX; float scaleShiftCorrectionX = (1 - scale) * (getMeasuredWidth() * (1 - PERSPECTIVE_SHIFT_FACTOR_X) / 2.0f); float transX = perspectiveTranslationX + scaleShiftCorrectionX; PropertyValuesHolder translationX = PropertyValuesHolder.ofFloat("translationX", transX); PropertyValuesHolder translationY = PropertyValuesHolder.ofFloat("translationY", transY); ObjectAnimator pa = ObjectAnimator.ofPropertyValuesHolder(view, scalePropX, scalePropY, translationY, translationX); pa.setDuration(100); pa.start(); } private void setupStackSlider(View v, int mode) { mStackSlider.setMode(mode); if (v != null) { mHighlight.setImageBitmap(sHolographicHelper.createOutline(v)); mHighlight.setRotation(v.getRotation()); mHighlight.setTranslationY(v.getTranslationY()); mHighlight.setTranslationX(v.getTranslationX()); mHighlight.bringToFront(); v.bringToFront(); mStackSlider.setView(v); Loading Loading @@ -283,32 +321,6 @@ public class StackView extends AdapterViewAnimator { super.showPrevious(); } private void transformViewAtIndex(int index, View view) { float maxPerpectiveShift = getMeasuredHeight() * PERSPECTIVE_SHIFT_FACTOR; index = mMaxNumActiveViews - index - 1; if (index == mMaxNumActiveViews - 1) index--; float r = (index * 1.0f) / (mMaxNumActiveViews - 2); float scale = 1 - PERSPECTIVE_SCALE_FACTOR * (1 - r); PropertyValuesHolder scaleX = PropertyValuesHolder.ofFloat("scaleX", scale); PropertyValuesHolder scaleY = PropertyValuesHolder.ofFloat("scaleY", scale); r = (float) Math.pow(r, 2); int stackDirection = (mStackMode == ITEMS_SLIDE_UP) ? 1 : -1; float perspectiveTranslation = -stackDirection * r * maxPerpectiveShift; float scaleShiftCorrection = stackDirection * (1 - scale) * (getMeasuredHeight() * (1 - PERSPECTIVE_SHIFT_FACTOR) / 2.0f); float transY = perspectiveTranslation + scaleShiftCorrection; PropertyValuesHolder translationY = PropertyValuesHolder.ofFloat("translationY", transY); ObjectAnimator pa = ObjectAnimator.ofPropertyValuesHolder(view, scaleX, scaleY, translationY); pa.setDuration(100); pa.start(); } @Override void showOnly(int childIndex, boolean animate, boolean onLayout) { super.showOnly(childIndex, animate, onLayout); Loading Loading @@ -910,8 +922,9 @@ public class StackView extends AdapterViewAnimator { private void measureChildren() { final int count = getChildCount(); final int childWidth = getMeasuredWidth() - mPaddingLeft - mPaddingRight; final int childHeight = Math.round(getMeasuredHeight()*(1-PERSPECTIVE_SHIFT_FACTOR)) final int childWidth = Math.round(getMeasuredWidth()*(1-PERSPECTIVE_SHIFT_FACTOR_X)) - mPaddingLeft - mPaddingRight; final int childHeight = Math.round(getMeasuredHeight()*(1-PERSPECTIVE_SHIFT_FACTOR_Y)) - mPaddingTop - mPaddingBottom; for (int i = 0; i < count; i++) { Loading @@ -932,14 +945,14 @@ public class StackView extends AdapterViewAnimator { // We need to deal with the case where our parent hasn't told us how // big we should be. In this case we should float factor = 1/(1 - PERSPECTIVE_SHIFT_FACTOR); float factorY = 1/(1 - PERSPECTIVE_SHIFT_FACTOR_Y); if (heightSpecMode == MeasureSpec.UNSPECIFIED) { heightSpecSize = haveChildRefSize ? Math.round(mReferenceChildHeight * (1 + factor)) + Math.round(mReferenceChildHeight * (1 + factorY)) + mPaddingTop + mPaddingBottom : 0; } else if (heightSpecMode == MeasureSpec.AT_MOST) { if (haveChildRefSize) { int height = Math.round(mReferenceChildHeight * (1 + factor)) int height = Math.round(mReferenceChildHeight * (1 + factorY)) + mPaddingTop + mPaddingBottom; if (height <= heightSpecSize) { heightSpecSize = height; Loading @@ -951,9 +964,11 @@ public class StackView extends AdapterViewAnimator { } } float factorX = 1/(1 - PERSPECTIVE_SHIFT_FACTOR_X); if (widthSpecMode == MeasureSpec.UNSPECIFIED) { widthSpecSize = haveChildRefSize ? mReferenceChildWidth + mPaddingLeft + mPaddingRight : 0; widthSpecSize = haveChildRefSize ? Math.round(mReferenceChildWidth * (1 + factorX)) + mPaddingLeft + mPaddingRight : 0; } else if (heightSpecMode == MeasureSpec.AT_MOST) { if (haveChildRefSize) { int width = mReferenceChildWidth + mPaddingLeft + mPaddingRight; Loading Loading @@ -1122,13 +1137,16 @@ public class StackView extends AdapterViewAnimator { float rotationX = v.getRotationX(); float rotation = v.getRotation(); float translationY = v.getTranslationY(); float translationX = v.getTranslationX(); v.setRotationX(0); v.setRotation(0); v.setTranslationY(0); v.setTranslationX(0); v.draw(mCanvas); v.setRotationX(rotationX); v.setRotation(rotation); v.setTranslationY(translationY); v.setTranslationX(translationX); drawOutline(mCanvas, bitmap); return bitmap; Loading