From 0a77ce277c6ed2aa25bbea5f8cd5687c0720cb68 Mon Sep 17 00:00:00 2001 From: Adam Powell Date: Wed, 25 Aug 2010 14:37:03 -0700 Subject: [PATCH] New edge effects for scrolling widgets (overscroll) TODO: Currently disabled for WebView. Assets used for the glow effect need to be themable/styleable. Overscroll effect should take place even when the user did not grab the widget within actual content. Change-Id: I68277d14d37dc5bcdb9254eaddf6e4998b3f2bf4 --- api/current.xml | 612 ++++++++++++- core/java/android/view/View.java | 162 ++++ core/java/android/view/ViewConfiguration.java | 31 + core/java/android/webkit/WebSettings.java | 18 + core/java/android/webkit/WebView.java | 193 +++- core/java/android/widget/AbsListView.java | 516 +++++++++-- core/java/android/widget/EdgeGlow.java | 286 ++++++ core/java/android/widget/GridView.java | 7 +- .../android/widget/HorizontalScrollView.java | 169 +++- core/java/android/widget/ListView.java | 142 ++- core/java/android/widget/OverScroller.java | 849 ++++++++++++++++++ core/java/android/widget/ScrollView.java | 152 +++- core/java/android/widget/Scroller.java | 26 +- core/res/res/drawable/edge_light.png | Bin 0 -> 32307 bytes core/res/res/drawable/overscroll_glow.png | Bin 0 -> 183232 bytes core/res/res/layout/alert_dialog.xml | 3 +- .../res/layout/preference_dialog_edittext.xml | 3 +- core/res/res/layout/select_dialog.xml | 3 +- core/res/res/values/attrs.xml | 17 + core/res/res/values/public.xml | 7 +- 20 files changed, 2969 insertions(+), 227 deletions(-) create mode 100644 core/java/android/widget/EdgeGlow.java create mode 100644 core/java/android/widget/OverScroller.java create mode 100644 core/res/res/drawable/edge_light.png create mode 100644 core/res/res/drawable/overscroll_glow.png diff --git a/api/current.xml b/api/current.xml index dad5c0326de04..b4f23257d0d0c 100644 --- a/api/current.xml +++ b/api/current.xml @@ -5894,39 +5894,6 @@ visibility="public" > - - - - - - + + + + + + + + - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + computeHorizontalScrollExtent(); + final boolean canScrollVertical = + computeVerticalScrollRange() > computeVerticalScrollExtent(); + final boolean overscrollHorizontal = overscrollMode == OVERSCROLL_ALWAYS || + (overscrollMode == OVERSCROLL_IF_CONTENT_SCROLLS && canScrollHorizontal); + final boolean overscrollVertical = overscrollMode == OVERSCROLL_ALWAYS || + (overscrollMode == OVERSCROLL_IF_CONTENT_SCROLLS && canScrollVertical); + + int newScrollX = scrollX + deltaX; + if (!overscrollHorizontal) { + maxOverscrollX = 0; + } + + int newScrollY = scrollY + deltaY; + if (!overscrollVertical) { + maxOverscrollY = 0; + } + + // Clamp values if at the limits and record + final int left = -maxOverscrollX; + final int right = maxOverscrollX + scrollRangeX; + final int top = -maxOverscrollY; + final int bottom = maxOverscrollY + scrollRangeY; + + boolean clampedX = false; + if (newScrollX > right) { + newScrollX = right; + clampedX = true; + } else if (newScrollX < left) { + newScrollX = left; + clampedX = true; + } + + boolean clampedY = false; + if (newScrollY > bottom) { + newScrollY = bottom; + clampedY = true; + } else if (newScrollY < top) { + newScrollY = top; + clampedY = true; + } + + onOverscrolled(newScrollX, newScrollY, clampedX, clampedY); + + return clampedX || clampedY; + } + + /** + * Called by {@link #overscrollBy(int, int, int, int, int, int, int, int, boolean)} to + * respond to the results of an overscroll operation. + * + * @param scrollX New X scroll value in pixels + * @param scrollY New Y scroll value in pixels + * @param clampedX True if scrollX was clamped to an overscroll boundary + * @param clampedY True if scrollY was clamped to an overscroll boundary + */ + protected void onOverscrolled(int scrollX, int scrollY, + boolean clampedX, boolean clampedY) { + // Intentionally empty. + } + + /** + * Returns the overscroll mode for this view. The result will be + * one of {@link #OVERSCROLL_ALWAYS} (default), {@link #OVERSCROLL_IF_CONTENT_SCROLLS} + * (allow overscrolling only if the view content is larger than the container), + * or {@link #OVERSCROLL_NEVER}. + * + * @return This view's overscroll mode. + */ + public int getOverscrollMode() { + return mOverscrollMode; + } + + /** + * Set the overscroll mode for this view. Valid overscroll modes are + * {@link #OVERSCROLL_ALWAYS} (default), {@link #OVERSCROLL_IF_CONTENT_SCROLLS} + * (allow overscrolling only if the view content is larger than the container), + * or {@link #OVERSCROLL_NEVER}. + * + * Setting the overscroll mode of a view will have an effect only if the + * view is capable of scrolling. + * + * @param overscrollMode The new overscroll mode for this view. + */ + public void setOverscrollMode(int overscrollMode) { + if (overscrollMode != OVERSCROLL_ALWAYS && + overscrollMode != OVERSCROLL_IF_CONTENT_SCROLLS && + overscrollMode != OVERSCROLL_NEVER) { + throw new IllegalArgumentException("Invalid overscroll mode " + overscrollMode); + } + mOverscrollMode = overscrollMode; + } + /** * A MeasureSpec encapsulates the layout requirements passed from parent to child. * Each MeasureSpec represents a requirement for either the width or the height. diff --git a/core/java/android/view/ViewConfiguration.java b/core/java/android/view/ViewConfiguration.java index acdfc2829da97..aa9fe76374c24 100644 --- a/core/java/android/view/ViewConfiguration.java +++ b/core/java/android/view/ViewConfiguration.java @@ -140,6 +140,16 @@ public class ViewConfiguration { */ private static float SCROLL_FRICTION = 0.015f; + /** + * Max distance to overscroll for edge effects + */ + private static final int OVERSCROLL_DISTANCE = 4; + + /** + * Max distance to overfling for edge effects + */ + private static final int OVERFLING_DISTANCE = 8; + private final int mEdgeSlop; private final int mFadingEdgeLength; private final int mMinimumFlingVelocity; @@ -150,6 +160,8 @@ public class ViewConfiguration { private final int mDoubleTapSlop; private final int mWindowTouchSlop; private final int mMaximumDrawingCacheSize; + private final int mOverscrollDistance; + private final int mOverflingDistance; private static final SparseArray sConfigurations = new SparseArray(2); @@ -170,6 +182,8 @@ public class ViewConfiguration { mWindowTouchSlop = WINDOW_TOUCH_SLOP; //noinspection deprecation mMaximumDrawingCacheSize = MAXIMUM_DRAWING_CACHE_SIZE; + mOverscrollDistance = OVERSCROLL_DISTANCE; + mOverflingDistance = OVERFLING_DISTANCE; } /** @@ -198,6 +212,9 @@ public class ViewConfiguration { // Size of the screen in bytes, in ARGB_8888 format mMaximumDrawingCacheSize = 4 * metrics.widthPixels * metrics.heightPixels; + + mOverscrollDistance = (int) (density * OVERSCROLL_DISTANCE + 0.5f); + mOverflingDistance = (int) (density * OVERFLING_DISTANCE + 0.5f); } /** @@ -454,6 +471,20 @@ public class ViewConfiguration { return mMaximumDrawingCacheSize; } + /** + * @return The maximum distance a View should overscroll by when showing edge effects. + */ + public int getScaledOverscrollDistance() { + return mOverscrollDistance; + } + + /** + * @return The maximum distance a View should overfling by when showing edge effects. + */ + public int getScaledOverflingDistance() { + return mOverflingDistance; + } + /** * The amount of time that the zoom controls should be * displayed on the screen expressed in milliseconds. diff --git a/core/java/android/webkit/WebSettings.java b/core/java/android/webkit/WebSettings.java index b767f11753dc2..1b801d4d13807 100644 --- a/core/java/android/webkit/WebSettings.java +++ b/core/java/android/webkit/WebSettings.java @@ -207,6 +207,7 @@ public class WebSettings { private boolean mBuiltInZoomControls = false; private boolean mAllowFileAccess = true; private boolean mLoadWithOverviewMode = false; + private boolean mUseWebViewBackgroundOverscrollBackground = true; // private WebSettings, not accessible by the host activity static private int mDoubleTapToastCount = 3; @@ -484,6 +485,23 @@ public class WebSettings { return mLoadWithOverviewMode; } + /** + * Set whether the WebView uses its background for over scroll background. + * If true, it will use the WebView's background. If false, it will use an + * internal pattern. Default is true. + */ + public void setUseWebViewBackgroundForOverscrollBackground(boolean view) { + mUseWebViewBackgroundOverscrollBackground = view; + } + + /** + * Returns true if this WebView uses WebView's background instead of + * internal pattern for over scroll background. + */ + public boolean getUseWebViewBackgroundForOverscrollBackground() { + return mUseWebViewBackgroundOverscrollBackground; + } + /** * Store whether the WebView is saving form data. */ diff --git a/core/java/android/webkit/WebView.java b/core/java/android/webkit/WebView.java index 052de972a66e0..0deb45aff8cd0 100644 --- a/core/java/android/webkit/WebView.java +++ b/core/java/android/webkit/WebView.java @@ -39,8 +39,8 @@ import android.graphics.RectF; import android.graphics.Region; import android.graphics.Shader; import android.graphics.drawable.Drawable; -import android.net.Uri; import android.net.http.SslCertificate; +import android.net.Uri; import android.os.Bundle; import android.os.Handler; import android.os.Message; @@ -79,7 +79,7 @@ import android.widget.CheckedTextView; import android.widget.FrameLayout; import android.widget.LinearLayout; import android.widget.ListView; -import android.widget.Scroller; +import android.widget.OverScroller; import android.widget.Toast; import android.widget.ZoomButtonsController; import android.widget.ZoomControls; @@ -92,8 +92,8 @@ import java.io.FileOutputStream; import java.io.IOException; import java.net.URLDecoder; import java.util.ArrayList; -import java.util.HashMap; import java.util.List; +import java.util.HashMap; import java.util.Map; import java.util.Set; @@ -557,7 +557,10 @@ public class WebView extends AbsoluteLayout // time for the longest scroll animation private static final int MAX_DURATION = 750; // milliseconds private static final int SLIDE_TITLE_DURATION = 500; // milliseconds - private Scroller mScroller; + private OverScroller mScroller; + private boolean mInOverScrollMode = false; + private static Paint mOverScrollBackground; + private static Paint mOverScrollBorder; private boolean mWrapContent; private static final int MOTIONLESS_FALSE = 0; @@ -943,7 +946,7 @@ public class WebView extends AbsoluteLayout mViewManager = new ViewManager(this); mWebViewCore = new WebViewCore(context, this, mCallbackProxy, javascriptInterfaces); mDatabase = WebViewDatabase.getInstance(context); - mScroller = new Scroller(context); + mScroller = new OverScroller(context); updateMultiTouchSupport(context); } @@ -983,6 +986,7 @@ public class WebView extends AbsoluteLayout setFocusableInTouchMode(true); setClickable(true); setLongClickable(true); + setOverscrollMode(OVERSCROLL_NEVER); final ViewConfiguration configuration = ViewConfiguration.get(getContext()); int slop = configuration.getScaledTouchSlop(); @@ -1146,7 +1150,8 @@ public class WebView extends AbsoluteLayout * Return the amount of the titlebarview (if any) that is visible */ private int getVisibleTitleHeight() { - return Math.max(getTitleHeight() - mScrollY, 0); + // need to restrict mScrollY due to over scroll + return Math.max(getTitleHeight() - Math.max(0, mScrollY), 0); } /* @@ -1786,7 +1791,7 @@ public class WebView extends AbsoluteLayout } nativeClearCursor(); // start next trackball movement from page edge if (bottom) { - return pinScrollTo(mScrollX, computeVerticalScrollRange(), true, 0); + return pinScrollTo(mScrollX, computeRealVerticalScrollRange(), true, 0); } // Page down. int h = getHeight(); @@ -2016,13 +2021,15 @@ public class WebView extends AbsoluteLayout // Expects x in view coordinates private int pinLocX(int x) { - return pinLoc(x, getViewWidth(), computeHorizontalScrollRange()); + if (mInOverScrollMode) return x; + return pinLoc(x, getViewWidth(), computeRealHorizontalScrollRange()); } // Expects y in view coordinates private int pinLocY(int y) { + if (mInOverScrollMode) return y; return pinLoc(y, getViewHeightWithTitle(), - computeVerticalScrollRange() + getTitleHeight()); + computeRealVerticalScrollRange() + getTitleHeight()); } /** @@ -2334,7 +2341,7 @@ public class WebView extends AbsoluteLayout // Sets r to be our visible rectangle in content coordinates private void calcOurContentVisibleRect(Rect r) { calcOurVisibleRect(r); - // pin the rect to the bounds of the content + // since we might overscroll, pin the rect to the bounds of the content r.left = Math.max(viewToContentX(r.left), 0); // viewToContentY will remove the total height of the title bar. Add // the visible height back in to account for the fact that if the title @@ -2415,8 +2422,7 @@ public class WebView extends AbsoluteLayout return false; } - @Override - protected int computeHorizontalScrollRange() { + private int computeRealHorizontalScrollRange() { if (mDrawHistory) { return mHistoryWidth; } else if (mHorizontalScrollBarMode == SCROLLBAR_ALWAYSOFF @@ -2430,7 +2436,27 @@ public class WebView extends AbsoluteLayout } @Override - protected int computeVerticalScrollRange() { + protected int computeHorizontalScrollRange() { + int range = computeRealHorizontalScrollRange(); + + // Adjust reported range if overscrolled to compress the scroll bars + final int scrollX = mScrollX; + final int overscrollRight = computeMaxScrollX(); + if (scrollX < 0) { + range -= scrollX; + } else if (scrollX > overscrollRight) { + range += scrollX - overscrollRight; + } + + return range; + } + + @Override + protected int computeHorizontalScrollOffset() { + return Math.max(mScrollX, 0); + } + + private int computeRealVerticalScrollRange() { if (mDrawHistory) { return mHistoryHeight; } else if (mVerticalScrollBarMode == SCROLLBAR_ALWAYSOFF @@ -2443,6 +2469,22 @@ public class WebView extends AbsoluteLayout } } + @Override + protected int computeVerticalScrollRange() { + int range = computeRealVerticalScrollRange(); + + // Adjust reported range if overscrolled to compress the scroll bars + final int scrollY = mScrollY; + final int overscrollBottom = computeMaxScrollY(); + if (scrollY < 0) { + range -= scrollY; + } else if (scrollY > overscrollBottom) { + range += scrollY - overscrollBottom; + } + + return range; + } + @Override protected int computeVerticalScrollOffset() { return Math.max(mScrollY - getTitleHeight(), 0); @@ -2462,6 +2504,23 @@ public class WebView extends AbsoluteLayout scrollBar.draw(canvas); } + @Override + protected void onOverscrolled(int scrollX, int scrollY, boolean clampedX, + boolean clampedY) { + mInOverScrollMode = false; + int maxX = computeMaxScrollX(); + if (maxX == 0) { + // do not over scroll x if the page just fits the screen + scrollX = pinLocX(scrollX); + } else if (scrollX < 0 || scrollX > maxX) { + mInOverScrollMode = true; + } + if (scrollY < 0 || scrollY > computeMaxScrollY()) { + mInOverScrollMode = true; + } + super.scrollTo(scrollX, scrollY); + } + /** * Get the url for the current page. This is not always the same as the url * passed to WebViewClient.onPageStarted because although the load for @@ -2815,11 +2874,14 @@ public class WebView extends AbsoluteLayout if (mScroller.computeScrollOffset()) { int oldX = mScrollX; int oldY = mScrollY; - mScrollX = mScroller.getCurrX(); - mScrollY = mScroller.getCurrY(); + int x = mScroller.getCurrX(); + int y = mScroller.getCurrY(); postInvalidate(); // So we draw again - if (oldX != mScrollX || oldY != mScrollY) { - onScrollChanged(mScrollX, mScrollY, oldX, oldY); + + if (oldX != x || oldY != y) { + overscrollBy(x - oldX, y - oldY, oldX, oldY, + computeMaxScrollX(), computeMaxScrollY(), + getViewWidth() / 3, getViewHeight() / 3, false); } } else { super.computeScroll(); @@ -3230,8 +3292,13 @@ public class WebView extends AbsoluteLayout protected boolean drawChild(Canvas canvas, View child, long drawingTime) { if (child == mTitleBar) { // When drawing the title bar, move it horizontally to always show - // at the top of the WebView. + // at the top of the WebView. While overscroll, stick the title bar + // on the top otherwise we may have two during loading, one is drawn + // here, another is drawn by the Browser. mTitleBar.offsetLeftAndRight(mScrollX - mTitleBar.getLeft()); + if (mScrollY <= 0) { + mTitleBar.offsetTopAndBottom(mScrollY - mTitleBar.getTop()); + } } return super.drawChild(canvas, child, drawingTime); } @@ -3267,6 +3334,36 @@ public class WebView extends AbsoluteLayout } int saveCount = canvas.save(); + if (mInOverScrollMode && !getSettings() + .getUseWebViewBackgroundForOverscrollBackground()) { + if (mOverScrollBackground == null) { + mOverScrollBackground = new Paint(); + Bitmap bm = BitmapFactory.decodeResource( + mContext.getResources(), + com.android.internal.R.drawable.status_bar_background); + mOverScrollBackground.setShader(new BitmapShader(bm, + Shader.TileMode.REPEAT, Shader.TileMode.REPEAT)); + mOverScrollBorder = new Paint(); + mOverScrollBorder.setStyle(Paint.Style.STROKE); + mOverScrollBorder.setStrokeWidth(0); + mOverScrollBorder.setColor(0xffbbbbbb); + } + + int top = getTitleHeight(); + int right = computeRealHorizontalScrollRange(); + int bottom = top + computeRealVerticalScrollRange(); + // first draw the background and anchor to the top of the view + canvas.save(); + canvas.translate(mScrollX, mScrollY); + canvas.clipRect(-mScrollX, top - mScrollY, right - mScrollX, bottom + - mScrollY, Region.Op.DIFFERENCE); + canvas.drawPaint(mOverScrollBackground); + canvas.restore(); + // then draw the border + canvas.drawRect(-1, top - 1, right, bottom, mOverScrollBorder); + // next clip the region for the content + canvas.clipRect(0, top, right, bottom); + } if (mTitleBar != null) { canvas.translate(0, (int) mTitleBar.getHeight()); } @@ -4405,12 +4502,14 @@ public class WebView extends AbsoluteLayout @Override protected void onScrollChanged(int l, int t, int oldl, int oldt) { super.onScrollChanged(l, t, oldl, oldt); - sendOurVisibleRect(); - // update WebKit if visible title bar height changed. The logic is same - // as getVisibleTitleHeight. - int titleHeight = getTitleHeight(); - if (Math.max(titleHeight - t, 0) != Math.max(titleHeight - oldt, 0)) { - sendViewSizeZoom(); + if (!mInOverScrollMode) { + sendOurVisibleRect(); + // update WebKit if visible title bar height changed. The logic is same + // as getVisibleTitleHeight. + int titleHeight = getTitleHeight(); + if (Math.max(titleHeight - t, 0) != Math.max(titleHeight - oldt, 0)) { + sendViewSizeZoom(); + } } } @@ -4480,7 +4579,7 @@ public class WebView extends AbsoluteLayout public DragTrackerHandler(float x, float y, DragTracker proxy) { mProxy = proxy; - int docBottom = computeVerticalScrollRange() + getTitleHeight(); + int docBottom = computeRealVerticalScrollRange() + getTitleHeight(); int viewTop = getScrollY(); int viewBottom = viewTop + getHeight(); @@ -4493,7 +4592,7 @@ public class WebView extends AbsoluteLayout " up/down= " + mMinDY + " " + mMaxDY); } - int docRight = computeHorizontalScrollRange(); + int docRight = computeRealHorizontalScrollRange(); int viewLeft = getScrollX(); int viewRight = viewLeft + getWidth(); mStartX = x; @@ -5001,18 +5100,6 @@ public class WebView extends AbsoluteLayout } // do pan - int newScrollX = pinLocX(mScrollX + deltaX); - int newDeltaX = newScrollX - mScrollX; - if (deltaX != newDeltaX) { - deltaX = newDeltaX; - fDeltaX = (float) newDeltaX; - } - int newScrollY = pinLocY(mScrollY + deltaY); - int newDeltaY = newScrollY - mScrollY; - if (deltaY != newDeltaY) { - deltaY = newDeltaY; - fDeltaY = (float) newDeltaY; - } boolean done = false; boolean keepScrollBarsVisible = false; if (Math.abs(fDeltaX) < 1.0f && Math.abs(fDeltaY) < 1.0f) { @@ -5196,6 +5283,12 @@ public class WebView extends AbsoluteLayout mHeldMotionless = MOTIONLESS_IGNORE; doFling(); break; + } else { + if (mScroller.springback(mScrollX, mScrollY, 0, + computeMaxScrollX(), 0, + computeMaxScrollY())) { + invalidate(); + } } // redraw in high-quality, as we're done dragging mHeldMotionless = MOTIONLESS_TRUE; @@ -5215,6 +5308,8 @@ public class WebView extends AbsoluteLayout } case MotionEvent.ACTION_CANCEL: { if (mTouchMode == TOUCH_DRAG_MODE) { + mScroller.springback(mScrollX, mScrollY, 0, + computeMaxScrollX(), 0, computeMaxScrollY()); invalidate(); } cancelWebCoreTouchEvent(contentX, contentY, false); @@ -5278,7 +5373,9 @@ public class WebView extends AbsoluteLayout private void doDrag(int deltaX, int deltaY) { if ((deltaX | deltaY) != 0) { - scrollBy(deltaX, deltaY); + overscrollBy(deltaX, deltaY, mScrollX, mScrollY, + computeMaxScrollX(), computeMaxScrollY(), + getViewWidth() / 3, getViewHeight() / 3, true); } if (!getSettings().getBuiltInZoomControls()) { boolean showPlusMinus = mMinZoomScale < mMaxZoomScale; @@ -5626,17 +5723,17 @@ public class WebView extends AbsoluteLayout } private int computeMaxScrollX() { - return Math.max(computeHorizontalScrollRange() - getViewWidth(), 0); + return Math.max(computeRealHorizontalScrollRange() - getViewWidth(), 0); } private int computeMaxScrollY() { - return Math.max(computeVerticalScrollRange() + getTitleHeight() + return Math.max(computeRealVerticalScrollRange() + getTitleHeight() - getViewHeightWithTitle(), 0); } public void flingScroll(int vx, int vy) { mScroller.fling(mScrollX, mScrollY, vx, vy, 0, computeMaxScrollX(), 0, - computeMaxScrollY()); + computeMaxScrollY(), getViewWidth() / 3, getViewHeight() / 3); invalidate(); } @@ -5666,6 +5763,10 @@ public class WebView extends AbsoluteLayout if ((maxX == 0 && vy == 0) || (maxY == 0 && vx == 0)) { WebViewCore.resumePriority(); WebViewCore.resumeUpdatePicture(mWebViewCore); + if (mScroller.springback(mScrollX, mScrollY, 0, computeMaxScrollX(), + 0, computeMaxScrollY())) { + invalidate(); + } return; } float currentVelocity = mScroller.getCurrVelocity(); @@ -5693,7 +5794,9 @@ public class WebView extends AbsoluteLayout mLastVelY = vy; mLastVelocity = (float) Math.hypot(vx, vy); - mScroller.fling(mScrollX, mScrollY, -vx, -vy, 0, maxX, 0, maxY); + // no horizontal overscroll if the content just fits + mScroller.fling(mScrollX, mScrollY, -vx, -vy, 0, maxX, 0, maxY, + maxX == 0 ? 0 : getViewWidth() / 3, getViewHeight() / 3); // TODO: duration is calculated based on velocity, if the range is // small, the animation will stop before duration is up. We may // want to calculate how long the animation is going to run to precisely @@ -6747,6 +6850,10 @@ public class WebView extends AbsoluteLayout case MotionEvent.ACTION_CANCEL: if (mDeferTouchMode == TOUCH_DRAG_MODE) { // no fling in defer process + mScroller.springback(mScrollX, mScrollY, 0, + computeMaxScrollX(), 0, + computeMaxScrollY()); + invalidate(); WebViewCore.resumePriority(); WebViewCore.resumeUpdatePicture(mWebViewCore); } diff --git a/core/java/android/widget/AbsListView.java b/core/java/android/widget/AbsListView.java index c970ae69686db..db50ca15adc42 100644 --- a/core/java/android/widget/AbsListView.java +++ b/core/java/android/widget/AbsListView.java @@ -19,6 +19,7 @@ package android.widget; import com.android.internal.R; import android.content.Context; +import android.content.res.Resources; import android.content.res.TypedArray; import android.graphics.Canvas; import android.graphics.Rect; @@ -33,6 +34,7 @@ import android.text.TextUtils; import android.text.TextWatcher; import android.util.AttributeSet; import android.util.Log; +import android.view.ContextMenu.ContextMenuInfo; import android.view.Gravity; import android.view.HapticFeedbackConstants; import android.view.KeyEvent; @@ -44,7 +46,7 @@ import android.view.ViewConfiguration; import android.view.ViewDebug; import android.view.ViewGroup; import android.view.ViewTreeObserver; -import android.view.ContextMenu.ContextMenuInfo; +import android.view.animation.AnimationUtils; import android.view.inputmethod.BaseInputConnection; import android.view.inputmethod.EditorInfo; import android.view.inputmethod.InputConnection; @@ -127,6 +129,17 @@ public abstract class AbsListView extends AdapterView implements Te */ static final int TOUCH_MODE_FLING = 4; + /** + * Indicates the touch gesture is an overscroll - a scroll beyond the beginning or end. + */ + static final int TOUCH_MODE_OVERSCROLL = 5; + + /** + * Indicates the view is being flung outside of normal content bounds + * and will spring back. + */ + static final int TOUCH_MODE_OVERFLING = 6; + /** * Regular layout - usually an unsolicited layout from the view system */ @@ -368,6 +381,16 @@ public abstract class AbsListView extends AdapterView implements Te private ContextMenuInfo mContextMenuInfo = null; + /** + * Maximum distance to record overscroll + */ + int mOverscrollMax; + + /** + * Content height divided by this is the overscroll limit. + */ + static final int OVERSCROLL_LIMIT_DIVISOR = 3; + /** * Used to request a layout when we changed touch mode */ @@ -460,6 +483,29 @@ public abstract class AbsListView extends AdapterView implements Te */ private static final int INVALID_POINTER = -1; + /** + * Maximum distance to overscroll by during edge effects + */ + int mOverscrollDistance; + + /** + * Maximum distance to overfling during edge effects + */ + int mOverflingDistance; + + // These two EdgeGlows are always set and used together. + // Checking one for null is as good as checking both. + + /** + * Tracks the state of the top edge glow. + */ + private EdgeGlow mEdgeGlowTop; + + /** + * Tracks the state of the bottom edge glow. + */ + private EdgeGlow mEdgeGlowBottom; + /** * Interface definition for a callback to be invoked when the list or grid * has been scrolled. @@ -575,9 +621,29 @@ public abstract class AbsListView extends AdapterView implements Te mTouchSlop = configuration.getScaledTouchSlop(); mMinimumVelocity = configuration.getScaledMinimumFlingVelocity(); mMaximumVelocity = configuration.getScaledMaximumFlingVelocity(); + mOverscrollDistance = configuration.getScaledOverscrollDistance(); + mOverflingDistance = configuration.getScaledOverflingDistance(); + mDensityScale = getContext().getResources().getDisplayMetrics().density; } + @Override + public void setOverscrollMode(int mode) { + if (mode != OVERSCROLL_NEVER) { + if (mEdgeGlowTop == null) { + final Resources res = getContext().getResources(); + final Drawable edge = res.getDrawable(R.drawable.edge_light); + final Drawable glow = res.getDrawable(R.drawable.overscroll_glow); + mEdgeGlowTop = new EdgeGlow(edge, glow); + mEdgeGlowBottom = new EdgeGlow(edge, glow); + } + } else { + mEdgeGlowTop = null; + mEdgeGlowBottom = null; + } + super.setOverscrollMode(mode); + } + /** * 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 @@ -1074,6 +1140,10 @@ public abstract class AbsListView extends AdapterView implements Te int result; if (mSmoothScrollbarEnabled) { result = Math.max(mItemCount * 100, 0); + if (mScrollY != 0) { + // Compensate for overscroll + result += Math.abs((int) ((float) mScrollY / getHeight() * mItemCount * 100)); + } } else { result = mItemCount; } @@ -1146,6 +1216,8 @@ public abstract class AbsListView extends AdapterView implements Te layoutChildren(); mInLayout = false; + + mOverscrollMax = (b - t) / OVERSCROLL_LIMIT_DIVISOR; } /** @@ -1921,9 +1993,10 @@ public abstract class AbsListView extends AdapterView implements Te // Check if we have moved far enough that it looks more like a // scroll than a tap final int distance = Math.abs(deltaY); - if (distance > mTouchSlop) { + final boolean overscroll = mScrollY != 0; + if (overscroll || distance > mTouchSlop) { createScrollingCache(); - mTouchMode = TOUCH_MODE_SCROLL; + mTouchMode = overscroll ? TOUCH_MODE_OVERSCROLL : TOUCH_MODE_SCROLL; mMotionCorrection = deltaY; final Handler handler = getHandler(); // Handler should not be null unless the AbsListView is not attached to a @@ -1959,6 +2032,18 @@ public abstract class AbsListView extends AdapterView implements Te // touch mode). Force an initial layout to get rid of the selection. layoutChildren(); } + } else { + int touchMode = mTouchMode; + if (touchMode == TOUCH_MODE_OVERSCROLL || touchMode == TOUCH_MODE_OVERFLING) { + if (mFlingRunnable != null) { + mFlingRunnable.endFling(); + } + + if (mScrollY != 0) { + mScrollY = 0; + invalidate(); + } + } } } @@ -1989,49 +2074,63 @@ public abstract class AbsListView extends AdapterView implements Te switch (action & MotionEvent.ACTION_MASK) { case MotionEvent.ACTION_DOWN: { - mActivePointerId = ev.getPointerId(0); - final int x = (int) ev.getX(); - final int y = (int) ev.getY(); - int motionPosition = pointToPosition(x, y); - if (!mDataChanged) { - if ((mTouchMode != TOUCH_MODE_FLING) && (motionPosition >= 0) - && (getAdapter().isEnabled(motionPosition))) { - // User clicked on an actual view (and was not stopping a fling). It might be a - // click or a scroll. Assume it is a click until proven otherwise - mTouchMode = TOUCH_MODE_DOWN; - // FIXME Debounce - if (mPendingCheckForTap == null) { - mPendingCheckForTap = new CheckForTap(); - } - postDelayed(mPendingCheckForTap, ViewConfiguration.getTapTimeout()); - } else { - if (ev.getEdgeFlags() != 0 && motionPosition < 0) { - // If we couldn't find a view to click on, but the down event was touching - // the edge, we will bail out and try again. This allows the edge correcting - // code in ViewRoot to try to find a nearby view to select - return false; - } + switch (mTouchMode) { + case TOUCH_MODE_OVERFLING: { + mFlingRunnable.endFling(); + mTouchMode = TOUCH_MODE_OVERSCROLL; + mMotionY = mLastY = (int) ev.getY(); + mMotionCorrection = 0; + mActivePointerId = ev.getPointerId(0); + break; + } - if (mTouchMode == TOUCH_MODE_FLING) { - // Stopped a fling. It is a scroll. - createScrollingCache(); - mTouchMode = TOUCH_MODE_SCROLL; - mMotionCorrection = 0; - motionPosition = findMotionRow(y); - reportScrollStateChange(OnScrollListener.SCROLL_STATE_TOUCH_SCROLL); + default: { + mActivePointerId = ev.getPointerId(0); + final int x = (int) ev.getX(); + final int y = (int) ev.getY(); + int motionPosition = pointToPosition(x, y); + if (!mDataChanged) { + if ((mTouchMode != TOUCH_MODE_FLING) && (motionPosition >= 0) + && (getAdapter().isEnabled(motionPosition))) { + // User clicked on an actual view (and was not stopping a fling). It might be a + // click or a scroll. Assume it is a click until proven otherwise + mTouchMode = TOUCH_MODE_DOWN; + // FIXME Debounce + if (mPendingCheckForTap == null) { + mPendingCheckForTap = new CheckForTap(); + } + postDelayed(mPendingCheckForTap, ViewConfiguration.getTapTimeout()); + } else { + if (ev.getEdgeFlags() != 0 && motionPosition < 0) { + // If we couldn't find a view to click on, but the down event was touching + // the edge, we will bail out and try again. This allows the edge correcting + // code in ViewRoot to try to find a nearby view to select + return false; + } + + if (mTouchMode == TOUCH_MODE_FLING) { + // Stopped a fling. It is a scroll. + createScrollingCache(); + mTouchMode = TOUCH_MODE_SCROLL; + mMotionCorrection = 0; + motionPosition = findMotionRow(y); + reportScrollStateChange(OnScrollListener.SCROLL_STATE_TOUCH_SCROLL); + } } } - } - if (motionPosition >= 0) { - // Remember where the motion event started - v = getChildAt(motionPosition - mFirstPosition); - mMotionViewOriginalTop = v.getTop(); + if (motionPosition >= 0) { + // Remember where the motion event started + v = getChildAt(motionPosition - mFirstPosition); + mMotionViewOriginalTop = v.getTop(); + } + mMotionX = x; + mMotionY = y; + mMotionPosition = motionPosition; + mLastY = Integer.MIN_VALUE; + break; + } } - mMotionX = x; - mMotionY = y; - mMotionPosition = motionPosition; - mLastY = Integer.MIN_VALUE; break; } @@ -2064,9 +2163,25 @@ public abstract class AbsListView extends AdapterView implements Te requestDisallowInterceptTouchEvent(true); } + final int rawDeltaY = deltaY; deltaY -= mMotionCorrection; int incrementalDeltaY = mLastY != Integer.MIN_VALUE ? y - mLastY : deltaY; + final int motionIndex; + if (mMotionPosition >= 0) { + motionIndex = mMotionPosition - mFirstPosition; + } else { + // If we don't have a motion position that we can reliably track, + // pick something in the middle to make a best guess at things below. + motionIndex = getChildCount() / 2; + } + + int motionViewPrevTop = 0; + View motionView = this.getChildAt(motionIndex); + if (motionView != null) { + motionViewPrevTop = motionView.getTop(); + } + // No need to do all this work if we're not going to move anyway boolean atEdge = false; if (incrementalDeltaY != 0) { @@ -2074,23 +2189,92 @@ public abstract class AbsListView extends AdapterView implements Te } // Check to see if we have bumped into the scroll limit - if (atEdge && getChildCount() > 0) { - // Treat this like we're starting a new scroll from the current - // position. This will let the user start scrolling back into - // content immediately rather than needing to scroll back to the - // point where they hit the limit first. - int motionPosition = findMotionRow(y); - if (motionPosition >= 0) { - final View motionView = getChildAt(motionPosition - mFirstPosition); - mMotionViewOriginalTop = motionView.getTop(); + motionView = this.getChildAt(motionIndex); + if (motionView != null) { + // Check if the top of the motion view is where it is + // supposed to be + final int motionViewRealTop = motionView.getTop(); + if (atEdge) { + // Apply overscroll + + int overscroll = -incrementalDeltaY - + (motionViewRealTop - motionViewPrevTop); + overscrollBy(0, overscroll, 0, mScrollY, 0, 0, + 0, mOverscrollDistance, true); + if (Math.abs(mOverscrollDistance) == Math.abs(mScrollY)) { + // Don't allow overfling if we're at the edge. + mVelocityTracker.clear(); + } + mTouchMode = TOUCH_MODE_OVERSCROLL; + if (mEdgeGlowTop != null) { + if (rawDeltaY > 0) { + mEdgeGlowTop.onPull((float) overscroll / getHeight()); + } else if (rawDeltaY < 0) { + mEdgeGlowBottom.onPull((float) overscroll / getHeight()); + } + } } mMotionY = y; - mMotionPosition = motionPosition; invalidate(); } mLastY = y; } break; + + case TOUCH_MODE_OVERSCROLL: + if (y != mLastY) { + final int rawDeltaY = deltaY; + deltaY -= mMotionCorrection; + int incrementalDeltaY = mLastY != Integer.MIN_VALUE ? y - mLastY : deltaY; + + final int oldScroll = mScrollY; + final int newScroll = oldScroll - incrementalDeltaY; + + if ((oldScroll >= 0 && newScroll <= 0) || + (oldScroll <= 0 && newScroll >= 0)) { + // Coming back to 'real' list scrolling + incrementalDeltaY = -newScroll; + mScrollY = 0; + + // No need to do all this work if we're not going to move anyway + if (incrementalDeltaY != 0) { + trackMotionScroll(incrementalDeltaY, incrementalDeltaY); + } + + // Check to see if we are back in + View motionView = this.getChildAt(mMotionPosition - mFirstPosition); + if (motionView != null) { + mTouchMode = TOUCH_MODE_SCROLL; + + // We did not scroll the full amount. Treat this essentially like the + // start of a new touch scroll + final int motionPosition = findClosestMotionRow(y); + + mMotionCorrection = 0; + motionView = getChildAt(motionPosition - mFirstPosition); + mMotionViewOriginalTop = motionView.getTop(); + mMotionY = y; + mMotionPosition = motionPosition; + } + } else { + overscrollBy(0, -incrementalDeltaY, 0, mScrollY, 0, 0, + 0, mOverscrollDistance, true); + if (mEdgeGlowTop != null) { + if (rawDeltaY > 0) { + mEdgeGlowTop.onPull((float) -incrementalDeltaY / getHeight()); + } else if (rawDeltaY < 0) { + mEdgeGlowBottom.onPull((float) -incrementalDeltaY / getHeight()); + } + invalidate(); + } + if (Math.abs(mOverscrollDistance) == Math.abs(mScrollY)) { + // Don't allow overfling if we're at the edge. + mVelocityTracker.clear(); + } + } + mLastY = y; + } + break; } break; @@ -2162,18 +2346,29 @@ public abstract class AbsListView extends AdapterView implements Te case TOUCH_MODE_SCROLL: final int childCount = getChildCount(); if (childCount > 0) { - if (mFirstPosition == 0 && getChildAt(0).getTop() >= mListPadding.top && + final int firstChildTop = getChildAt(0).getTop(); + final int lastChildBottom = getChildAt(childCount - 1).getBottom(); + final int contentTop = mListPadding.top; + final int contentBottom = getHeight() - mListPadding.bottom; + if (mFirstPosition == 0 && firstChildTop >= contentTop && mFirstPosition + childCount < mItemCount && - getChildAt(childCount - 1).getBottom() <= - getHeight() - mListPadding.bottom) { + lastChildBottom <= getHeight() - contentBottom) { mTouchMode = TOUCH_MODE_REST; reportScrollStateChange(OnScrollListener.SCROLL_STATE_IDLE); } else { final VelocityTracker velocityTracker = mVelocityTracker; velocityTracker.computeCurrentVelocity(1000, mMaximumVelocity); final int initialVelocity = (int) velocityTracker.getYVelocity(mActivePointerId); - - if (Math.abs(initialVelocity) > mMinimumVelocity) { + + // Fling if we have enough velocity and we aren't at a boundary. + // Since we can potentially overfling more than we can overscroll, don't + // allow the weird behavior where you can scroll to a boundary then + // fling further. + if (Math.abs(initialVelocity) > mMinimumVelocity && + !((mFirstPosition == 0 && + firstChildTop == contentTop - mOverscrollDistance) || + (mFirstPosition + childCount == mItemCount && + lastChildBottom == contentBottom + mOverscrollDistance))) { if (mFlingRunnable == null) { mFlingRunnable = new FlingRunnable(); } @@ -2190,10 +2385,32 @@ public abstract class AbsListView extends AdapterView implements Te reportScrollStateChange(OnScrollListener.SCROLL_STATE_IDLE); } break; + + case TOUCH_MODE_OVERSCROLL: + if (mFlingRunnable == null) { + mFlingRunnable = new FlingRunnable(); + } + final VelocityTracker velocityTracker = mVelocityTracker; + velocityTracker.computeCurrentVelocity(1000, mMaximumVelocity); + final int initialVelocity = (int) velocityTracker.getYVelocity(mActivePointerId); + + reportScrollStateChange(OnScrollListener.SCROLL_STATE_FLING); + if (Math.abs(initialVelocity) > mMinimumVelocity) { + mFlingRunnable.startOverfling(-initialVelocity); + } else { + mFlingRunnable.startSpringback(); + } + + break; } setPressed(false); + if (mEdgeGlowTop != null) { + mEdgeGlowTop.onRelease(); + mEdgeGlowBottom.onRelease(); + } + // Need to redraw since we probably aren't drawing the selector anymore invalidate(); @@ -2219,24 +2436,42 @@ public abstract class AbsListView extends AdapterView implements Te } case MotionEvent.ACTION_CANCEL: { - mTouchMode = TOUCH_MODE_REST; - setPressed(false); - View motionView = this.getChildAt(mMotionPosition - mFirstPosition); - if (motionView != null) { - motionView.setPressed(false); - } - clearScrollingCache(); + switch (mTouchMode) { + case TOUCH_MODE_OVERSCROLL: + if (mFlingRunnable == null) { + mFlingRunnable = new FlingRunnable(); + } + mFlingRunnable.startSpringback(); + break; - final Handler handler = getHandler(); - if (handler != null) { - handler.removeCallbacks(mPendingCheckForLongPress); - } + case TOUCH_MODE_OVERFLING: + // Do nothing - let it play out. + break; - if (mVelocityTracker != null) { - mVelocityTracker.recycle(); - mVelocityTracker = null; + default: + mTouchMode = TOUCH_MODE_REST; + setPressed(false); + View motionView = this.getChildAt(mMotionPosition - mFirstPosition); + if (motionView != null) { + motionView.setPressed(false); + } + clearScrollingCache(); + + final Handler handler = getHandler(); + if (handler != null) { + handler.removeCallbacks(mPendingCheckForLongPress); + } + + if (mVelocityTracker != null) { + mVelocityTracker.recycle(); + mVelocityTracker = null; + } } + if (mEdgeGlowTop != null) { + mEdgeGlowTop.onRelease(); + mEdgeGlowBottom.onRelease(); + } mActivePointerId = INVALID_POINTER; break; } @@ -2260,11 +2495,61 @@ public abstract class AbsListView extends AdapterView implements Te return true; } + @Override + protected void onOverscrolled(int scrollX, int scrollY, + boolean clampedX, boolean clampedY) { + mScrollY = scrollY; + + if (clampedY) { + // Velocity is broken by hitting the limit; don't start a fling off of this. + if (mVelocityTracker != null) { + mVelocityTracker.clear(); + } + } + awakenScrollBars(); + } + @Override public void draw(Canvas canvas) { super.draw(canvas); + if (mEdgeGlowTop != null) { + final int scrollY = mScrollY; + if (!mEdgeGlowTop.isFinished()) { + final int restoreCount = canvas.save(); + final int width = getWidth(); + + canvas.translate(-width / 2, scrollY); + mEdgeGlowTop.setSize(width * 2, getHeight()); + if (mEdgeGlowTop.draw(canvas)) { + invalidate(); + } + canvas.restoreToCount(restoreCount); + } + if (!mEdgeGlowBottom.isFinished()) { + final int restoreCount = canvas.save(); + final int width = getWidth(); + final int height = getHeight(); + + canvas.translate(-width / 2, scrollY + height); + canvas.rotate(180, width, 0); + mEdgeGlowBottom.setSize(width * 2, height); + if (mEdgeGlowBottom.draw(canvas)) { + invalidate(); + } + canvas.restoreToCount(restoreCount); + } + } if (mFastScroller != null) { - mFastScroller.draw(canvas); + final int scrollY = mScrollY; + if (scrollY != 0) { + // Pin to the top/bottom during overscroll + int restoreCount = canvas.save(); + canvas.translate(0, (float) scrollY); + mFastScroller.draw(canvas); + canvas.restoreToCount(restoreCount); + } else { + mFastScroller.draw(canvas); + } } } @@ -2283,6 +2568,10 @@ public abstract class AbsListView extends AdapterView implements Te switch (action & MotionEvent.ACTION_MASK) { case MotionEvent.ACTION_DOWN: { int touchMode = mTouchMode; + if (touchMode == TOUCH_MODE_OVERFLING || touchMode == TOUCH_MODE_OVERSCROLL) { + mMotionCorrection = 0; + return true; + } final int x = (int) ev.getX(); final int y = (int) ev.getY(); @@ -2347,6 +2636,7 @@ public abstract class AbsListView extends AdapterView implements Te final int newPointerIndex = pointerIndex == 0 ? 1 : 0; mMotionX = (int) ev.getX(newPointerIndex); mMotionY = (int) ev.getY(newPointerIndex); + mMotionCorrection = 0; mActivePointerId = ev.getPointerId(newPointerIndex); if (mVelocityTracker != null) { mVelocityTracker.clear(); @@ -2402,7 +2692,7 @@ public abstract class AbsListView extends AdapterView implements Te /** * Tracks the decay of a fling scroll */ - private final Scroller mScroller; + private final OverScroller mScroller; /** * Y value reported by mScroller on the previous fling @@ -2410,7 +2700,7 @@ public abstract class AbsListView extends AdapterView implements Te private int mLastFlingY; FlingRunnable() { - mScroller = new Scroller(getContext()); + mScroller = new OverScroller(getContext()); } void start(int initialVelocity) { @@ -2429,6 +2719,40 @@ public abstract class AbsListView extends AdapterView implements Te } } + void startSpringback() { + if (mScroller.springback(0, mScrollY, 0, 0, 0, 0)) { + mTouchMode = TOUCH_MODE_OVERFLING; + invalidate(); + post(this); + } else { + mTouchMode = TOUCH_MODE_REST; + } + } + + void startOverfling(int initialVelocity) { + final int min = mScrollY > 0 ? Integer.MIN_VALUE : 0; + final int max = mScrollY > 0 ? 0 : Integer.MAX_VALUE; + mScroller.fling(0, mScrollY, 0, initialVelocity, 0, 0, min, max, 0, getHeight()); + mTouchMode = TOUCH_MODE_OVERFLING; + invalidate(); + post(this); + } + + void edgeReached(int delta) { + mScroller.notifyVerticalEdgeReached(mScrollY, 0, mOverflingDistance); + mTouchMode = TOUCH_MODE_OVERFLING; + if (mEdgeGlowTop != null) { + final int vel = (int) mScroller.getCurrVelocity(); + if (delta > 0) { + mEdgeGlowTop.onAbsorb(vel); + } else { + mEdgeGlowBottom.onAbsorb(vel); + } + } + invalidate(); + post(this); + } + void startScroll(int distance, int duration) { int initialY = distance < 0 ? Integer.MAX_VALUE : 0; mLastFlingY = initialY; @@ -2461,7 +2785,7 @@ public abstract class AbsListView extends AdapterView implements Te return; } - final Scroller scroller = mScroller; + final OverScroller scroller = mScroller; boolean more = scroller.computeScrollOffset(); final int y = scroller.getCurrY(); @@ -2490,7 +2814,24 @@ public abstract class AbsListView extends AdapterView implements Te delta = Math.max(-(getHeight() - mPaddingBottom - mPaddingTop - 1), delta); } + // Check to see if we have bumped into the scroll limit + View motionView = getChildAt(mMotionPosition - mFirstPosition); + int oldTop = 0; + if (motionView != null) { + oldTop = motionView.getTop(); + } + final boolean atEnd = trackMotionScroll(delta, delta); + if (atEnd) { + if (motionView != null) { + // Tweak the scroll for how far we overshot + int overshoot = -(delta - (motionView.getTop() - oldTop)); + overscrollBy(0, overshoot, 0, mScrollY, 0, 0, + 0, mOverflingDistance, false); + } + edgeReached(delta); + break; + } if (more && !atEnd) { invalidate(); @@ -2508,6 +2849,24 @@ public abstract class AbsListView extends AdapterView implements Te } break; } + + case TOUCH_MODE_OVERFLING: { + final OverScroller scroller = mScroller; + if (scroller.computeScrollOffset()) { + final int scrollY = mScrollY; + final int deltaY = scroller.getCurrY() - scrollY; + if (overscrollBy(0, deltaY, 0, scrollY, 0, 0, + 0, mOverflingDistance, false)) { + startSpringback(); + } else { + invalidate(); + post(this); + } + } else { + endFling(); + } + break; + } } } @@ -2864,16 +3223,17 @@ public abstract class AbsListView extends AdapterView implements Te final int firstPosition = mFirstPosition; - if (firstPosition == 0 && firstTop >= listPadding.top && deltaY >= 0) { + if (firstPosition == 0 && firstTop >= listPadding.top && incrementalDeltaY >= 0) { // Don't need to move views down if the top of the first position // is already visible - return true; + return incrementalDeltaY != 0; } - if (firstPosition + childCount == mItemCount && lastBottom <= end && deltaY <= 0) { + if (firstPosition + childCount == mItemCount && lastBottom <= end && + incrementalDeltaY <= 0) { // Don't need to move views up if the bottom of the last position // is already visible - return true; + return incrementalDeltaY != 0; } final boolean down = incrementalDeltaY < 0; diff --git a/core/java/android/widget/EdgeGlow.java b/core/java/android/widget/EdgeGlow.java new file mode 100644 index 0000000000000..e2c7bca25fe16 --- /dev/null +++ b/core/java/android/widget/EdgeGlow.java @@ -0,0 +1,286 @@ +/* + * Copyright (C) 2010 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.widget; + +import android.graphics.Canvas; +import android.graphics.drawable.Drawable; +import android.util.Log; +import android.view.animation.AnimationUtils; +import android.view.animation.DecelerateInterpolator; +import android.view.animation.Interpolator; + +/** + * This class performs the glow effect used at the edges of scrollable widgets. + * @hide + */ +public class EdgeGlow { + private static final String TAG = "EdgeGlow"; + + private static final boolean DEBUG = false; + + // Time it will take the effect to fully recede in ms + private static final int RECEDE_TIME = 1000; + + // Time it will take before a pulled glow begins receding + private static final int PULL_TIME = 250; + + // Time it will take for a pulled glow to decay to partial strength before release + private static final int PULL_DECAY_TIME = 1000; + + private static final float HELD_EDGE_ALPHA = 0.7f; + private static final float HELD_EDGE_SCALE_Y = 0.5f; + private static final float HELD_GLOW_ALPHA = 0.5f; + private static final float HELD_GLOW_SCALE_Y = 0.5f; + + private static final float PULL_GLOW_BEGIN = 0.5f; + + // Minimum velocity that will be absorbed + private static final int MIN_VELOCITY = 750; + + private static final float EPSILON = 0.001f; + + private Drawable mEdge; + private Drawable mGlow; + private int mWidth; + private int mHeight; + + private float mEdgeAlpha; + private float mEdgeScaleY; + private float mGlowAlpha; + private float mGlowScaleY; + + private float mEdgeAlphaStart; + private float mEdgeAlphaFinish; + private float mEdgeScaleYStart; + private float mEdgeScaleYFinish; + private float mGlowAlphaStart; + private float mGlowAlphaFinish; + private float mGlowScaleYStart; + private float mGlowScaleYFinish; + + private long mStartTime; + private int mDuration; + + private Interpolator mInterpolator; + + private static final int STATE_IDLE = 0; + private static final int STATE_PULL = 1; + private static final int STATE_ABSORB = 2; + private static final int STATE_RECEDE = 3; + private static final int STATE_PULL_DECAY = 4; + + private int mState = STATE_IDLE; + + private float mPullDistance; + + public EdgeGlow(Drawable edge, Drawable glow) { + mEdge = edge; + mGlow = glow; + + mInterpolator = new DecelerateInterpolator(); + } + + public void setSize(int width, int height) { + mWidth = width; + mHeight = height; + } + + public boolean isFinished() { + return mState == STATE_IDLE; + } + + /** + * Call when the object is pulled by the user. + * @param deltaDistance Change in distance since the last call + */ + public void onPull(float deltaDistance) { + final long now = AnimationUtils.currentAnimationTimeMillis(); + if (mState == STATE_PULL_DECAY && now - mStartTime < mDuration) { + return; + } + if (mState != STATE_PULL) { + mGlowScaleY = PULL_GLOW_BEGIN; + } + mState = STATE_PULL; + + mStartTime = now; + mDuration = PULL_TIME; + + mPullDistance += deltaDistance; + float distance = Math.abs(mPullDistance); + + mEdgeAlpha = mEdgeAlphaStart = Math.max(HELD_EDGE_ALPHA, Math.min(distance, 1.f)); + mEdgeScaleY = mEdgeScaleYStart = Math.max(HELD_EDGE_SCALE_Y, Math.min(distance, 2.f)); + + mGlowAlpha = mGlowAlphaStart = Math.max(0.5f, + Math.min(mGlowAlpha + Math.abs(deltaDistance), 1.f)); + + float glowChange = Math.abs(deltaDistance); + if (deltaDistance > 0 && mPullDistance < 0) { + glowChange = -glowChange; + } + if (mPullDistance == 0) { + mGlowScaleY = 0; + } + mGlowScaleY = mGlowScaleYStart = Math.max(0, mGlowScaleY + glowChange * 2); + + mEdgeAlphaFinish = mEdgeAlpha; + mEdgeScaleYFinish = mEdgeScaleY; + mGlowAlphaFinish = mGlowAlpha; + mGlowScaleYFinish = mGlowScaleY; + + if (DEBUG) Log.d(TAG, "onPull(" + distance + ", " + deltaDistance + ")"); + } + + /** + * Call when the object is released after being pulled. + */ + public void onRelease() { + mPullDistance = 0; + + if (mState != STATE_PULL && mState != STATE_PULL_DECAY) { + return; + } + if (DEBUG) Log.d(TAG, "onRelease"); + + mState = STATE_RECEDE; + mEdgeAlphaStart = mEdgeAlpha; + mEdgeScaleYStart = mEdgeScaleY; + mGlowAlphaStart = mGlowAlpha; + mGlowScaleYStart = mGlowScaleY; + + mEdgeAlphaFinish = 0.f; + mEdgeScaleYFinish = 0.1f; + mGlowAlphaFinish = 0.f; + mGlowScaleYFinish = 0.1f; + + mStartTime = AnimationUtils.currentAnimationTimeMillis(); + mDuration = RECEDE_TIME; + } + + /** + * Call when the effect absorbs an impact at the given velocity. + * @param velocity Velocity at impact in pixels per second. + */ + public void onAbsorb(int velocity) { + mState = STATE_ABSORB; + if (DEBUG) Log.d(TAG, "onAbsorb uncooked velocity: " + velocity); + velocity = Math.max(MIN_VELOCITY, Math.abs(velocity)); + + mStartTime = AnimationUtils.currentAnimationTimeMillis(); + mDuration = (int) (velocity * 0.03f); + + mEdgeAlphaStart = 0.5f; + mEdgeScaleYStart = 0.2f; + mGlowAlphaStart = 0.5f; + mGlowScaleYStart = 0.f; + + mEdgeAlphaFinish = Math.max(0, Math.min(velocity * 0.01f, 1)); + mEdgeScaleYFinish = 1.f; + mGlowAlphaFinish = 1.f; + mGlowScaleYFinish = Math.min(velocity * 0.001f, 1); + + if (DEBUG) Log.d(TAG, "onAbsorb(" + velocity + "): duration " + mDuration); + } + + /** + * Draw into the provided canvas. + * Assumes that the canvas has been rotated accordingly and the size has been set. + * The effect will be drawn the full width of X=0 to X=width, emitting from Y=0 and extending + * to some factor < 1.f of height. + * + * @param canvas Canvas to draw into + * @return true if drawing should continue beyond this frame to continue the animation + */ + public boolean draw(Canvas canvas) { + update(); + + final int edgeHeight = mEdge.getIntrinsicHeight(); + final int glowHeight = mGlow.getIntrinsicHeight(); + + mGlow.setAlpha((int) (Math.max(0, Math.min(mGlowAlpha, 1)) * 255)); + mGlow.setBounds(0, 0, mWidth, (int) (glowHeight * mGlowScaleY)); + mGlow.draw(canvas); + + mEdge.setAlpha((int) (Math.max(0, Math.min(mEdgeAlpha, 1)) * 255)); + mEdge.setBounds(0, + 0, + mWidth, + (int) (edgeHeight * mEdgeScaleY)); + mEdge.draw(canvas); + if (DEBUG) Log.d(TAG, "draw() glow(" + mGlowAlpha + ", " + mGlowScaleY + ") edge(" + mEdgeAlpha + + ", " + mEdgeScaleY + ")"); + + return mState != STATE_IDLE; + } + + private void update() { + final long time = AnimationUtils.currentAnimationTimeMillis(); + final float t = Math.min((float) (time - mStartTime) / mDuration, 1.f); + + final float interp = mInterpolator.getInterpolation(t); + + mEdgeAlpha = mEdgeAlphaStart + (mEdgeAlphaFinish - mEdgeAlphaStart) * interp; + mEdgeScaleY = mEdgeScaleYStart + (mEdgeScaleYFinish - mEdgeScaleYStart) * interp; + mGlowAlpha = mGlowAlphaStart + (mGlowAlphaFinish - mGlowAlphaStart) * interp; + mGlowScaleY = mGlowScaleYStart + (mGlowScaleYFinish - mGlowScaleYStart) * interp; + + if (t >= 1.f - EPSILON) { + switch (mState) { + case STATE_ABSORB: + mState = STATE_RECEDE; + mStartTime = AnimationUtils.currentAnimationTimeMillis(); + mDuration = RECEDE_TIME; + + mEdgeAlphaStart = mEdgeAlpha; + mEdgeScaleYStart = mEdgeScaleY; + mGlowAlphaStart = mGlowAlpha; + mGlowScaleYStart = mGlowScaleY; + + mEdgeAlphaFinish = 0.f; + mEdgeScaleYFinish = 0.1f; + mGlowAlphaFinish = 0.f; + mGlowScaleYFinish = mGlowScaleY; + if (DEBUG) Log.d(TAG, "STATE_ABSORB => STATE_RECEDE"); + break; + case STATE_PULL: + mState = STATE_PULL_DECAY; + mStartTime = AnimationUtils.currentAnimationTimeMillis(); + mDuration = PULL_DECAY_TIME; + + mEdgeAlphaStart = mEdgeAlpha; + mEdgeScaleYStart = mEdgeScaleY; + mGlowAlphaStart = mGlowAlpha; + mGlowScaleYStart = mGlowScaleY; + + mEdgeAlphaFinish = Math.min(mEdgeAlphaStart, HELD_EDGE_ALPHA); + mEdgeScaleYFinish = Math.min(mEdgeScaleYStart, HELD_EDGE_SCALE_Y); + mGlowAlphaFinish = Math.min(mGlowAlphaStart, HELD_GLOW_ALPHA); + mGlowScaleYFinish = Math.min(mGlowScaleY, HELD_GLOW_SCALE_Y); + if (DEBUG) Log.d(TAG, "STATE_PULL => STATE_PULL_DECAY"); + break; + case STATE_PULL_DECAY: + // Do nothing; wait for release + break; + case STATE_RECEDE: + mState = STATE_IDLE; + if (DEBUG) Log.d(TAG, "STATE_RECEDE => STATE_IDLE"); + break; + } + } + } +} diff --git a/core/java/android/widget/GridView.java b/core/java/android/widget/GridView.java index 2f86d756b07aa..a7300c288bf3d 100644 --- a/core/java/android/widget/GridView.java +++ b/core/java/android/widget/GridView.java @@ -1876,7 +1876,12 @@ public class GridView extends AbsListView { // TODO: Account for vertical spacing too final int numColumns = mNumColumns; final int rowCount = (mItemCount + numColumns - 1) / numColumns; - return Math.max(rowCount * 100, 0); + int result = Math.max(rowCount * 100, 0); + if (mScrollY != 0) { + // Compensate for overscroll + result += Math.abs((int) ((float) mScrollY / getHeight() * rowCount * 100)); + } + return result; } } diff --git a/core/java/android/widget/HorizontalScrollView.java b/core/java/android/widget/HorizontalScrollView.java index 32a91464f4bee..3493f498caa89 100644 --- a/core/java/android/widget/HorizontalScrollView.java +++ b/core/java/android/widget/HorizontalScrollView.java @@ -16,19 +16,24 @@ package android.widget; -import android.content.Context; -import android.content.res.TypedArray; -import android.graphics.Rect; +import com.android.internal.R; + import android.util.AttributeSet; -import android.view.FocusFinder; -import android.view.KeyEvent; -import android.view.MotionEvent; -import android.view.VelocityTracker; +import android.graphics.Canvas; +import android.graphics.Rect; +import android.graphics.drawable.Drawable; import android.view.View; +import android.view.VelocityTracker; import android.view.ViewConfiguration; import android.view.ViewGroup; +import android.view.KeyEvent; +import android.view.FocusFinder; +import android.view.MotionEvent; import android.view.ViewParent; import android.view.animation.AnimationUtils; +import android.content.Context; +import android.content.res.Resources; +import android.content.res.TypedArray; import java.util.List; @@ -63,7 +68,9 @@ public class HorizontalScrollView extends FrameLayout { private long mLastScroll; private final Rect mTempRect = new Rect(); - private Scroller mScroller; + private OverScroller mScroller; + private EdgeGlow mEdgeGlowLeft; + private EdgeGlow mEdgeGlowRight; /** * Flag to indicate that we are moving focus ourselves. This is so the @@ -117,6 +124,9 @@ public class HorizontalScrollView extends FrameLayout { private int mMinimumVelocity; private int mMaximumVelocity; + private int mOverscrollDistance; + private int mOverflingDistance; + /** * ID of the active pointer. This is used to retain consistency during * drags/flings if multiple pointers are used. @@ -189,7 +199,7 @@ public class HorizontalScrollView extends FrameLayout { private void initScrollView() { - mScroller = new Scroller(getContext()); + mScroller = new OverScroller(getContext()); setFocusable(true); setDescendantFocusability(FOCUS_AFTER_DESCENDANTS); setWillNotDraw(false); @@ -197,6 +207,8 @@ public class HorizontalScrollView extends FrameLayout { mTouchSlop = configuration.getScaledTouchSlop(); mMinimumVelocity = configuration.getScaledMinimumFlingVelocity(); mMaximumVelocity = configuration.getScaledMaximumFlingVelocity(); + mOverscrollDistance = configuration.getScaledOverscrollDistance(); + mOverflingDistance = configuration.getScaledOverflingDistance(); } @Override @@ -456,6 +468,9 @@ public class HorizontalScrollView extends FrameLayout { /* Release the drag */ mIsBeingDragged = false; mActivePointerId = INVALID_POINTER; + if (mScroller.springback(mScrollX, mScrollY, 0, getScrollRange(), 0, 0)) { + invalidate(); + } break; case MotionEvent.ACTION_POINTER_UP: onSecondaryPointerUp(ev); @@ -513,7 +528,22 @@ public class HorizontalScrollView extends FrameLayout { final int deltaX = (int) (mLastMotionX - x); mLastMotionX = x; - scrollBy(deltaX, 0); + final int oldX = mScrollX; + final int oldY = mScrollY; + final int range = getScrollRange(); + if (overscrollBy(deltaX, 0, mScrollX, 0, range, 0, + mOverscrollDistance, 0, true)) { + // Break our velocity if we hit a scroll barrier. + mVelocityTracker.clear(); + } + onScrollChanged(mScrollX, mScrollY, oldX, oldY); + + final int pulledToX = oldX + deltaX; + if (pulledToX < 0) { + mEdgeGlowLeft.onPull((float) deltaX / getWidth()); + } else if (pulledToX > range) { + mEdgeGlowRight.onPull((float) deltaX / getWidth()); + } } break; case MotionEvent.ACTION_UP: @@ -522,8 +552,15 @@ public class HorizontalScrollView extends FrameLayout { velocityTracker.computeCurrentVelocity(1000, mMaximumVelocity); int initialVelocity = (int) velocityTracker.getXVelocity(mActivePointerId); - if (getChildCount() > 0 && Math.abs(initialVelocity) > mMinimumVelocity) { - fling(-initialVelocity); + if (getChildCount() > 0) { + if ((Math.abs(initialVelocity) > mMinimumVelocity)) { + fling(-initialVelocity); + } else { + final int right = getScrollRange(); + if (mScroller.springback(mScrollX, mScrollY, 0, right, 0, 0)) { + invalidate(); + } + } } mActivePointerId = INVALID_POINTER; @@ -533,16 +570,27 @@ public class HorizontalScrollView extends FrameLayout { mVelocityTracker.recycle(); mVelocityTracker = null; } + if (mEdgeGlowLeft != null) { + mEdgeGlowLeft.onRelease(); + mEdgeGlowRight.onRelease(); + } } break; case MotionEvent.ACTION_CANCEL: if (mIsBeingDragged && getChildCount() > 0) { + if (mScroller.springback(mScrollX, mScrollY, 0, getScrollRange(), 0, 0)) { + invalidate(); + } mActivePointerId = INVALID_POINTER; mIsBeingDragged = false; if (mVelocityTracker != null) { mVelocityTracker.recycle(); mVelocityTracker = null; } + if (mEdgeGlowLeft != null) { + mEdgeGlowLeft.onRelease(); + mEdgeGlowRight.onRelease(); + } } break; case MotionEvent.ACTION_POINTER_UP: @@ -569,6 +617,22 @@ public class HorizontalScrollView extends FrameLayout { } } + @Override + protected void onOverscrolled(int scrollX, int scrollY, + boolean clampedX, boolean clampedY) { + // Treat animating scrolls differently; see #computeScroll() for why. + if (!mScroller.isFinished()) { + mScrollX = scrollX; + mScrollY = scrollY; + if (clampedX) { + mScroller.springback(mScrollX, mScrollY, 0, getScrollRange(), 0, 0); + } + } else { + super.scrollTo(scrollX, scrollY); + } + awakenScrollBars(); + } + private int getScrollRange() { int scrollRange = 0; if (getChildCount() > 0) { @@ -951,7 +1015,16 @@ public class HorizontalScrollView extends FrameLayout { return contentWidth; } - return getChildAt(0).getRight(); + int scrollRange = getChildAt(0).getRight(); + final int scrollX = mScrollX; + final int overscrollRight = Math.max(0, scrollRange - contentWidth); + if (scrollX < 0) { + scrollRange -= scrollX; + } else if (scrollX > overscrollRight) { + scrollRange += scrollX - overscrollRight; + } + + return scrollRange; } @Override @@ -1012,14 +1085,16 @@ public class HorizontalScrollView extends FrameLayout { int x = mScroller.getCurrX(); int y = mScroller.getCurrY(); - if (getChildCount() > 0) { - View child = getChildAt(0); - x = clamp(x, getWidth() - mPaddingRight - mPaddingLeft, child.getWidth()); - y = clamp(y, getHeight() - mPaddingBottom - mPaddingTop, child.getHeight()); - if (x != oldX || y != oldY) { - mScrollX = x; - mScrollY = y; - onScrollChanged(x, y, oldX, oldY); + if (oldX != x || oldY != y) { + overscrollBy(x - oldX, y - oldY, oldX, oldY, getScrollRange(), 0, + mOverflingDistance, 0, false); + onScrollChanged(mScrollX, mScrollY, oldX, oldY); + + final int range = getScrollRange(); + if (x < 0 && oldX >= 0) { + mEdgeGlowLeft.onAbsorb((int) mScroller.getCurrVelocity()); + } else if (x > range && oldX <= range) { + mEdgeGlowRight.onAbsorb((int) mScroller.getCurrVelocity()); } } awakenScrollBars(); @@ -1256,7 +1331,7 @@ public class HorizontalScrollView extends FrameLayout { int right = getChildAt(0).getWidth(); mScroller.fling(mScrollX, mScrollY, velocityX, 0, 0, - Math.max(0, right - width), 0, 0); + Math.max(0, right - width), 0, 0, width/2, 0); final boolean movingRight = velocityX > 0; @@ -1294,6 +1369,56 @@ public class HorizontalScrollView extends FrameLayout { } } + @Override + public void setOverscrollMode(int mode) { + if (mode != OVERSCROLL_NEVER) { + if (mEdgeGlowLeft == null) { + final Resources res = getContext().getResources(); + final Drawable edge = res.getDrawable(R.drawable.edge_light); + final Drawable glow = res.getDrawable(R.drawable.overscroll_glow); + mEdgeGlowLeft = new EdgeGlow(edge, glow); + mEdgeGlowRight = new EdgeGlow(edge, glow); + } + } else { + mEdgeGlowLeft = null; + mEdgeGlowRight = null; + } + super.setOverscrollMode(mode); + } + + @Override + public void draw(Canvas canvas) { + super.draw(canvas); + if (mEdgeGlowLeft != null) { + final int scrollX = mScrollX; + if (!mEdgeGlowLeft.isFinished()) { + final int restoreCount = canvas.save(); + final int height = getHeight(); + + canvas.rotate(270); + canvas.translate(-height * 1.5f, scrollX); + mEdgeGlowLeft.setSize(getHeight() * 2, getWidth()); + if (mEdgeGlowLeft.draw(canvas)) { + invalidate(); + } + canvas.restoreToCount(restoreCount); + } + if (!mEdgeGlowRight.isFinished()) { + final int restoreCount = canvas.save(); + final int width = getWidth(); + final int height = getHeight(); + + canvas.rotate(90); + canvas.translate(-height / 2, -scrollX - width); + mEdgeGlowRight.setSize(height * 2, width); + if (mEdgeGlowRight.draw(canvas)) { + invalidate(); + } + canvas.restoreToCount(restoreCount); + } + } + } + private int clamp(int n, int my, int child) { if (my >= child || n < 0) { return 0; diff --git a/core/java/android/widget/ListView.java b/core/java/android/widget/ListView.java index a3f86249e910f..46cd45aa76637 100644 --- a/core/java/android/widget/ListView.java +++ b/core/java/android/widget/ListView.java @@ -121,6 +121,9 @@ public class ListView extends AbsListView { Drawable mDivider; int mDividerHeight; + Drawable mOverscrollHeader; + Drawable mOverscrollFooter; + private boolean mIsCacheColorOpaque; private boolean mDividerIsOpaque; private boolean mClipDivider; @@ -175,6 +178,16 @@ public class ListView extends AbsListView { setDivider(d); } + final Drawable osHeader = a.getDrawable(com.android.internal.R.styleable.ListView_overscrollHeader); + if (osHeader != null) { + setOverscrollHeader(osHeader); + } + + final Drawable osFooter = a.getDrawable(com.android.internal.R.styleable.ListView_overscrollFooter); + if (osFooter != null) { + setOverscrollFooter(osFooter); + } + // Use the height specified, zero being the default final int dividerHeight = a.getDimensionPixelSize( com.android.internal.R.styleable.ListView_dividerHeight, 0); @@ -2945,14 +2958,52 @@ public class ListView extends AbsListView { } super.setCacheColorHint(color); } - + + void drawOverscrollHeader(Canvas canvas, Drawable drawable, Rect bounds) { + final int height = drawable.getMinimumHeight(); + + canvas.save(); + canvas.clipRect(bounds); + + final int span = bounds.bottom - bounds.top; + if (span < height) { + bounds.top = bounds.bottom - height; + } + + drawable.setBounds(bounds); + drawable.draw(canvas); + + canvas.restore(); + } + + void drawOverscrollFooter(Canvas canvas, Drawable drawable, Rect bounds) { + final int height = drawable.getMinimumHeight(); + + canvas.save(); + canvas.clipRect(bounds); + + final int span = bounds.bottom - bounds.top; + if (span < height) { + bounds.bottom = bounds.top + height; + } + + drawable.setBounds(bounds); + drawable.draw(canvas); + + canvas.restore(); + } + @Override protected void dispatchDraw(Canvas canvas) { // Draw the dividers final int dividerHeight = mDividerHeight; + final Drawable overscrollHeader = mOverscrollHeader; + final Drawable overscrollFooter = mOverscrollFooter; + final boolean drawOverscrollHeader = overscrollHeader != null; + final boolean drawOverscrollFooter = overscrollFooter != null; final boolean drawDividers = dividerHeight > 0 && mDivider != null; - if (drawDividers) { + if (drawDividers || drawOverscrollHeader || drawOverscrollFooter) { // Only modify the top and bottom in the loop, we set the left and right here final Rect bounds = mTempRect; bounds.left = mPaddingLeft; @@ -2983,14 +3034,28 @@ public class ListView extends AbsListView { if (!mStackFromBottom) { int bottom = 0; + // Draw top divider or header for overscroll final int scrollY = mScrollY; + if (count > 0 && scrollY < 0) { + if (drawOverscrollHeader) { + bounds.bottom = 0; + bounds.top = scrollY; + drawOverscrollHeader(canvas, overscrollHeader, bounds); + } else if (drawDividers) { + bounds.bottom = 0; + bounds.top = -dividerHeight; + drawDivider(canvas, bounds, -1); + } + } + for (int i = 0; i < count; i++) { if ((headerDividers || first + i >= headerCount) && (footerDividers || first + i < footerLimit)) { View child = getChildAt(i); bottom = child.getBottom(); // Don't draw dividers next to items that are not enabled - if (drawDividers) { + if (drawDividers && + (bottom < listBottom && !(drawOverscrollFooter && i == count - 1))) { if ((areAllItemsSelectable || (adapter.isEnabled(first + i) && (i == count - 1 || adapter.isEnabled(first + i + 1))))) { @@ -3005,13 +3070,28 @@ public class ListView extends AbsListView { } } } + + final int overFooterBottom = mBottom + mScrollY; + if (drawOverscrollFooter && first + count == itemCount && + overFooterBottom > bottom) { + bounds.top = bottom; + bounds.bottom = overFooterBottom; + drawOverscrollFooter(canvas, overscrollFooter, bounds); + } } else { int top; int listTop = mListPadding.top; final int scrollY = mScrollY; - for (int i = 0; i < count; i++) { + if (count > 0 && drawOverscrollHeader) { + bounds.top = scrollY; + bounds.bottom = getChildAt(0).getTop(); + drawOverscrollHeader(canvas, overscrollHeader, bounds); + } + + final int start = drawOverscrollHeader ? 1 : 0; + for (int i = start; i < count; i++) { if ((headerDividers || first + i >= headerCount) && (footerDividers || first + i < footerLimit)) { View child = getChildAt(i); @@ -3037,10 +3117,17 @@ public class ListView extends AbsListView { } } - if (count > 0 && scrollY > 0 && drawDividers) { - bounds.top = listBottom; - bounds.bottom = listBottom + dividerHeight; - drawDivider(canvas, bounds, -1); + if (count > 0 && scrollY > 0) { + if (drawOverscrollFooter) { + final int absListBottom = mBottom; + bounds.top = absListBottom; + bounds.bottom = absListBottom + scrollY; + drawOverscrollFooter(canvas, overscrollFooter, bounds); + } else if (drawDividers) { + bounds.top = listBottom; + bounds.bottom = listBottom + dividerHeight; + drawDivider(canvas, bounds, -1); + } } } } @@ -3149,6 +3236,45 @@ public class ListView extends AbsListView { invalidate(); } + /** + * Sets the drawable that will be drawn above all other list content. + * This area can become visible when the user overscrolls the list. + * + * @param header The drawable to use + */ + public void setOverscrollHeader(Drawable header) { + mOverscrollHeader = header; + if (mScrollY < 0) { + invalidate(); + } + } + + /** + * @return The drawable that will be drawn above all other list content + */ + public Drawable getOverscrollHeader() { + return mOverscrollHeader; + } + + /** + * Sets the drawable that will be drawn below all other list content. + * This area can become visible when the user overscrolls the list, + * or when the list's content does not fully fill the container area. + * + * @param footer The drawable to use + */ + public void setOverscrollFooter(Drawable footer) { + mOverscrollFooter = footer; + invalidate(); + } + + /** + * @return The drawable that will be drawn below all other list content + */ + public Drawable getOverscrollFooter() { + return mOverscrollFooter; + } + @Override protected void onFocusChanged(boolean gainFocus, int direction, Rect previouslyFocusedRect) { super.onFocusChanged(gainFocus, direction, previouslyFocusedRect); diff --git a/core/java/android/widget/OverScroller.java b/core/java/android/widget/OverScroller.java new file mode 100644 index 0000000000000..93900a0ee6d48 --- /dev/null +++ b/core/java/android/widget/OverScroller.java @@ -0,0 +1,849 @@ +/* + * Copyright (C) 2010 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.widget; + +import android.content.Context; +import android.hardware.SensorManager; +import android.util.FloatMath; +import android.view.ViewConfiguration; +import android.view.animation.AnimationUtils; +import android.view.animation.Interpolator; + +/** + * This class encapsulates scrolling with the ability to overshoot the bounds + * of a scrolling operation. This class is a drop-in replacement for + * {@link android.widget.Scroller} in most cases. + */ +public class OverScroller { + private int mMode; + + private MagneticOverScroller mScrollerX; + private MagneticOverScroller mScrollerY; + + private final Interpolator mInterpolator; + + private static final int DEFAULT_DURATION = 250; + private static final int SCROLL_MODE = 0; + private static final int FLING_MODE = 1; + + /** + * Creates an OverScroller with a viscous fluid scroll interpolator. + * @param context + */ + public OverScroller(Context context) { + this(context, null); + } + + /** + * Creates an OverScroller with default edge bounce coefficients. + * @param context The context of this application. + * @param interpolator The scroll interpolator. If null, a default (viscous) interpolator will + * be used. + */ + public OverScroller(Context context, Interpolator interpolator) { + this(context, interpolator, MagneticOverScroller.DEFAULT_BOUNCE_COEFFICIENT, + MagneticOverScroller.DEFAULT_BOUNCE_COEFFICIENT); + } + + /** + * Creates an OverScroller. + * @param context The context of this application. + * @param interpolator The scroll interpolator. If null, a default (viscous) interpolator will + * be used. + * @param bounceCoefficientX A value between 0 and 1 that will determine the proportion of the + * velocity which is preserved in the bounce when the horizontal edge is reached. A null value + * means no bounce. + * @param bounceCoefficientY Same as bounceCoefficientX but for the vertical direction. + */ + public OverScroller(Context context, Interpolator interpolator, + float bounceCoefficientX, float bounceCoefficientY) { + mInterpolator = interpolator; + mScrollerX = new MagneticOverScroller(); + mScrollerY = new MagneticOverScroller(); + MagneticOverScroller.initializeFromContext(context); + + mScrollerX.setBounceCoefficient(bounceCoefficientX); + mScrollerY.setBounceCoefficient(bounceCoefficientY); + } + + /** + * + * Returns whether the scroller has finished scrolling. + * + * @return True if the scroller has finished scrolling, false otherwise. + */ + public final boolean isFinished() { + return mScrollerX.mFinished && mScrollerY.mFinished; + } + + /** + * Force the finished field to a particular value. Contrary to + * {@link #abortAnimation()}, forcing the animation to finished + * does NOT cause the scroller to move to the final x and y + * position. + * + * @param finished The new finished value. + */ + public final void forceFinished(boolean finished) { + mScrollerX.mFinished = mScrollerY.mFinished = finished; + } + + /** + * Returns the current X offset in the scroll. + * + * @return The new X offset as an absolute distance from the origin. + */ + public final int getCurrX() { + return mScrollerX.mCurrentPosition; + } + + /** + * Returns the current Y offset in the scroll. + * + * @return The new Y offset as an absolute distance from the origin. + */ + public final int getCurrY() { + return mScrollerY.mCurrentPosition; + } + + /** + * @hide + * Returns the current velocity. + * + * @return The original velocity less the deceleration, norm of the X and Y velocity vector. + */ + public float getCurrVelocity() { + float squaredNorm = mScrollerX.mCurrVelocity * mScrollerX.mCurrVelocity; + squaredNorm += mScrollerY.mCurrVelocity * mScrollerY.mCurrVelocity; + return FloatMath.sqrt(squaredNorm); + } + + /** + * Returns the start X offset in the scroll. + * + * @return The start X offset as an absolute distance from the origin. + */ + public final int getStartX() { + return mScrollerX.mStart; + } + + /** + * Returns the start Y offset in the scroll. + * + * @return The start Y offset as an absolute distance from the origin. + */ + public final int getStartY() { + return mScrollerY.mStart; + } + + /** + * Returns where the scroll will end. Valid only for "fling" scrolls. + * + * @return The final X offset as an absolute distance from the origin. + */ + public final int getFinalX() { + return mScrollerX.mFinal; + } + + /** + * Returns where the scroll will end. Valid only for "fling" scrolls. + * + * @return The final Y offset as an absolute distance from the origin. + */ + public final int getFinalY() { + return mScrollerY.mFinal; + } + + /** + * Returns how long the scroll event will take, in milliseconds. + * + * @return The duration of the scroll in milliseconds. + * + * @hide Pending removal once nothing depends on it + * @deprecated OverScrollers don't necessarily have a fixed duration. + * This function will lie to the best of its ability. + */ + public final int getDuration() { + return Math.max(mScrollerX.mDuration, mScrollerY.mDuration); + } + + /** + * Extend the scroll animation. This allows a running animation to scroll + * further and longer, when used with {@link #setFinalX(int)} or {@link #setFinalY(int)}. + * + * @param extend Additional time to scroll in milliseconds. + * @see #setFinalX(int) + * @see #setFinalY(int) + * + * @hide Pending removal once nothing depends on it + * @deprecated OverScrollers don't necessarily have a fixed duration. + * Instead of setting a new final position and extending + * the duration of an existing scroll, use startScroll + * to begin a new animation. + */ + public void extendDuration(int extend) { + mScrollerX.extendDuration(extend); + mScrollerY.extendDuration(extend); + } + + /** + * Sets the final position (X) for this scroller. + * + * @param newX The new X offset as an absolute distance from the origin. + * @see #extendDuration(int) + * @see #setFinalY(int) + * + * @hide Pending removal once nothing depends on it + * @deprecated OverScroller's final position may change during an animation. + * Instead of setting a new final position and extending + * the duration of an existing scroll, use startScroll + * to begin a new animation. + */ + public void setFinalX(int newX) { + mScrollerX.setFinalPosition(newX); + } + + /** + * Sets the final position (Y) for this scroller. + * + * @param newY The new Y offset as an absolute distance from the origin. + * @see #extendDuration(int) + * @see #setFinalX(int) + * + * @hide Pending removal once nothing depends on it + * @deprecated OverScroller's final position may change during an animation. + * Instead of setting a new final position and extending + * the duration of an existing scroll, use startScroll + * to begin a new animation. + */ + public void setFinalY(int newY) { + mScrollerY.setFinalPosition(newY); + } + + /** + * Call this when you want to know the new location. If it returns true, the + * animation is not yet finished. + */ + public boolean computeScrollOffset() { + if (isFinished()) { + return false; + } + + switch (mMode) { + case SCROLL_MODE: + long time = AnimationUtils.currentAnimationTimeMillis(); + // Any scroller can be used for time, since they were started + // together in scroll mode. We use X here. + final long elapsedTime = time - mScrollerX.mStartTime; + + final int duration = mScrollerX.mDuration; + if (elapsedTime < duration) { + float q = (float) (elapsedTime) / duration; + + if (mInterpolator == null) + q = Scroller.viscousFluid(q); + else + q = mInterpolator.getInterpolation(q); + + mScrollerX.updateScroll(q); + mScrollerY.updateScroll(q); + } else { + abortAnimation(); + } + break; + + case FLING_MODE: + if (!mScrollerX.mFinished) { + if (!mScrollerX.update()) { + if (!mScrollerX.continueWhenFinished()) { + mScrollerX.finish(); + } + } + } + + if (!mScrollerY.mFinished) { + if (!mScrollerY.update()) { + if (!mScrollerY.continueWhenFinished()) { + mScrollerY.finish(); + } + } + } + + break; + } + + return true; + } + + /** + * Start scrolling by providing a starting point and the distance to travel. + * The scroll will use the default value of 250 milliseconds for the + * duration. + * + * @param startX Starting horizontal scroll offset in pixels. Positive + * numbers will scroll the content to the left. + * @param startY Starting vertical scroll offset in pixels. Positive numbers + * will scroll the content up. + * @param dx Horizontal distance to travel. Positive numbers will scroll the + * content to the left. + * @param dy Vertical distance to travel. Positive numbers will scroll the + * content up. + */ + public void startScroll(int startX, int startY, int dx, int dy) { + startScroll(startX, startY, dx, dy, DEFAULT_DURATION); + } + + /** + * Start scrolling by providing a starting point and the distance to travel. + * + * @param startX Starting horizontal scroll offset in pixels. Positive + * numbers will scroll the content to the left. + * @param startY Starting vertical scroll offset in pixels. Positive numbers + * will scroll the content up. + * @param dx Horizontal distance to travel. Positive numbers will scroll the + * content to the left. + * @param dy Vertical distance to travel. Positive numbers will scroll the + * content up. + * @param duration Duration of the scroll in milliseconds. + */ + public void startScroll(int startX, int startY, int dx, int dy, int duration) { + mMode = SCROLL_MODE; + mScrollerX.startScroll(startX, dx, duration); + mScrollerY.startScroll(startY, dy, duration); + } + + /** + * Call this when you want to 'spring back' into a valid coordinate range. + * + * @param startX Starting X coordinate + * @param startY Starting Y coordinate + * @param minX Minimum valid X value + * @param maxX Maximum valid X value + * @param minY Minimum valid Y value + * @param maxY Minimum valid Y value + * @return true if a springback was initiated, false if startX and startY were + * already within the valid range. + */ + public boolean springback(int startX, int startY, int minX, int maxX, int minY, int maxY) { + mMode = FLING_MODE; + + // Make sure both methods are called. + final boolean spingbackX = mScrollerX.springback(startX, minX, maxX); + final boolean spingbackY = mScrollerY.springback(startY, minY, maxY); + return spingbackX || spingbackY; + } + + public void fling(int startX, int startY, int velocityX, int velocityY, + int minX, int maxX, int minY, int maxY) { + fling(startX, startY, velocityX, velocityY, minX, maxX, minY, maxY, 0, 0); + } + + /** + * Start scrolling based on a fling gesture. The distance traveled will + * depend on the initial velocity of the fling. + * + * @param startX Starting point of the scroll (X) + * @param startY Starting point of the scroll (Y) + * @param velocityX Initial velocity of the fling (X) measured in pixels per + * second. + * @param velocityY Initial velocity of the fling (Y) measured in pixels per + * second + * @param minX Minimum X value. The scroller will not scroll past this point + * unless overX > 0. If overfling is allowed, it will use minX as + * a springback boundary. + * @param maxX Maximum X value. The scroller will not scroll past this point + * unless overX > 0. If overfling is allowed, it will use maxX as + * a springback boundary. + * @param minY Minimum Y value. The scroller will not scroll past this point + * unless overY > 0. If overfling is allowed, it will use minY as + * a springback boundary. + * @param maxY Maximum Y value. The scroller will not scroll past this point + * unless overY > 0. If overfling is allowed, it will use maxY as + * a springback boundary. + * @param overX Overfling range. If > 0, horizontal overfling in either + * direction will be possible. + * @param overY Overfling range. If > 0, vertical overfling in either + * direction will be possible. + */ + public void fling(int startX, int startY, int velocityX, int velocityY, + int minX, int maxX, int minY, int maxY, int overX, int overY) { + mMode = FLING_MODE; + mScrollerX.fling(startX, velocityX, minX, maxX, overX); + mScrollerY.fling(startY, velocityY, minY, maxY, overY); + } + + /** + * Notify the scroller that we've reached a horizontal boundary. + * Normally the information to handle this will already be known + * when the animation is started, such as in a call to one of the + * fling functions. However there are cases where this cannot be known + * in advance. This function will transition the current motion and + * animate from startX to finalX as appropriate. + * + * @param startX Starting/current X position + * @param finalX Desired final X position + * @param overX Magnitude of overscroll allowed. This should be the maximum + * desired distance from finalX. Absolute value - must be positive. + */ + public void notifyHorizontalEdgeReached(int startX, int finalX, int overX) { + mScrollerX.notifyEdgeReached(startX, finalX, overX); + } + + /** + * Notify the scroller that we've reached a vertical boundary. + * Normally the information to handle this will already be known + * when the animation is started, such as in a call to one of the + * fling functions. However there are cases where this cannot be known + * in advance. This function will animate a parabolic motion from + * startY to finalY. + * + * @param startY Starting/current Y position + * @param finalY Desired final Y position + * @param overY Magnitude of overscroll allowed. This should be the maximum + * desired distance from finalY. + */ + public void notifyVerticalEdgeReached(int startY, int finalY, int overY) { + mScrollerY.notifyEdgeReached(startY, finalY, overY); + } + + /** + * Returns whether the current Scroller is currently returning to a valid position. + * Valid bounds were provided by the + * {@link #fling(int, int, int, int, int, int, int, int, int, int)} method. + * + * One should check this value before calling + * {@link #startScroll(int, int, int, int)} as the interpolation currently in progress + * to restore a valid position will then be stopped. The caller has to take into account + * the fact that the started scroll will start from an overscrolled position. + * + * @return true when the current position is overscrolled and in the process of + * interpolating back to a valid value. + */ + public boolean isOverscrolled() { + return ((!mScrollerX.mFinished && + mScrollerX.mState != MagneticOverScroller.TO_EDGE) || + (!mScrollerY.mFinished && + mScrollerY.mState != MagneticOverScroller.TO_EDGE)); + } + + /** + * Stops the animation. Contrary to {@link #forceFinished(boolean)}, + * aborting the animating causes the scroller to move to the final x and y + * positions. + * + * @see #forceFinished(boolean) + */ + public void abortAnimation() { + mScrollerX.finish(); + mScrollerY.finish(); + } + + /** + * Returns the time elapsed since the beginning of the scrolling. + * + * @return The elapsed time in milliseconds. + * + * @hide + */ + public int timePassed() { + final long time = AnimationUtils.currentAnimationTimeMillis(); + final long startTime = Math.min(mScrollerX.mStartTime, mScrollerY.mStartTime); + return (int) (time - startTime); + } + + static class MagneticOverScroller { + // Initial position + int mStart; + + // Current position + int mCurrentPosition; + + // Final position + int mFinal; + + // Initial velocity + int mVelocity; + + // Current velocity + float mCurrVelocity; + + // Constant current deceleration + float mDeceleration; + + // Animation starting time, in system milliseconds + long mStartTime; + + // Animation duration, in milliseconds + int mDuration; + + // Whether the animation is currently in progress + boolean mFinished; + + // Constant gravity value, used to scale deceleration + static float GRAVITY; + + static void initializeFromContext(Context context) { + final float ppi = context.getResources().getDisplayMetrics().density * 160.0f; + GRAVITY = SensorManager.GRAVITY_EARTH // g (m/s^2) + * 39.37f // inch/meter + * ppi // pixels per inch + * ViewConfiguration.getScrollFriction(); + } + + private static final int TO_EDGE = 0; + private static final int TO_BOUNDARY = 1; + private static final int TO_BOUNCE = 2; + + private int mState = TO_EDGE; + + // The allowed overshot distance before boundary is reached. + private int mOver; + + // Duration in milliseconds to go back from edge to edge. Springback is half of it. + private static final int OVERSCROLL_SPRINGBACK_DURATION = 200; + + // Oscillation period + private static final float TIME_COEF = + 1000.0f * (float) Math.PI / OVERSCROLL_SPRINGBACK_DURATION; + + // If the velocity is smaller than this value, no bounce is triggered + // when the edge limits are reached (would result in a zero pixels + // displacement anyway). + private static final float MINIMUM_VELOCITY_FOR_BOUNCE = 140.0f; + + // Proportion of the velocity that is preserved when the edge is reached. + private static final float DEFAULT_BOUNCE_COEFFICIENT = 0.16f; + + private float mBounceCoefficient = DEFAULT_BOUNCE_COEFFICIENT; + + MagneticOverScroller() { + mFinished = true; + } + + void updateScroll(float q) { + mCurrentPosition = mStart + Math.round(q * (mFinal - mStart)); + } + + /* + * Get a signed deceleration that will reduce the velocity. + */ + static float getDeceleration(int velocity) { + return velocity > 0 ? -GRAVITY : GRAVITY; + } + + /* + * Returns the time (in milliseconds) it will take to go from start to end. + */ + static int computeDuration(int start, int end, float initialVelocity, float deceleration) { + final int distance = start - end; + final float discriminant = initialVelocity * initialVelocity - 2.0f * deceleration + * distance; + if (discriminant >= 0.0f) { + float delta = (float) Math.sqrt(discriminant); + if (deceleration < 0.0f) { + delta = -delta; + } + return (int) (1000.0f * (-initialVelocity - delta) / deceleration); + } + + // End position can not be reached + return 0; + } + + void startScroll(int start, int distance, int duration) { + mFinished = false; + + mStart = start; + mFinal = start + distance; + + mStartTime = AnimationUtils.currentAnimationTimeMillis(); + mDuration = duration; + + // Unused + mDeceleration = 0.0f; + mVelocity = 0; + } + + void fling(int start, int velocity, int min, int max) { + mFinished = false; + + mStart = start; + mStartTime = AnimationUtils.currentAnimationTimeMillis(); + + mVelocity = velocity; + + mDeceleration = getDeceleration(velocity); + + // A start from an invalid position immediately brings back to a valid position + if (mStart < min) { + mDuration = 0; + mFinal = min; + return; + } + + if (mStart > max) { + mDuration = 0; + mFinal = max; + return; + } + + // Duration are expressed in milliseconds + mDuration = (int) (-1000.0f * velocity / mDeceleration); + + mFinal = start - Math.round((velocity * velocity) / (2.0f * mDeceleration)); + + // Clamp to a valid final position + if (mFinal < min) { + mFinal = min; + mDuration = computeDuration(mStart, min, mVelocity, mDeceleration); + } + + if (mFinal > max) { + mFinal = max; + mDuration = computeDuration(mStart, max, mVelocity, mDeceleration); + } + } + + void finish() { + mCurrentPosition = mFinal; + // Not reset since WebView relies on this value for fast fling. + // mCurrVelocity = 0.0f; + mFinished = true; + } + + void setFinalPosition(int position) { + mFinal = position; + mFinished = false; + } + + void extendDuration(int extend) { + final long time = AnimationUtils.currentAnimationTimeMillis(); + final int elapsedTime = (int) (time - mStartTime); + mDuration = elapsedTime + extend; + mFinished = false; + } + + void setBounceCoefficient(float coefficient) { + mBounceCoefficient = coefficient; + } + + boolean springback(int start, int min, int max) { + mFinished = true; + + mStart = start; + mVelocity = 0; + + mStartTime = AnimationUtils.currentAnimationTimeMillis(); + mDuration = 0; + + if (start < min) { + startSpringback(start, min, false); + } else if (start > max) { + startSpringback(start, max, true); + } + + return !mFinished; + } + + private void startSpringback(int start, int end, boolean positive) { + mFinished = false; + mState = TO_BOUNCE; + mStart = mFinal = end; + mDuration = OVERSCROLL_SPRINGBACK_DURATION; + mStartTime -= OVERSCROLL_SPRINGBACK_DURATION / 2; + mVelocity = (int) (Math.abs(end - start) * TIME_COEF * (positive ? 1.0 : -1.0f)); + } + + void fling(int start, int velocity, int min, int max, int over) { + mState = TO_EDGE; + mOver = over; + + mFinished = false; + + mStart = start; + mStartTime = AnimationUtils.currentAnimationTimeMillis(); + + mVelocity = velocity; + + mDeceleration = getDeceleration(velocity); + + // Duration are expressed in milliseconds + mDuration = (int) (-1000.0f * velocity / mDeceleration); + + mFinal = start - Math.round((velocity * velocity) / (2.0f * mDeceleration)); + + // Clamp to a valid final position + if (mFinal < min) { + mFinal = min; + mDuration = computeDuration(mStart, min, mVelocity, mDeceleration); + } + + if (mFinal > max) { + mFinal = max; + mDuration = computeDuration(mStart, max, mVelocity, mDeceleration); + } + + if (start > max) { + if (start >= max + over) { + springback(max + over, min, max); + } else { + if (velocity <= 0) { + springback(start, min, max); + } else { + long time = AnimationUtils.currentAnimationTimeMillis(); + final double durationSinceEdge = + Math.atan((start-max) * TIME_COEF / velocity) / TIME_COEF; + mStartTime = (int) (time - 1000.0f * durationSinceEdge); + + // Simulate a bounce that started from edge + mStart = max; + + mVelocity = (int) (velocity / Math.cos(durationSinceEdge * TIME_COEF)); + + onEdgeReached(); + } + } + } else { + if (start < min) { + if (start <= min - over) { + springback(min - over, min, max); + } else { + if (velocity >= 0) { + springback(start, min, max); + } else { + long time = AnimationUtils.currentAnimationTimeMillis(); + final double durationSinceEdge = + Math.atan((start-min) * TIME_COEF / velocity) / TIME_COEF; + mStartTime = (int) (time - 1000.0f * durationSinceEdge); + + // Simulate a bounce that started from edge + mStart = min; + + mVelocity = (int) (velocity / Math.cos(durationSinceEdge * TIME_COEF)); + + onEdgeReached(); + } + + } + } + } + } + + void notifyEdgeReached(int start, int end, int over) { + mDeceleration = getDeceleration(mVelocity); + + // Local time, used to compute edge crossing time. + float timeCurrent = mCurrVelocity / mDeceleration; + final int distance = end - start; + float timeEdge = -(float) Math.sqrt((2.0f * distance / mDeceleration) + + (timeCurrent * timeCurrent)); + + mVelocity = (int) (mDeceleration * timeEdge); + + // Simulate a symmetric bounce that started from edge + mStart = end; + + mOver = over; + + long time = AnimationUtils.currentAnimationTimeMillis(); + mStartTime = (int) (time - 1000.0f * (timeCurrent - timeEdge)); + + onEdgeReached(); + } + + private void onEdgeReached() { + // mStart, mVelocity and mStartTime were adjusted to their values when edge was reached. + final float distance = mVelocity / TIME_COEF; + + if (Math.abs(distance) < mOver) { + // Spring force will bring us back to final position + mState = TO_BOUNCE; + mFinal = mStart; + mDuration = OVERSCROLL_SPRINGBACK_DURATION; + } else { + // Velocity is too high, we will hit the boundary limit + mState = TO_BOUNDARY; + int over = mVelocity > 0 ? mOver : -mOver; + mFinal = mStart + over; + mDuration = (int) (1000.0f * Math.asin(over / distance) / TIME_COEF); + } + } + + boolean continueWhenFinished() { + switch (mState) { + case TO_EDGE: + // Duration from start to null velocity + int duration = (int) (-1000.0f * mVelocity / mDeceleration); + if (mDuration < duration) { + // If the animation was clamped, we reached the edge + mStart = mFinal; + // Speed when edge was reached + mVelocity = (int) (mVelocity + mDeceleration * mDuration / 1000.0f); + mStartTime += mDuration; + onEdgeReached(); + } else { + // Normal stop, no need to continue + return false; + } + break; + case TO_BOUNDARY: + mStartTime += mDuration; + startSpringback(mFinal, mFinal - (mVelocity > 0 ? mOver:-mOver), mVelocity > 0); + break; + case TO_BOUNCE: + //mVelocity = (int) (mVelocity * BOUNCE_COEFFICIENT); + mVelocity = (int) (mVelocity * mBounceCoefficient); + if (Math.abs(mVelocity) < MINIMUM_VELOCITY_FOR_BOUNCE) { + return false; + } + mStartTime += mDuration; + break; + } + + update(); + return true; + } + + /* + * Update the current position and velocity for current time. Returns + * true if update has been done and false if animation duration has been + * reached. + */ + boolean update() { + final long time = AnimationUtils.currentAnimationTimeMillis(); + final long duration = time - mStartTime; + + if (duration > mDuration) { + return false; + } + + double distance; + final float t = duration / 1000.0f; + if (mState == TO_EDGE) { + mCurrVelocity = mVelocity + mDeceleration * t; + distance = mVelocity * t + mDeceleration * t * t / 2.0f; + } else { + final float d = t * TIME_COEF; + mCurrVelocity = mVelocity * (float)Math.cos(d); + distance = mVelocity / TIME_COEF * Math.sin(d); + } + + mCurrentPosition = mStart + (int) distance; + return true; + } + } +} diff --git a/core/java/android/widget/ScrollView.java b/core/java/android/widget/ScrollView.java index 959e982cc3c86..9d971f6b213fe 100644 --- a/core/java/android/widget/ScrollView.java +++ b/core/java/android/widget/ScrollView.java @@ -19,8 +19,11 @@ package android.widget; import com.android.internal.R; import android.content.Context; +import android.content.res.Resources; import android.content.res.TypedArray; +import android.graphics.Canvas; import android.graphics.Rect; +import android.graphics.drawable.Drawable; import android.util.AttributeSet; import android.view.FocusFinder; import android.view.KeyEvent; @@ -59,7 +62,9 @@ public class ScrollView extends FrameLayout { private long mLastScroll; private final Rect mTempRect = new Rect(); - private Scroller mScroller; + private OverScroller mScroller; + private EdgeGlow mEdgeGlowTop; + private EdgeGlow mEdgeGlowBottom; /** * Flag to indicate that we are moving focus ourselves. This is so the @@ -113,6 +118,9 @@ public class ScrollView extends FrameLayout { private int mMinimumVelocity; private int mMaximumVelocity; + private int mOverscrollDistance; + private int mOverflingDistance; + /** * ID of the active pointer. This is used to retain consistency during * drags/flings if multiple pointers are used. @@ -185,7 +193,7 @@ public class ScrollView extends FrameLayout { private void initScrollView() { - mScroller = new Scroller(getContext()); + mScroller = new OverScroller(getContext()); setFocusable(true); setDescendantFocusability(FOCUS_AFTER_DESCENDANTS); setWillNotDraw(false); @@ -193,6 +201,8 @@ public class ScrollView extends FrameLayout { mTouchSlop = configuration.getScaledTouchSlop(); mMinimumVelocity = configuration.getScaledMinimumFlingVelocity(); mMaximumVelocity = configuration.getScaledMaximumFlingVelocity(); + mOverscrollDistance = configuration.getScaledOverscrollDistance(); + mOverflingDistance = configuration.getScaledOverflingDistance(); } @Override @@ -453,6 +463,9 @@ public class ScrollView extends FrameLayout { /* Release the drag */ mIsBeingDragged = false; mActivePointerId = INVALID_POINTER; + if (mScroller.springback(mScrollX, mScrollY, 0, 0, 0, getScrollRange())) { + invalidate(); + } break; case MotionEvent.ACTION_POINTER_UP: onSecondaryPointerUp(ev); @@ -510,7 +523,22 @@ public class ScrollView extends FrameLayout { final int deltaY = (int) (mLastMotionY - y); mLastMotionY = y; - scrollBy(0, deltaY); + final int oldX = mScrollX; + final int oldY = mScrollY; + final int range = getScrollRange(); + if (overscrollBy(0, deltaY, 0, mScrollY, 0, range, + 0, mOverscrollDistance, true)) { + // Break our velocity if we hit a scroll barrier. + mVelocityTracker.clear(); + } + onScrollChanged(mScrollX, mScrollY, oldX, oldY); + + final int pulledToY = oldY + deltaY; + if (pulledToY < 0) { + mEdgeGlowTop.onPull((float) deltaY / getHeight()); + } else if (pulledToY > range) { + mEdgeGlowBottom.onPull((float) deltaY / getHeight()); + } } break; case MotionEvent.ACTION_UP: @@ -519,8 +547,15 @@ public class ScrollView extends FrameLayout { velocityTracker.computeCurrentVelocity(1000, mMaximumVelocity); int initialVelocity = (int) velocityTracker.getYVelocity(mActivePointerId); - if (getChildCount() > 0 && Math.abs(initialVelocity) > mMinimumVelocity) { - fling(-initialVelocity); + if (getChildCount() > 0) { + if ((Math.abs(initialVelocity) > mMinimumVelocity)) { + fling(-initialVelocity); + } else { + final int bottom = getScrollRange(); + if (mScroller.springback(mScrollX, mScrollY, 0, 0, 0, bottom)) { + invalidate(); + } + } } mActivePointerId = INVALID_POINTER; @@ -530,16 +565,27 @@ public class ScrollView extends FrameLayout { mVelocityTracker.recycle(); mVelocityTracker = null; } + if (mEdgeGlowTop != null) { + mEdgeGlowTop.onRelease(); + mEdgeGlowBottom.onRelease(); + } } break; case MotionEvent.ACTION_CANCEL: if (mIsBeingDragged && getChildCount() > 0) { + if (mScroller.springback(mScrollX, mScrollY, 0, 0, 0, getScrollRange())) { + invalidate(); + } mActivePointerId = INVALID_POINTER; mIsBeingDragged = false; if (mVelocityTracker != null) { mVelocityTracker.recycle(); mVelocityTracker = null; } + if (mEdgeGlowTop != null) { + mEdgeGlowTop.onRelease(); + mEdgeGlowBottom.onRelease(); + } } break; case MotionEvent.ACTION_POINTER_UP: @@ -566,6 +612,22 @@ public class ScrollView extends FrameLayout { } } + @Override + protected void onOverscrolled(int scrollX, int scrollY, + boolean clampedX, boolean clampedY) { + // Treat animating scrolls differently; see #computeScroll() for why. + if (!mScroller.isFinished()) { + mScrollX = scrollX; + mScrollY = scrollY; + if (clampedY) { + mScroller.springback(mScrollX, mScrollY, 0, 0, 0, getScrollRange()); + } + } else { + super.scrollTo(scrollX, scrollY); + } + awakenScrollBars(); + } + private int getScrollRange() { int scrollRange = 0; if (getChildCount() > 0) { @@ -952,7 +1014,16 @@ public class ScrollView extends FrameLayout { return contentHeight; } - return getChildAt(0).getBottom(); + int scrollRange = getChildAt(0).getBottom(); + final int scrollY = mScrollY; + final int overscrollBottom = Math.max(0, scrollRange - contentHeight); + if (scrollY < 0) { + scrollRange -= scrollY; + } else if (scrollY > overscrollBottom) { + scrollRange += scrollY - overscrollBottom; + } + + return scrollRange; } @Override @@ -1013,14 +1084,16 @@ public class ScrollView extends FrameLayout { int x = mScroller.getCurrX(); int y = mScroller.getCurrY(); - if (getChildCount() > 0) { - View child = getChildAt(0); - x = clamp(x, getWidth() - mPaddingRight - mPaddingLeft, child.getWidth()); - y = clamp(y, getHeight() - mPaddingBottom - mPaddingTop, child.getHeight()); - if (x != oldX || y != oldY) { - mScrollX = x; - mScrollY = y; - onScrollChanged(x, y, oldX, oldY); + if (oldX != x || oldY != y) { + overscrollBy(x - oldX, y - oldY, oldX, oldY, 0, getScrollRange(), + 0, mOverflingDistance, false); + onScrollChanged(mScrollX, mScrollY, oldX, oldY); + + final int range = getScrollRange(); + if (y < 0 && oldY >= 0) { + mEdgeGlowTop.onAbsorb((int) mScroller.getCurrVelocity()); + } else if (y > range && oldY <= range) { + mEdgeGlowBottom.onAbsorb((int) mScroller.getCurrVelocity()); } } awakenScrollBars(); @@ -1258,7 +1331,7 @@ public class ScrollView extends FrameLayout { int bottom = getChildAt(0).getHeight(); mScroller.fling(mScrollX, mScrollY, 0, velocityY, 0, 0, 0, - Math.max(0, bottom - height)); + Math.max(0, bottom - height), 0, height/2); final boolean movingDown = velocityY > 0; @@ -1296,6 +1369,55 @@ public class ScrollView extends FrameLayout { } } + @Override + public void setOverscrollMode(int mode) { + if (mode != OVERSCROLL_NEVER) { + if (mEdgeGlowTop == null) { + final Resources res = getContext().getResources(); + final Drawable edge = res.getDrawable(R.drawable.edge_light); + final Drawable glow = res.getDrawable(R.drawable.overscroll_glow); + mEdgeGlowTop = new EdgeGlow(edge, glow); + mEdgeGlowBottom = new EdgeGlow(edge, glow); + } + } else { + mEdgeGlowTop = null; + mEdgeGlowBottom = null; + } + super.setOverscrollMode(mode); + } + + @Override + public void draw(Canvas canvas) { + super.draw(canvas); + if (mEdgeGlowTop != null) { + final int scrollY = mScrollY; + if (!mEdgeGlowTop.isFinished()) { + final int restoreCount = canvas.save(); + final int width = getWidth(); + + canvas.translate(-width / 2, scrollY); + mEdgeGlowTop.setSize(width * 2, getHeight()); + if (mEdgeGlowTop.draw(canvas)) { + invalidate(); + } + canvas.restoreToCount(restoreCount); + } + if (!mEdgeGlowBottom.isFinished()) { + final int restoreCount = canvas.save(); + final int width = getWidth(); + final int height = getHeight(); + + canvas.translate(-width / 2, scrollY + height); + canvas.rotate(180, width, 0); + mEdgeGlowBottom.setSize(width * 2, height); + if (mEdgeGlowBottom.draw(canvas)) { + invalidate(); + } + canvas.restoreToCount(restoreCount); + } + } + } + private int clamp(int n, int my, int child) { if (my >= child || n < 0) { /* my >= child is this case: diff --git a/core/java/android/widget/Scroller.java b/core/java/android/widget/Scroller.java index 4cb0839036f29..23f72b6be9899 100644 --- a/core/java/android/widget/Scroller.java +++ b/core/java/android/widget/Scroller.java @@ -50,8 +50,6 @@ public class Scroller { private float mDurationReciprocal; private float mDeltaX; private float mDeltaY; - private float mViscousFluidScale; - private float mViscousFluidNormalize; private boolean mFinished; private Interpolator mInterpolator; @@ -65,6 +63,17 @@ public class Scroller { private final float mDeceleration; + private static float sViscousFluidScale; + private static float sViscousFluidNormalize; + + static { + // This controls the viscous fluid effect (how much of it) + sViscousFluidScale = 8.0f; + // must be set to 1.0 (used in viscousFluid()) + sViscousFluidNormalize = 1.0f; + sViscousFluidNormalize = 1.0f / viscousFluid(1.0f); + } + /** * Create a Scroller with the default duration and interpolator. */ @@ -277,11 +286,6 @@ public class Scroller { mDeltaX = dx; mDeltaY = dy; mDurationReciprocal = 1.0f / (float) mDuration; - // This controls the viscous fluid effect (how much of it) - mViscousFluidScale = 8.0f; - // must be set to 1.0 (used in viscousFluid()) - mViscousFluidNormalize = 1.0f; - mViscousFluidNormalize = 1.0f / viscousFluid(1.0f); } /** @@ -339,11 +343,9 @@ public class Scroller { mFinalY = Math.max(mFinalY, mMinY); } - - - private float viscousFluid(float x) + static float viscousFluid(float x) { - x *= mViscousFluidScale; + x *= sViscousFluidScale; if (x < 1.0f) { x -= (1.0f - (float)Math.exp(-x)); } else { @@ -351,7 +353,7 @@ public class Scroller { x = 1.0f - (float)Math.exp(1.0f - x); x = start + x * (1.0f - start); } - x *= mViscousFluidNormalize; + x *= sViscousFluidNormalize; return x; } diff --git a/core/res/res/drawable/edge_light.png b/core/res/res/drawable/edge_light.png new file mode 100644 index 0000000000000000000000000000000000000000..b026880f242c88e395b391337d9a189d8c035f70 GIT binary patch literal 32307 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 z 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 literal 0 HcmV?d00001 diff --git a/core/res/res/layout/alert_dialog.xml b/core/res/res/layout/alert_dialog.xml index 7ae68f900b451..25a41f867df93 100644 --- a/core/res/res/layout/alert_dialog.xml +++ b/core/res/res/layout/alert_dialog.xml @@ -80,7 +80,8 @@ android:paddingTop="2dip" android:paddingBottom="12dip" android:paddingLeft="14dip" - android:paddingRight="10dip"> + android:paddingRight="10dip" + android:overscrollMode="ifContentScrolls"> + android:layout_height="match_parent" + android:overscrollMode="ifContentScrolls"> + android:scrollbars="vertical" + android:overscrollMode="ifContentScrolls" /> diff --git a/core/res/res/values/attrs.xml b/core/res/res/values/attrs.xml index d16b91c5ed988..1130b69094480 100755 --- a/core/res/res/values/attrs.xml +++ b/core/res/res/values/attrs.xml @@ -1326,6 +1326,19 @@ public void sayHello(View v) method of your context (typically, your Activity). --> + + + + + + + + + + + + + + diff --git a/core/res/res/values/public.xml b/core/res/res/values/public.xml index 3af12b7ff4ea4..de419be147ef6 100644 --- a/core/res/res/values/public.xml +++ b/core/res/res/values/public.xml @@ -1251,6 +1251,10 @@ + + + + @@ -1262,7 +1266,8 @@ - + +