Merge "Fix bug 2973252 - Make overscroll glow respect ifContentScrolls" into gingerbread

This commit is contained in:
Adam Powell
2010-09-03 13:58:37 -07:00
committed by Android (Google) Code Review
3 changed files with 60 additions and 23 deletions

View File

@@ -658,6 +658,18 @@ public abstract class AbsListView extends AdapterView<ListAdapter> implements Te
super.setOverscrollMode(mode); super.setOverscrollMode(mode);
} }
/**
* @return true if all list content currently fits within the view boundaries
*/
private boolean contentFits() {
final int childCount = getChildCount();
if (childCount != mItemCount) {
return false;
}
return getChildAt(0).getTop() >= 0 && getChildAt(childCount - 1).getBottom() <= mBottom;
}
/** /**
* Enables fast scrolling by letting the user quickly scroll through lists by * Enables fast scrolling by letting the user quickly scroll through lists by
* dragging the fast scroll thumb. The adapter attached to the list may want * dragging the fast scroll thumb. The adapter attached to the list may want
@@ -2221,8 +2233,12 @@ public abstract class AbsListView extends AdapterView<ListAdapter> implements Te
// Don't allow overfling if we're at the edge. // Don't allow overfling if we're at the edge.
mVelocityTracker.clear(); mVelocityTracker.clear();
} }
final int overscrollMode = getOverscrollMode();
if (overscrollMode == OVERSCROLL_ALWAYS ||
(overscrollMode == OVERSCROLL_IF_CONTENT_SCROLLS &&
!contentFits())) {
mTouchMode = TOUCH_MODE_OVERSCROLL; mTouchMode = TOUCH_MODE_OVERSCROLL;
if (mEdgeGlowTop != null) {
if (rawDeltaY > 0) { if (rawDeltaY > 0) {
mEdgeGlowTop.onPull((float) overscroll / getHeight()); mEdgeGlowTop.onPull((float) overscroll / getHeight());
} else if (rawDeltaY < 0) { } else if (rawDeltaY < 0) {
@@ -2275,7 +2291,10 @@ public abstract class AbsListView extends AdapterView<ListAdapter> implements Te
} else { } else {
overscrollBy(0, -incrementalDeltaY, 0, mScrollY, 0, 0, overscrollBy(0, -incrementalDeltaY, 0, mScrollY, 0, 0,
0, mOverscrollDistance, true); 0, mOverscrollDistance, true);
if (mEdgeGlowTop != null) { final int overscrollMode = getOverscrollMode();
if (overscrollMode == OVERSCROLL_ALWAYS ||
(overscrollMode == OVERSCROLL_IF_CONTENT_SCROLLS &&
!contentFits())) {
if (rawDeltaY > 0) { if (rawDeltaY > 0) {
mEdgeGlowTop.onPull((float) -incrementalDeltaY / getHeight()); mEdgeGlowTop.onPull((float) -incrementalDeltaY / getHeight());
} else if (rawDeltaY < 0) { } else if (rawDeltaY < 0) {
@@ -2757,8 +2776,10 @@ public abstract class AbsListView extends AdapterView<ListAdapter> implements Te
void edgeReached(int delta) { void edgeReached(int delta) {
mScroller.notifyVerticalEdgeReached(mScrollY, 0, mOverflingDistance); mScroller.notifyVerticalEdgeReached(mScrollY, 0, mOverflingDistance);
final int overscrollMode = getOverscrollMode();
if (overscrollMode == OVERSCROLL_ALWAYS ||
(overscrollMode == OVERSCROLL_IF_CONTENT_SCROLLS && !contentFits())) {
mTouchMode = TOUCH_MODE_OVERFLING; mTouchMode = TOUCH_MODE_OVERFLING;
if (mEdgeGlowTop != null) {
final int vel = (int) mScroller.getCurrVelocity(); final int vel = (int) mScroller.getCurrVelocity();
if (delta > 0) { if (delta > 0) {
mEdgeGlowTop.onAbsorb(vel); mEdgeGlowTop.onAbsorb(vel);

View File

@@ -538,6 +538,9 @@ public class HorizontalScrollView extends FrameLayout {
} }
onScrollChanged(mScrollX, mScrollY, oldX, oldY); onScrollChanged(mScrollX, mScrollY, oldX, oldY);
final int overscrollMode = getOverscrollMode();
if (overscrollMode == OVERSCROLL_ALWAYS ||
(overscrollMode == OVERSCROLL_IF_CONTENT_SCROLLS && range > 0)) {
final int pulledToX = oldX + deltaX; final int pulledToX = oldX + deltaX;
if (pulledToX < 0) { if (pulledToX < 0) {
mEdgeGlowLeft.onPull((float) deltaX / getWidth()); mEdgeGlowLeft.onPull((float) deltaX / getWidth());
@@ -545,6 +548,7 @@ public class HorizontalScrollView extends FrameLayout {
mEdgeGlowRight.onPull((float) deltaX / getWidth()); mEdgeGlowRight.onPull((float) deltaX / getWidth());
} }
} }
}
break; break;
case MotionEvent.ACTION_UP: case MotionEvent.ACTION_UP:
if (mIsBeingDragged) { if (mIsBeingDragged) {
@@ -1091,12 +1095,16 @@ public class HorizontalScrollView extends FrameLayout {
onScrollChanged(mScrollX, mScrollY, oldX, oldY); onScrollChanged(mScrollX, mScrollY, oldX, oldY);
final int range = getScrollRange(); final int range = getScrollRange();
final int overscrollMode = getOverscrollMode();
if (overscrollMode == OVERSCROLL_ALWAYS ||
(overscrollMode == OVERSCROLL_IF_CONTENT_SCROLLS && range > 0)) {
if (x < 0 && oldX >= 0) { if (x < 0 && oldX >= 0) {
mEdgeGlowLeft.onAbsorb((int) mScroller.getCurrVelocity()); mEdgeGlowLeft.onAbsorb((int) mScroller.getCurrVelocity());
} else if (x > range && oldX <= range) { } else if (x > range && oldX <= range) {
mEdgeGlowRight.onAbsorb((int) mScroller.getCurrVelocity()); mEdgeGlowRight.onAbsorb((int) mScroller.getCurrVelocity());
} }
} }
}
awakenScrollBars(); awakenScrollBars();
// Keep on drawing until the animation has finished. // Keep on drawing until the animation has finished.

View File

@@ -533,6 +533,9 @@ public class ScrollView extends FrameLayout {
} }
onScrollChanged(mScrollX, mScrollY, oldX, oldY); onScrollChanged(mScrollX, mScrollY, oldX, oldY);
final int overscrollMode = getOverscrollMode();
if (overscrollMode == OVERSCROLL_ALWAYS ||
(overscrollMode == OVERSCROLL_IF_CONTENT_SCROLLS && range > 0)) {
final int pulledToY = oldY + deltaY; final int pulledToY = oldY + deltaY;
if (pulledToY < 0) { if (pulledToY < 0) {
mEdgeGlowTop.onPull((float) deltaY / getHeight()); mEdgeGlowTop.onPull((float) deltaY / getHeight());
@@ -540,6 +543,7 @@ public class ScrollView extends FrameLayout {
mEdgeGlowBottom.onPull((float) deltaY / getHeight()); mEdgeGlowBottom.onPull((float) deltaY / getHeight());
} }
} }
}
break; break;
case MotionEvent.ACTION_UP: case MotionEvent.ACTION_UP:
if (mIsBeingDragged) { if (mIsBeingDragged) {
@@ -1090,12 +1094,16 @@ public class ScrollView extends FrameLayout {
onScrollChanged(mScrollX, mScrollY, oldX, oldY); onScrollChanged(mScrollX, mScrollY, oldX, oldY);
final int range = getScrollRange(); final int range = getScrollRange();
final int overscrollMode = getOverscrollMode();
if (overscrollMode == OVERSCROLL_ALWAYS ||
(overscrollMode == OVERSCROLL_IF_CONTENT_SCROLLS && range > 0)) {
if (y < 0 && oldY >= 0) { if (y < 0 && oldY >= 0) {
mEdgeGlowTop.onAbsorb((int) mScroller.getCurrVelocity()); mEdgeGlowTop.onAbsorb((int) mScroller.getCurrVelocity());
} else if (y > range && oldY <= range) { } else if (y > range && oldY <= range) {
mEdgeGlowBottom.onAbsorb((int) mScroller.getCurrVelocity()); mEdgeGlowBottom.onAbsorb((int) mScroller.getCurrVelocity());
} }
} }
}
awakenScrollBars(); awakenScrollBars();
// Keep on drawing until the animation has finished. // Keep on drawing until the animation has finished.