diff options
Diffstat (limited to 'src/com/android/launcher3/PagedView.java')
-rw-r--r-- | src/com/android/launcher3/PagedView.java | 244 |
1 files changed, 71 insertions, 173 deletions
diff --git a/src/com/android/launcher3/PagedView.java b/src/com/android/launcher3/PagedView.java index 275195b71..81a842e35 100644 --- a/src/com/android/launcher3/PagedView.java +++ b/src/com/android/launcher3/PagedView.java @@ -192,18 +192,9 @@ public abstract class PagedView extends ViewGroup implements ViewGroup.OnHierarc protected boolean mAllowLongPress = true; - // Scrolling indicator - private ValueAnimator mScrollIndicatorAnimator; - private View mScrollIndicator; - private int mScrollIndicatorPaddingLeft; - private int mScrollIndicatorPaddingRight; - private boolean mHasScrollIndicator = true; - private boolean mShouldShowScrollIndicator = false; - private boolean mShouldShowScrollIndicatorImmediately = false; - protected static final int sScrollIndicatorFadeInDuration = 150; - protected static final int sScrollIndicatorFadeOutDuration = 650; - protected static final int sScrollIndicatorFlashDuration = 650; - private boolean mScrollingPaused = false; + // Page Indicator + private int mPageIndicatorViewId; + private PageIndicator mPageIndicator; // The viewport whether the pages are to be contained (the actual view may be larger than the // viewport) @@ -296,10 +287,7 @@ public abstract class PagedView extends ViewGroup implements ViewGroup.OnHierarc R.styleable.PagedView_pageLayoutWidthGap, 0); mPageLayoutHeightGap = a.getDimensionPixelSize( R.styleable.PagedView_pageLayoutHeightGap, 0); - mScrollIndicatorPaddingLeft = - a.getDimensionPixelSize(R.styleable.PagedView_scrollIndicatorPaddingLeft, 0); - mScrollIndicatorPaddingRight = - a.getDimensionPixelSize(R.styleable.PagedView_scrollIndicatorPaddingRight, 0); + mPageIndicatorViewId = a.getResourceId(R.styleable.PagedView_pageIndicator, -1); a.recycle(); setHapticFeedbackEnabled(false); @@ -332,6 +320,21 @@ public abstract class PagedView extends ViewGroup implements ViewGroup.OnHierarc setOnHierarchyChangeListener(this); } + protected void onAttachedToWindow() { + // Hook up the page indicator + ViewGroup parent = (ViewGroup) getParent(); + if (mPageIndicator == null && mPageIndicatorViewId > -1) { + mPageIndicator = (PageIndicator) parent.findViewById(mPageIndicatorViewId); + mPageIndicator.removeAllMarkers(); + mPageIndicator.addMarkers(getChildCount()); + } + } + + protected void onDetachedFromWindow() { + // Unhook the page indicator + mPageIndicator = null; + } + void setDeleteDropTarget(View v) { mDeleteDropTarget = v; } @@ -473,8 +476,6 @@ public abstract class PagedView extends ViewGroup implements ViewGroup.OnHierarc */ void pauseScrolling() { mScroller.forceFinished(true); - cancelScrollingIndicatorAnimations(); - mScrollingPaused = true; } /** @@ -482,7 +483,6 @@ public abstract class PagedView extends ViewGroup implements ViewGroup.OnHierarc * @see #pauseScrolling() */ void resumeScrolling() { - mScrollingPaused = false; } /** * Sets the current page. @@ -499,8 +499,6 @@ public abstract class PagedView extends ViewGroup implements ViewGroup.OnHierarc mForceScreenScrolled = true; mCurrentPage = Math.max(0, Math.min(currentPage, getPageCount() - 1)); - updateCurrentPageScroll(); - updateScrollingIndicator(); notifyPageSwitchListener(); invalidate(); } @@ -509,6 +507,11 @@ public abstract class PagedView extends ViewGroup implements ViewGroup.OnHierarc if (mPageSwitchListener != null) { mPageSwitchListener.onPageSwitch(getPageAt(mCurrentPage), mCurrentPage); } + + // Update the page indicator (when we aren't reordering) + if (mPageIndicator != null && !isReordering(false)) { + mPageIndicator.setActiveMarker(getNextPage()); + } } protected void pageBeginMoving() { if (!mIsPageMoving) { @@ -750,8 +753,6 @@ public abstract class PagedView extends ViewGroup implements ViewGroup.OnHierarc } } - updateScrollingIndicatorPosition(); - if (childCount > 0) { final int index = isLayoutRtl() ? 0 : childCount - 1; mMaxScrollX = getChildOffset(index) - getRelativeChildOffset(index); @@ -814,9 +815,6 @@ public abstract class PagedView extends ViewGroup implements ViewGroup.OnHierarc } protected void screenScrolled(int screenCenter) { - if (isScrollingIndicatorEnabled()) { - updateScrollingIndicator(); - } boolean isInOverscroll = mOverScrollX < 0 || mOverScrollX > mMaxScrollX; if (mFadeInAdjacentScreens && !isInOverscroll) { @@ -834,6 +832,12 @@ public abstract class PagedView extends ViewGroup implements ViewGroup.OnHierarc @Override public void onChildViewAdded(View parent, View child) { + // Update the page indicator, we don't update the page indicator as we + // add/remove pages + if (mPageIndicator != null && !isReordering(false)) { + mPageIndicator.addMarker(indexOfChild(child)); + } + // This ensures that when children are added, they get the correct transforms / alphas // in accordance with any scroll effects. mForceScreenScrolled = true; @@ -849,6 +853,46 @@ public abstract class PagedView extends ViewGroup implements ViewGroup.OnHierarc invalidateCachedOffsets(); } + private void removeMarkerForView(int index) { + // Update the page indicator, we don't update the page indicator as we + // add/remove pages + if (mPageIndicator != null && !isReordering(false)) { + mPageIndicator.removeMarker(index); + } + } + + @Override + public void removeView(View v) { + // XXX: We should find a better way to hook into this before the view + // gets removed form its parent... + removeMarkerForView(indexOfChild(v)); + super.removeView(v); + } + @Override + public void removeViewInLayout(View v) { + // XXX: We should find a better way to hook into this before the view + // gets removed form its parent... + removeMarkerForView(indexOfChild(v)); + super.removeViewInLayout(v); + } + @Override + public void removeViewAt(int index) { + // XXX: We should find a better way to hook into this before the view + // gets removed form its parent... + removeViewAt(index); + super.removeViewAt(index); + } + @Override + public void removeAllViewsInLayout() { + // Update the page indicator, we don't update the page indicator as we + // add/remove pages + if (mPageIndicator != null) { + mPageIndicator.removeAllMarkers(); + } + + super.removeAllViewsInLayout(); + } + protected void invalidateCachedOffsets() { int count = getChildCount(); if (count == 0) { @@ -1605,6 +1649,7 @@ public abstract class PagedView extends ViewGroup implements ViewGroup.OnHierarc addView(mDragView, pageUnderPointIndex); onAddView(mDragView, pageUnderPointIndex); mSidePageHoverIndex = -1; + mPageIndicator.setActiveMarker(getNextPage()); } }; postDelayed(mSidePageHoverRunnable, REORDERING_SIDE_PAGE_HOVER_TIMEOUT); @@ -2172,153 +2217,6 @@ public abstract class PagedView extends ViewGroup implements ViewGroup.OnHierarc } } - protected View getScrollingIndicator() { - // We use mHasScrollIndicator to prevent future lookups if there is no sibling indicator - // found - if (mHasScrollIndicator && mScrollIndicator == null) { - ViewGroup parent = (ViewGroup) getParent(); - if (parent != null) { - mScrollIndicator = (View) (parent.findViewById(R.id.paged_view_indicator)); - mHasScrollIndicator = mScrollIndicator != null; - if (mHasScrollIndicator) { - mScrollIndicator.setVisibility(View.VISIBLE); - } - } - } - return mScrollIndicator; - } - - protected boolean isScrollingIndicatorEnabled() { - return true; - } - - Runnable hideScrollingIndicatorRunnable = new Runnable() { - @Override - public void run() { - hideScrollingIndicator(false); - } - }; - - protected void flashScrollingIndicator(boolean animated) { - removeCallbacks(hideScrollingIndicatorRunnable); - showScrollingIndicator(!animated); - postDelayed(hideScrollingIndicatorRunnable, sScrollIndicatorFlashDuration); - } - - protected void showScrollingIndicator(boolean immediately) { - mShouldShowScrollIndicator = true; - mShouldShowScrollIndicatorImmediately = true; - if (getChildCount() <= 1) return; - if (!isScrollingIndicatorEnabled()) return; - - mShouldShowScrollIndicator = false; - getScrollingIndicator(); - if (mScrollIndicator != null) { - // Fade the indicator in - updateScrollingIndicatorPosition(); - mScrollIndicator.setVisibility(View.VISIBLE); - cancelScrollingIndicatorAnimations(); - if (immediately) { - mScrollIndicator.setAlpha(1f); - } else { - mScrollIndicatorAnimator = ObjectAnimator.ofFloat(mScrollIndicator, "alpha", 1f); - mScrollIndicatorAnimator.setDuration(sScrollIndicatorFadeInDuration); - mScrollIndicatorAnimator.start(); - } - } - } - - protected void cancelScrollingIndicatorAnimations() { - if (mScrollIndicatorAnimator != null) { - mScrollIndicatorAnimator.cancel(); - } - } - - protected void hideScrollingIndicator(boolean immediately) { - if (getChildCount() <= 1) return; - if (!isScrollingIndicatorEnabled()) return; - - getScrollingIndicator(); - if (mScrollIndicator != null) { - // Fade the indicator out - updateScrollingIndicatorPosition(); - cancelScrollingIndicatorAnimations(); - if (immediately) { - mScrollIndicator.setVisibility(View.INVISIBLE); - mScrollIndicator.setAlpha(0f); - } else { - mScrollIndicatorAnimator = ObjectAnimator.ofFloat(mScrollIndicator, "alpha", 0f); - mScrollIndicatorAnimator.setDuration(sScrollIndicatorFadeOutDuration); - mScrollIndicatorAnimator.addListener(new AnimatorListenerAdapter() { - private boolean cancelled = false; - @Override - public void onAnimationCancel(android.animation.Animator animation) { - cancelled = true; - } - @Override - public void onAnimationEnd(Animator animation) { - if (!cancelled) { - mScrollIndicator.setVisibility(View.INVISIBLE); - } - } - }); - mScrollIndicatorAnimator.start(); - } - } - } - - /** - * To be overridden by subclasses to determine whether the scroll indicator should stretch to - * fill its space on the track or not. - */ - protected boolean hasElasticScrollIndicator() { - return true; - } - - private void updateScrollingIndicator() { - if (getChildCount() <= 1) return; - if (!isScrollingIndicatorEnabled()) return; - - getScrollingIndicator(); - if (mScrollIndicator != null) { - updateScrollingIndicatorPosition(); - } - if (mShouldShowScrollIndicator) { - showScrollingIndicator(mShouldShowScrollIndicatorImmediately); - } - } - - private void updateScrollingIndicatorPosition() { - final boolean isRtl = isLayoutRtl(); - if (!isScrollingIndicatorEnabled()) return; - if (mScrollIndicator == null) return; - int numPages = getChildCount(); - int pageWidth = getViewportWidth(); - int lastChildIndex = Math.max(0, getChildCount() - 1); - int maxScrollX = getChildOffset(lastChildIndex) - getRelativeChildOffset(lastChildIndex); - int trackWidth = pageWidth - mScrollIndicatorPaddingLeft - mScrollIndicatorPaddingRight; - int indicatorWidth = mScrollIndicator.getMeasuredWidth() - - mScrollIndicator.getPaddingLeft() - mScrollIndicator.getPaddingRight(); - - float scrollPos = isRtl ? mMaxScrollX - getScrollX() : getScrollX(); - float offset = Math.max(0f, Math.min(1f, (float) scrollPos / mMaxScrollX)); - if (isRtl) { - offset = 1f - offset; - } - int indicatorSpace = trackWidth / numPages; - int indicatorPos = (int) (offset * (trackWidth - indicatorSpace)) + mScrollIndicatorPaddingLeft; - if (hasElasticScrollIndicator()) { - if (mScrollIndicator.getMeasuredWidth() != indicatorSpace) { - mScrollIndicator.getLayoutParams().width = indicatorSpace; - mScrollIndicator.requestLayout(); - } - } else { - int indicatorCenterOffset = indicatorSpace / 2 - indicatorWidth / 2; - indicatorPos += indicatorCenterOffset; - } - mScrollIndicator.setTranslationX(indicatorPos); - } - // Animate the drag view back to the original position void animateDragViewToOriginalPosition() { if (mDragView != null) { |