diff options
| author | Adam Cohen <adamcohen@google.com> | 2010-10-24 11:12:18 -0700 |
|---|---|---|
| committer | Adam Cohen <adamcohen@google.com> | 2010-10-24 14:15:14 -0700 |
| commit | 96d8d56302da81b24333b204e6d7f15064538036 (patch) | |
| tree | c53512978e1c8159192fd424e696869310a90f7e /core | |
| parent | a8cbdb9a9ccb4cd6409be6caa47f810f1c2b6f4b (diff) | |
| download | frameworks_base-96d8d56302da81b24333b204e6d7f15064538036.zip frameworks_base-96d8d56302da81b24333b204e6d7f15064538036.tar.gz frameworks_base-96d8d56302da81b24333b204e6d7f15064538036.tar.bz2 | |
Fixing the case of less than or equal to 5 items in StackView
Change-Id: I9226fe8343902e06e2f4b04837e232f1744786a8
Diffstat (limited to 'core')
| -rw-r--r-- | core/java/android/widget/AdapterViewAnimator.java | 65 | ||||
| -rw-r--r-- | core/java/android/widget/StackView.java | 64 |
2 files changed, 74 insertions, 55 deletions
diff --git a/core/java/android/widget/AdapterViewAnimator.java b/core/java/android/widget/AdapterViewAnimator.java index 87453ae..bb2e26c3 100644 --- a/core/java/android/widget/AdapterViewAnimator.java +++ b/core/java/android/widget/AdapterViewAnimator.java @@ -69,12 +69,12 @@ public abstract class AdapterViewAnimator extends AdapterView<Adapter> * The number of views that the {@link AdapterViewAnimator} keeps as children at any * given time (not counting views that are pending removal, see {@link #mPreviousViews}). */ - int mNumActiveViews = 1; + int mMaxNumActiveViews = 1; /** * Map of the children of the {@link AdapterViewAnimator}. */ - private HashMap<Integer, ViewAndIndex> mViewsMap = new HashMap<Integer, ViewAndIndex>(); + HashMap<Integer, ViewAndIndex> mViewsMap = new HashMap<Integer, ViewAndIndex>(); /** * List of views pending removal from the {@link AdapterViewAnimator} @@ -141,8 +141,6 @@ public abstract class AdapterViewAnimator extends AdapterView<Adapter> ObjectAnimator mInAnimation; ObjectAnimator mOutAnimation; - private ArrayList<View> mViewsToBringToFront; - private static final int DEFAULT_ANIMATION_DURATION = 200; public AdapterViewAnimator(Context context) { @@ -188,10 +186,9 @@ public abstract class AdapterViewAnimator extends AdapterView<Adapter> private void initViewAnimator() { mMainQueue = new Handler(Looper.myLooper()); mPreviousViews = new ArrayList<Integer>(); - mViewsToBringToFront = new ArrayList<View>(); } - private class ViewAndIndex { + class ViewAndIndex { ViewAndIndex(View v, int i) { view = v; index = i; @@ -217,7 +214,7 @@ public abstract class AdapterViewAnimator extends AdapterView<Adapter> if (activeOffset > numVisibleViews - 1) { // Throw an exception here. } - mNumActiveViews = numVisibleViews; + mMaxNumActiveViews = numVisibleViews; mActiveOffset = activeOffset; mPreviousViews.clear(); mViewsMap.clear(); @@ -266,10 +263,10 @@ public abstract class AdapterViewAnimator extends AdapterView<Adapter> public void setDisplayedChild(int whichChild) { if (mAdapter != null) { mWhichChild = whichChild; - if (whichChild >= mAdapter.getCount()) { - mWhichChild = mLoopViews ? 0 : mAdapter.getCount() - 1; + if (whichChild >= getWindowSize()) { + mWhichChild = mLoopViews ? 0 : getWindowSize() - 1; } else if (whichChild < 0) { - mWhichChild = mLoopViews ? mAdapter.getCount() - 1 : 0; + mWhichChild = mLoopViews ? getWindowSize() - 1 : 0; } boolean hasFocus = getFocusedChild() != null; @@ -327,7 +324,7 @@ public abstract class AdapterViewAnimator extends AdapterView<Adapter> showOnly(childIndex, animate, false); } - private int modulo(int pos, int size) { + int modulo(int pos, int size) { if (size > 0) { return (size + (pos % size)) % size; } else { @@ -342,9 +339,8 @@ public abstract class AdapterViewAnimator extends AdapterView<Adapter> * @return View at this index, null if the index is outside the bounds */ View getViewAtRelativeIndex(int relativeIndex) { - if (relativeIndex >= 0 && relativeIndex <= mNumActiveViews - 1 && mAdapter != null) { - int adapterCount = mAdapter.getCount(); - int i = modulo(mCurrentWindowStartUnbounded + relativeIndex, adapterCount); + if (relativeIndex >= 0 && relativeIndex <= getNumActiveViews() - 1 && mAdapter != null) { + int i = modulo(mCurrentWindowStartUnbounded + relativeIndex, getWindowSize()); if (mViewsMap.get(i) != null) { return mViewsMap.get(i).view; } @@ -352,6 +348,27 @@ public abstract class AdapterViewAnimator extends AdapterView<Adapter> return null; } + int getNumActiveViews() { + if (mAdapter != null) { + return Math.min(mAdapter.getCount() + 1, mMaxNumActiveViews); + } else { + return mMaxNumActiveViews; + } + } + + int getWindowSize() { + if (mAdapter != null) { + int adapterCount = mAdapter.getCount(); + if (adapterCount <= getNumActiveViews() && mLoopViews) { + return adapterCount*mMaxNumActiveViews; + } else { + return adapterCount; + } + } else { + return 0; + } + } + LayoutParams createOrReuseLayoutParams(View v) { final ViewGroup.LayoutParams currentLp = v.getLayoutParams(); if (currentLp instanceof ViewGroup.LayoutParams) { @@ -363,7 +380,7 @@ public abstract class AdapterViewAnimator extends AdapterView<Adapter> void refreshChildren() { for (int i = mCurrentWindowStart; i <= mCurrentWindowEnd; i++) { - int index = modulo(i, mNumActiveViews); + int index = modulo(i, mMaxNumActiveViews); // get the fresh child from the adapter View updatedChild = mAdapter.getView(i, null, this); @@ -412,7 +429,7 @@ public abstract class AdapterViewAnimator extends AdapterView<Adapter> } mPreviousViews.clear(); int newWindowStartUnbounded = childIndex - mActiveOffset; - int newWindowEndUnbounded = newWindowStartUnbounded + mNumActiveViews - 1; + int newWindowEndUnbounded = newWindowStartUnbounded + getNumActiveViews() - 1; int newWindowStart = Math.max(0, newWindowStartUnbounded); int newWindowEnd = Math.min(adapterCount - 1, newWindowEndUnbounded); @@ -420,8 +437,8 @@ public abstract class AdapterViewAnimator extends AdapterView<Adapter> newWindowStart = newWindowStartUnbounded; newWindowEnd = newWindowEndUnbounded; } - int rangeStart = modulo(newWindowStart, adapterCount); - int rangeEnd = modulo(newWindowEnd, adapterCount); + int rangeStart = modulo(newWindowStart, getWindowSize()); + int rangeEnd = modulo(newWindowEnd, getWindowSize()); boolean wrap = false; if (rangeStart > rangeEnd) { @@ -450,11 +467,12 @@ public abstract class AdapterViewAnimator extends AdapterView<Adapter> } // If the window has changed - if (!(newWindowStart == mCurrentWindowStart && newWindowEnd == mCurrentWindowEnd)) { + if (!(newWindowStart == mCurrentWindowStart && newWindowEnd == mCurrentWindowEnd && + newWindowStartUnbounded == mCurrentWindowStartUnbounded)) { // Run through the indices in the new range for (int i = newWindowStart; i <= newWindowEnd; i++) { - int index = modulo(i, adapterCount); + int index = modulo(i, getWindowSize()); int oldRelativeIndex; if (mViewsMap.containsKey(index)) { oldRelativeIndex = mViewsMap.get(index).index; @@ -494,13 +512,6 @@ public abstract class AdapterViewAnimator extends AdapterView<Adapter> } mViewsMap.get(index).view.bringToFront(); } - - for (int i = 0; i < mViewsToBringToFront.size(); i++) { - View v = mViewsToBringToFront.get(i); - v.bringToFront(); - } - mViewsToBringToFront.clear(); - mCurrentWindowStart = newWindowStart; mCurrentWindowEnd = newWindowEnd; mCurrentWindowStartUnbounded = newWindowStartUnbounded; diff --git a/core/java/android/widget/StackView.java b/core/java/android/widget/StackView.java index 4c3927b..c05da03 100644 --- a/core/java/android/widget/StackView.java +++ b/core/java/android/widget/StackView.java @@ -129,7 +129,7 @@ public class StackView extends AdapterViewAnimator { } private void initStackView() { - configureViewAnimator(NUM_ACTIVE_VIEWS, NUM_ACTIVE_VIEWS - 2); + configureViewAnimator(NUM_ACTIVE_VIEWS, 1); setStaticTransformationsEnabled(true); final ViewConfiguration configuration = ViewConfiguration.get(getContext()); mTouchSlop = configuration.getScaledTouchSlop(); @@ -165,7 +165,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); @@ -175,7 +175,7 @@ public class StackView extends AdapterViewAnimator { ObjectAnimator fadeIn = ObjectAnimator.ofFloat(view, "alpha", view.getAlpha(), 1.0f); fadeIn.setDuration(DEFAULT_ANIMATION_DURATION); fadeIn.start(); - } else if (fromIndex == mNumActiveViews - 1 && toIndex == mNumActiveViews - 2) { + } else if (fromIndex == 0 && toIndex == 1) { // Slide item in view.setVisibility(VISIBLE); @@ -189,7 +189,7 @@ public class StackView extends AdapterViewAnimator { pa.setDuration(duration); pa.setInterpolator(new LinearInterpolator()); pa.start(); - } else if (fromIndex == mNumActiveViews - 2 && toIndex == mNumActiveViews - 1) { + } else if (fromIndex == 1 && toIndex == 0) { // Slide item out int duration = Math.round(mStackSlider.getDurationForOffscreenPosition(mYVelocity)); @@ -201,7 +201,7 @@ public class StackView extends AdapterViewAnimator { pa.setDuration(duration); pa.setInterpolator(new LinearInterpolator()); pa.start(); - } else if (fromIndex == -1 && toIndex == mNumActiveViews - 1) { + } else if (fromIndex == -1 && toIndex == 0) { // Make sure this view that is "waiting in the wings" is invisible view.setAlpha(0.0f); view.setVisibility(INVISIBLE); @@ -223,9 +223,10 @@ public class StackView extends AdapterViewAnimator { private void transformViewAtIndex(int index, View view) { float maxPerpectiveShift = mMeasuredHeight * PERSPECTIVE_SHIFT_FACTOR; - if (index == mNumActiveViews -1) index--; + index = mMaxNumActiveViews - index - 1; + if (index == mMaxNumActiveViews - 1) index--; - float r = (index * 1.0f) / (mNumActiveViews - 2); + float r = (index * 1.0f) / (mMaxNumActiveViews - 2); float scale = 1 - PERSPECTIVE_SCALE_FACTOR * (1 - r); PropertyValuesHolder scaleX = PropertyValuesHolder.ofFloat("scaleX", scale); @@ -245,8 +246,20 @@ public class StackView extends AdapterViewAnimator { pa.start(); } + @Override + void showOnly(int childIndex, boolean animate, boolean onLayout) { + super.showOnly(childIndex, animate, onLayout); + + // Here we need to make sure that the z-order of the children is correct + for (int i = mCurrentWindowEnd; i >= mCurrentWindowStart; i--) { + int index = modulo(i, getWindowSize()); + View v = mViewsMap.get(index).view; + if (v != null) v.bringToFront(); + } + } + private void updateChildTransforms() { - for (int i = 0; i < mNumActiveViews - 1; i++) { + for (int i = 0; i < getNumActiveViews(); i++) { View v = getViewAtRelativeIndex(i); if (v != null) { transformViewAtIndex(i, v); @@ -341,19 +354,17 @@ public class StackView extends AdapterViewAnimator { int activeIndex; if (mStackMode == ITEMS_SLIDE_UP) { - activeIndex = (swipeGestureType == GESTURE_SLIDE_DOWN) ? - mNumActiveViews - 1 : mNumActiveViews - 2; + activeIndex = (swipeGestureType == GESTURE_SLIDE_DOWN) ? 0 : 1; } else { - activeIndex = (swipeGestureType == GESTURE_SLIDE_DOWN) ? - mNumActiveViews - 2 : mNumActiveViews - 1; + activeIndex = (swipeGestureType == GESTURE_SLIDE_DOWN) ? 1 : 0; } if (mLoopViews) { mStackSlider.setMode(StackSlider.NORMAL_MODE); - } else if (mCurrentWindowStartUnbounded + activeIndex == 0) { + } else if (mCurrentWindowStartUnbounded + activeIndex == -1) { + activeIndex++; mStackSlider.setMode(StackSlider.BEGINNING_OF_STACK_MODE); - } else if (mCurrentWindowStartUnbounded + activeIndex == mAdapter.getCount()) { - activeIndex--; + } else if (mCurrentWindowStartUnbounded + activeIndex == mAdapter.getCount() - 1) { mStackSlider.setMode(StackSlider.END_OF_STACK_MODE); } else { mStackSlider.setMode(StackSlider.NORMAL_MODE); @@ -439,8 +450,7 @@ public class StackView extends AdapterViewAnimator { final int pointerId = ev.getPointerId(activePointerIndex); if (pointerId == mActivePointerId) { - int activeViewIndex = (mSwipeGestureType == GESTURE_SLIDE_DOWN) ? mNumActiveViews - 1 - : mNumActiveViews - 2; + int activeViewIndex = (mSwipeGestureType == GESTURE_SLIDE_DOWN) ? 0 : 1; View v = getViewAtRelativeIndex(activeViewIndex); if (v == null) return; @@ -498,18 +508,18 @@ public class StackView extends AdapterViewAnimator { && mStackSlider.mMode == StackSlider.NORMAL_MODE) { // Swipe threshold exceeded, swipe down if (mStackMode == ITEMS_SLIDE_UP) { - showNext(); - } else { showPrevious(); + } else { + showNext(); } mHighlight.bringToFront(); } else if (deltaY < -mSwipeThreshold && mSwipeGestureType == GESTURE_SLIDE_UP && mStackSlider.mMode == StackSlider.NORMAL_MODE) { // Swipe threshold exceeded, swipe up if (mStackMode == ITEMS_SLIDE_UP) { - showPrevious(); - } else { showNext(); + } else { + showPrevious(); } mHighlight.bringToFront(); @@ -643,13 +653,13 @@ public class StackView extends AdapterViewAnimator { mView.setRotationX(stackDirection * 90.0f * rotationInterpolator(r)); mHighlight.setRotationX(stackDirection * 90.0f * rotationInterpolator(r)); break; - case BEGINNING_OF_STACK_MODE: + case END_OF_STACK_MODE: r = r * 0.2f; viewLp.setVerticalOffset(Math.round(-stackDirection * r * mSlideAmount)); highlightLp.setVerticalOffset(Math.round(-stackDirection * r * mSlideAmount)); mHighlight.setAlpha(highlightAlphaInterpolator(r)); break; - case END_OF_STACK_MODE: + case BEGINNING_OF_STACK_MODE: r = (1-r) * 0.2f; viewLp.setVerticalOffset(Math.round(stackDirection * r * mSlideAmount)); highlightLp.setVerticalOffset(Math.round(stackDirection * r * mSlideAmount)); @@ -735,12 +745,10 @@ public class StackView extends AdapterViewAnimator { public void onRemoteAdapterConnected() { super.onRemoteAdapterConnected(); // On first run, we want to set the stack to the end. - if (mAdapter != null && mWhichChild == -1) { - mWhichChild = mAdapter.getCount() - 1; - } - if (mWhichChild >= 0) { - setDisplayedChild(mWhichChild); + if (mWhichChild == -1) { + mWhichChild = 0; } + setDisplayedChild(mWhichChild); } LayoutParams createOrReuseLayoutParams(View v) { |
