From 0602e9342620b6da0e2f6a11eacf578a148d19d9 Mon Sep 17 00:00:00 2001 From: Federico Baron Date: Mon, 26 Sep 2022 17:23:09 -0700 Subject: [PATCH] Fix the entry animation for delightful pagination in folders Here we fix the animation that was broken in earlier CL's for delightful pagination, now the page indicator has the same smooth entry animation as the dots Bug: 247561880 Test: manual Change-Id: I3e2099ba4f5ccfdbc9b4dfe5b48a1c44dbdeda1e --- .../pageindicators/PageIndicatorDots.java | 54 +++++++++++++------ 1 file changed, 38 insertions(+), 16 deletions(-) diff --git a/src/com/android/launcher3/pageindicators/PageIndicatorDots.java b/src/com/android/launcher3/pageindicators/PageIndicatorDots.java index 28e0b68b4c..b4cb0eef6e 100644 --- a/src/com/android/launcher3/pageindicators/PageIndicatorDots.java +++ b/src/com/android/launcher3/pageindicators/PageIndicatorDots.java @@ -153,6 +153,7 @@ public class PageIndicatorDots extends View implements PageIndicator { @Override public void setScroll(int currentScroll, int totalScroll) { if (mNumPages <= 1) { + mCurrentScroll = 0; return; } @@ -296,8 +297,12 @@ public class PageIndicatorDots extends View implements PageIndicator { for (int i = 0; i < mEntryAnimationRadiusFactors.length; i++) { mPaginationPaint.setAlpha(i == mActivePage ? PAGE_INDICATOR_ALPHA : DOT_ALPHA); if (SHOW_DELIGHTFUL_PAGINATION_FOLDER.get()) { - canvas.drawCircle(x, y, getRadius(x) * mEntryAnimationRadiusFactors[i], - mPaginationPaint); + if (i != mActivePage) { + canvas.drawCircle(x, y, mDotRadius * mEntryAnimationRadiusFactors[i], + mPaginationPaint); + } else { + drawPageIndicator(canvas, mEntryAnimationRadiusFactors[i]); + } } else { canvas.drawCircle(x, y, mDotRadius * mEntryAnimationRadiusFactors[i], mPaginationPaint); @@ -319,26 +324,43 @@ public class PageIndicatorDots extends View implements PageIndicator { // Here we draw the current page indicator mPaginationPaint.setAlpha(PAGE_INDICATOR_ALPHA); if (SHOW_DELIGHTFUL_PAGINATION_FOLDER.get()) { - RectF currRect = getActiveRect(); - - // Moves the canvas to start at the top left corner of the page indicator - canvas.translate(currRect.left, currRect.top); - - int scrollPerPage = getScrollPerPage(); - // This IF is to avoid division by 0 - if (scrollPerPage != 0) { - int delta = mCurrentScroll % scrollPerPage; - canvas.rotate((INDICATOR_ROTATION * delta) / scrollPerPage, - mPageIndicatorRadius, mPageIndicatorRadius); - } - - mPageIndicatorDrawable.draw(canvas); + drawPageIndicator(canvas, 1); } else { canvas.drawRoundRect(getActiveRect(), mDotRadius, mDotRadius, mPaginationPaint); } } } + /** + * Draws the page indicator, denoting the currently selected page + * + * @param canvas is used to draw the page indicator and to rotate it as we scroll + * @param scale is used to set the scale of our canvas + */ + private void drawPageIndicator(Canvas canvas, float scale) { + RectF currRect = getActiveRect(); + + // saves the canvas so we can later restore it to its original scale + canvas.save(); + + // Moves the canvas to start at the top left corner of the page indicator + canvas.translate(currRect.left, currRect.top); + + // Scales the canvas in place to animate the indicator on entry + canvas.scale(scale, scale, mPageIndicatorRadius, mPageIndicatorRadius); + + int scrollPerPage = getScrollPerPage(); + // This IF is to avoid division by 0 + if (scrollPerPage != 0) { + int delta = mCurrentScroll % scrollPerPage; + canvas.rotate((INDICATOR_ROTATION * delta) / scrollPerPage, + mPageIndicatorRadius, mPageIndicatorRadius); + } + + mPageIndicatorDrawable.draw(canvas); + canvas.restore(); + } + /** * Returns the radius of the circle based on how close the page indicator is to it *