diff options
author | Adam Cohen <adamcohen@google.com> | 2011-11-01 12:45:07 -0700 |
---|---|---|
committer | Android (Google) Code Review <android-gerrit@google.com> | 2011-11-01 12:45:07 -0700 |
commit | 55f57c49cf333a6015befe38131ef8a78a091171 (patch) | |
tree | f502c864a809cdbf49715e0ae6b206a1296be9fc | |
parent | 32f491c9dfc21ad92fef28fce45dcee6ba036593 (diff) | |
parent | 73894964c27f68a3a7ffb45bfba76520613fd3f0 (diff) | |
download | packages_apps_trebuchet-55f57c49cf333a6015befe38131ef8a78a091171.zip packages_apps_trebuchet-55f57c49cf333a6015befe38131ef8a78a091171.tar.gz packages_apps_trebuchet-55f57c49cf333a6015befe38131ef8a78a091171.tar.bz2 |
Merge "Launcher performance optimizations: shaving about 3ms off Workspace.dispatchDraw()" into ics-mr1
-rw-r--r-- | src/com/android/launcher2/AppsCustomizePagedView.java | 2 | ||||
-rw-r--r-- | src/com/android/launcher2/PagedView.java | 193 | ||||
-rw-r--r-- | src/com/android/launcher2/Workspace.java | 22 |
3 files changed, 93 insertions, 124 deletions
diff --git a/src/com/android/launcher2/AppsCustomizePagedView.java b/src/com/android/launcher2/AppsCustomizePagedView.java index d90e39d..9000049 100644 --- a/src/com/android/launcher2/AppsCustomizePagedView.java +++ b/src/com/android/launcher2/AppsCustomizePagedView.java @@ -1152,8 +1152,6 @@ public class AppsCustomizePagedView extends PagedViewWithDraggableItems implemen layout.createHardwareLayer(); invalidate(); - forceUpdateAdjacentPagesAlpha(); - /* TEMPORARILY DISABLE HOLOGRAPHIC ICONS if (mFadeInAdjacentScreens) { prepareGenerateHoloOutlinesTask(data.page, data.items, data.generatedImages); diff --git a/src/com/android/launcher2/PagedView.java b/src/com/android/launcher2/PagedView.java index 9b3a339..d8a8bb2 100644 --- a/src/com/android/launcher2/PagedView.java +++ b/src/com/android/launcher2/PagedView.java @@ -94,6 +94,9 @@ public abstract class PagedView extends ViewGroup { protected float mLastMotionY; protected float mTotalMotionX; private int mLastScreenCenter = -1; + private int[] mChildOffsets; + private int[] mChildRelativeOffsets; + private int[] mChildOffsetsWithLayoutScale; protected final static int TOUCH_STATE_REST = 0; protected final static int TOUCH_STATE_SCROLLING = 1; @@ -135,7 +138,6 @@ public abstract class PagedView extends ViewGroup { private PageSwitchListener mPageSwitchListener; private ArrayList<Boolean> mDirtyPageContent; - private boolean mDirtyPageAlpha = true; // choice modes protected static final int CHOICE_MODE_NONE = 0; @@ -386,13 +388,11 @@ public abstract class PagedView extends ViewGroup { if (mScroller.computeScrollOffset()) { // Don't bother scrolling if the page does not need to be moved if (mScrollX != mScroller.getCurrX() || mScrollY != mScroller.getCurrY()) { - mDirtyPageAlpha = true; scrollTo(mScroller.getCurrX(), mScroller.getCurrY()); } invalidate(); return true; } else if (mNextPage != INVALID_PAGE) { - mDirtyPageAlpha = true; mCurrentPage = Math.max(0, Math.min(mNextPage, getPageCount() - 1)); mNextPage = INVALID_PAGE; notifyPageSwitchListener(); @@ -519,6 +519,7 @@ public abstract class PagedView extends ViewGroup { // tightens the layout accordingly public void setLayoutScale(float childrenScale) { mLayoutScale = childrenScale; + invalidateCachedOffsets(); // Now we need to do a re-layout, but preserving absolute X and Y coordinates int childCount = getChildCount(); @@ -596,82 +597,27 @@ public abstract class PagedView extends ViewGroup { if (mFirstLayout && mCurrentPage >= 0 && mCurrentPage < getChildCount()) { mFirstLayout = false; } + invalidateCachedOffsets(); } - protected void forceUpdateAdjacentPagesAlpha() { - mDirtyPageAlpha = true; - updateAdjacentPagesAlpha(); - } - - protected void updateAdjacentPagesAlpha() { + protected void screenScrolled(int screenCenter) { + if (isScrollingIndicatorEnabled()) { + updateScrollingIndicator(); + } if (mFadeInAdjacentScreens) { - if (mDirtyPageAlpha || (mTouchState == TOUCH_STATE_SCROLLING) || !mScroller.isFinished()) { - int screenWidth = getMeasuredWidth() - mPaddingLeft - mPaddingRight; - int halfScreenSize = screenWidth / 2; - int screenCenter = mScrollX + halfScreenSize + mPaddingLeft; - final int childCount = getChildCount(); - for (int i = 0; i < childCount; ++i) { - View layout = (View) getPageAt(i); - int childWidth = getScaledMeasuredWidth(layout); - int halfChildWidth = (childWidth / 2); - int childCenter = getChildOffset(i) + halfChildWidth; - - // On the first layout, we may not have a width nor a proper offset, so for now - // we should just assume full page width (and calculate the offset according to - // that). - if (childWidth <= 0) { - childWidth = screenWidth; - childCenter = (i * childWidth) + (childWidth / 2); - } - - int d = halfChildWidth; - int distanceFromScreenCenter = childCenter - screenCenter; - if (distanceFromScreenCenter > 0) { - if (i > 0) { - d += getScaledMeasuredWidth(getPageAt(i - 1)) / 2; - } else { - continue; - } - } else { - if (i < childCount - 1) { - d += getScaledMeasuredWidth(getPageAt(i + 1)) / 2; - } else { - continue; - } - } - d += mPageSpacing; - - // Preventing potential divide-by-zero - d = Math.max(1, d); - - float dimAlpha = (float) (Math.abs(distanceFromScreenCenter)) / d; - dimAlpha = Math.max(0.0f, Math.min(1.0f, (dimAlpha * dimAlpha))); - float alpha = 1.0f - dimAlpha; - - if (alpha < ALPHA_QUANTIZE_LEVEL) { - alpha = 0.0f; - } else if (alpha > 1.0f - ALPHA_QUANTIZE_LEVEL) { - alpha = 1.0f; - } - - // Due to the way we're setting alpha on our children in PagedViewCellLayout, - // this optimization causes alpha to not be properly updated sometimes (repro - // case: in xlarge mode, swipe to second page in All Apps, then click on "My - // Apps" tab. the page will have alpha 0 until you swipe it). Removing - // optimization fixes the issue, but we should fix this in a better manner - //if (Float.compare(alpha, layout.getAlpha()) != 0) { - layout.setAlpha(alpha); - //} + for (int i = 0; i < getChildCount(); i++) { + View child = getChildAt(i); + if (child != null) { + float scrollProgress = getScrollProgress(screenCenter, child, i); + float alpha = 1 - Math.abs(scrollProgress); + child.setFastAlpha(alpha); + child.fastInvalidate(); } - mDirtyPageAlpha = false; } + invalidate(); } } - protected void screenScrolled(int screenCenter) { - updateScrollingIndicator(); - } - @Override protected void onViewAdded(View child) { super.onViewAdded(child); @@ -682,6 +628,71 @@ public abstract class PagedView extends ViewGroup { invalidate(); } + protected void invalidateCachedOffsets() { + int count = getChildCount(); + if (count == 0) return; + + mChildOffsets = new int[count]; + mChildRelativeOffsets = new int[count]; + mChildOffsetsWithLayoutScale = new int[count]; + for (int i = 0; i < count; i++) { + mChildOffsets[i] = -1; + mChildRelativeOffsets[i] = -1; + mChildOffsetsWithLayoutScale[i] = -1; + } + } + + protected int getChildOffset(int index) { + int[] childOffsets = Float.compare(mLayoutScale, 1f) == 0 ? + mChildOffsets : mChildOffsetsWithLayoutScale; + + if (childOffsets != null && childOffsets[index] != -1) { + return childOffsets[index]; + } else { + if (getChildCount() == 0) + return 0; + + int offset = getRelativeChildOffset(0); + for (int i = 0; i < index; ++i) { + offset += getScaledMeasuredWidth(getPageAt(i)) + mPageSpacing; + } + if (childOffsets != null) { + childOffsets[index] = offset; + } + return offset; + } + } + + protected int getRelativeChildOffset(int index) { + if (mChildRelativeOffsets != null && mChildRelativeOffsets[index] != -1) { + return mChildRelativeOffsets[index]; + } else { + final int padding = mPaddingLeft + mPaddingRight; + final int offset = mPaddingLeft + + (getMeasuredWidth() - padding - getChildWidth(index)) / 2; + if (mChildRelativeOffsets != null) { + mChildRelativeOffsets[index] = offset; + } + return offset; + } + } + + protected int getScaledRelativeChildOffset(int index) { + final int padding = mPaddingLeft + mPaddingRight; + final int offset = mPaddingLeft + (getMeasuredWidth() - padding - + getScaledMeasuredWidth(getPageAt(index))) / 2; + return offset; + } + + protected int getScaledMeasuredWidth(View child) { + // This functions are called enough times that it actually makes a difference in the + // profiler -- so just inline the max() here + final int measuredWidth = child.getMeasuredWidth(); + final int minWidth = mMinimumWidth; + final int maxWidth = (minWidth > measuredWidth) ? minWidth : measuredWidth; + return (int) (maxWidth * mLayoutScale + 0.5f); + } + @Override protected void dispatchDraw(Canvas canvas) { int halfScreenSize = getMeasuredWidth() / 2; @@ -689,7 +700,6 @@ public abstract class PagedView extends ViewGroup { if (screenCenter != mLastScreenCenter || mForceScreenScrolled) { screenScrolled(screenCenter); - updateAdjacentPagesAlpha(); mLastScreenCenter = screenCenter; mForceScreenScrolled = false; } @@ -1322,13 +1332,6 @@ public abstract class PagedView extends ViewGroup { return -1; } - protected void setMinimumWidthOverride(int minimumWidth) { - mMinimumWidth = minimumWidth; - } - protected void resetMinimumWidthOverride() { - mMinimumWidth = 0; - } - protected int getChildWidth(int index) { // This functions are called enough times that it actually makes a difference in the // profiler -- so just inline the max() here @@ -1337,36 +1340,6 @@ public abstract class PagedView extends ViewGroup { return (minWidth > measuredWidth) ? minWidth : measuredWidth; } - protected int getRelativeChildOffset(int index) { - int padding = mPaddingLeft + mPaddingRight; - return mPaddingLeft + (getMeasuredWidth() - padding - getChildWidth(index)) / 2; - } - protected int getScaledRelativeChildOffset(int index) { - int padding = mPaddingLeft + mPaddingRight; - return mPaddingLeft + (getMeasuredWidth() - padding - - getScaledMeasuredWidth(getPageAt(index))) / 2; - } - - protected int getChildOffset(int index) { - if (getChildCount() == 0) - return 0; - - int offset = getRelativeChildOffset(0); - for (int i = 0; i < index; ++i) { - offset += getScaledMeasuredWidth(getPageAt(i)) + mPageSpacing; - } - return offset; - } - - protected int getScaledMeasuredWidth(View child) { - // This functions are called enough times that it actually makes a difference in the - // profiler -- so just inline the max() here - final int measuredWidth = child.getMeasuredWidth(); - final int minWidth = mMinimumWidth; - final int maxWidth = (minWidth > measuredWidth) ? minWidth : measuredWidth; - return (int) (maxWidth * mLayoutScale + 0.5f); - } - int getPageNearestToCenterOfScreen() { int minDistanceFromScreenCenter = Integer.MAX_VALUE; int minDistanceFromScreenCenterIndex = -1; @@ -1726,8 +1699,6 @@ public abstract class PagedView extends ViewGroup { // Load any pages that are necessary for the current window of views loadAssociatedPages(mCurrentPage, immediateAndOnly); - mDirtyPageAlpha = true; - updateAdjacentPagesAlpha(); requestLayout(); } } diff --git a/src/com/android/launcher2/Workspace.java b/src/com/android/launcher2/Workspace.java index 5daa05e..a6ba98e 100644 --- a/src/com/android/launcher2/Workspace.java +++ b/src/com/android/launcher2/Workspace.java @@ -1120,10 +1120,16 @@ public class Workspace extends SmoothPagedView backgroundAlphaInterpolator(Math.abs(scrollProgress))); } } - cl.setTranslationX(translationX); - cl.setRotationY(rotation); + cl.setFastTranslationX(translationX); + cl.setFastRotationY(rotation); + if (mFadeInAdjacentScreens && !isSmall()) { + float alpha = 1 - Math.abs(scrollProgress); + cl.setFastAlpha(alpha); + } + cl.fastInvalidate(); } } + invalidate(); } private void resetCellLayoutTransforms(CellLayout cl, boolean left) { @@ -1157,10 +1163,12 @@ public class Workspace extends SmoothPagedView @Override protected void screenScrolled(int screenCenter) { - super.screenScrolled(screenCenter); if (LauncherApplication.isScreenLarge()) { + // We don't call super.screenScrolled() here because we handle the adjacent pages alpha + // ourselves (for efficiency), and there are no scrolling indicators to update. screenScrolledLargeUI(screenCenter); } else { + super.screenScrolled(screenCenter); screenScrolledStandardUI(screenCenter); } } @@ -1348,13 +1356,6 @@ public class Workspace extends SmoothPagedView position[0], position[1], 0, null); } - @Override - protected void updateAdjacentPagesAlpha() { - if (!isSmall()) { - super.updateAdjacentPagesAlpha(); - } - } - /* * This interpolator emulates the rate at which the perceived scale of an object changes * as its distance from a camera increases. When this interpolator is applied to a scale @@ -1517,7 +1518,6 @@ public class Workspace extends SmoothPagedView final State oldState = mState; final boolean oldStateIsNormal = (oldState == State.NORMAL); - final boolean oldStateIsSpringLoaded = (oldState == State.SPRING_LOADED); final boolean oldStateIsSmall = (oldState == State.SMALL); mState = state; final boolean stateIsNormal = (state == State.NORMAL); |