summaryrefslogtreecommitdiffstats
path: root/core/java
diff options
context:
space:
mode:
Diffstat (limited to 'core/java')
-rw-r--r--core/java/android/view/GestureDetector.java5
-rw-r--r--core/java/android/view/VelocityTracker.java21
-rw-r--r--core/java/android/view/ViewConfiguration.java25
-rw-r--r--core/java/android/webkit/WebView.java7
-rw-r--r--core/java/android/widget/AbsListView.java16
-rw-r--r--core/java/android/widget/HorizontalScrollView.java13
-rw-r--r--core/java/android/widget/ScrollView.java13
7 files changed, 76 insertions, 24 deletions
diff --git a/core/java/android/view/GestureDetector.java b/core/java/android/view/GestureDetector.java
index 23f3e3c..1e558be 100644
--- a/core/java/android/view/GestureDetector.java
+++ b/core/java/android/view/GestureDetector.java
@@ -198,6 +198,7 @@ public class GestureDetector {
private int mTouchSlopSquare;
private int mDoubleTapSlopSquare;
private int mMinimumFlingVelocity;
+ private int mMaximumFlingVelocity;
private static final int LONGPRESS_TIMEOUT = ViewConfiguration.getLongPressTimeout();
private static final int TAP_TIMEOUT = ViewConfiguration.getTapTimeout();
@@ -361,11 +362,13 @@ public class GestureDetector {
doubleTapSlop = ViewConfiguration.getDoubleTapSlop();
//noinspection deprecation
mMinimumFlingVelocity = ViewConfiguration.getMinimumFlingVelocity();
+ mMaximumFlingVelocity = ViewConfiguration.getMaximumFlingVelocity();
} else {
final ViewConfiguration configuration = ViewConfiguration.get(context);
touchSlop = configuration.getScaledTouchSlop();
doubleTapSlop = configuration.getScaledDoubleTapSlop();
mMinimumFlingVelocity = configuration.getScaledMinimumFlingVelocity();
+ mMaximumFlingVelocity = configuration.getScaledMaximumFlingVelocity();
}
mTouchSlopSquare = touchSlop * touchSlop;
mDoubleTapSlopSquare = doubleTapSlop * doubleTapSlop;
@@ -505,7 +508,7 @@ public class GestureDetector {
// A fling must travel the minimum tap distance
final VelocityTracker velocityTracker = mVelocityTracker;
- velocityTracker.computeCurrentVelocity(1000);
+ velocityTracker.computeCurrentVelocity(1000, mMaximumFlingVelocity);
final float velocityY = velocityTracker.getYVelocity();
final float velocityX = velocityTracker.getXVelocity();
diff --git a/core/java/android/view/VelocityTracker.java b/core/java/android/view/VelocityTracker.java
index c708f54..5d89c46 100644
--- a/core/java/android/view/VelocityTracker.java
+++ b/core/java/android/view/VelocityTracker.java
@@ -165,7 +165,17 @@ public final class VelocityTracker implements Poolable<VelocityTracker> {
pastTime[i] = 0;
}
}
-
+
+ /**
+ * Equivalent to invoking {@link #computeCurrentVelocity(int, float)} with a maximum
+ * velocity of Float.MAX_VALUE.
+ *
+ * @see #computeCurrentVelocity(int, float)
+ */
+ public void computeCurrentVelocity(int units) {
+ computeCurrentVelocity(units, Float.MAX_VALUE);
+ }
+
/**
* Compute the current velocity based on the points that have been
* collected. Only call this when you actually want to retrieve velocity
@@ -175,8 +185,11 @@ public final class VelocityTracker implements Poolable<VelocityTracker> {
*
* @param units The units you would like the velocity in. A value of 1
* provides pixels per millisecond, 1000 provides pixels per second, etc.
+ * @param maxVelocity The maximum velocity that can be computed by this method.
+ * This value must be declared in the same unit as the units parameter. This value
+ * must be positive.
*/
- public void computeCurrentVelocity(int units) {
+ public void computeCurrentVelocity(int units, float maxVelocity) {
final float[] pastX = mPastX;
final float[] pastY = mPastY;
final long[] pastTime = mPastTime;
@@ -210,8 +223,8 @@ public final class VelocityTracker implements Poolable<VelocityTracker> {
if (accumY == 0) accumY = vel;
else accumY = (accumY + vel) * .5f;
}
- mXVelocity = accumX;
- mYVelocity = accumY;
+ mXVelocity = accumX < 0.0f ? Math.max(accumX, -maxVelocity) : Math.min(accumX, maxVelocity);
+ mYVelocity = accumY < 0.0f ? Math.max(accumY, -maxVelocity) : Math.min(accumY, maxVelocity);
if (localLOGV) Log.v(TAG, "Y velocity=" + mYVelocity +" X velocity="
+ mXVelocity + " N=" + N);
diff --git a/core/java/android/view/ViewConfiguration.java b/core/java/android/view/ViewConfiguration.java
index 8e1524b..0e36ec2 100644
--- a/core/java/android/view/ViewConfiguration.java
+++ b/core/java/android/view/ViewConfiguration.java
@@ -106,6 +106,11 @@ public class ViewConfiguration {
* Minimum velocity to initiate a fling, as measured in pixels per second
*/
private static final int MINIMUM_FLING_VELOCITY = 50;
+
+ /**
+ * Maximum velocity to initiate a fling, as measured in pixels per second
+ */
+ private static final int MAXIMUM_FLING_VELOCITY = 4000;
/**
* The maximum size of View's drawing cache, expressed in bytes. This size
@@ -122,6 +127,7 @@ public class ViewConfiguration {
private final int mEdgeSlop;
private final int mFadingEdgeLength;
private final int mMinimumFlingVelocity;
+ private final int mMaximumFlingVelocity;
private final int mScrollbarSize;
private final int mTouchSlop;
private final int mDoubleTapSlop;
@@ -139,6 +145,7 @@ public class ViewConfiguration {
mEdgeSlop = EDGE_SLOP;
mFadingEdgeLength = FADING_EDGE_LENGTH;
mMinimumFlingVelocity = MINIMUM_FLING_VELOCITY;
+ mMaximumFlingVelocity = MAXIMUM_FLING_VELOCITY;
mScrollbarSize = SCROLL_BAR_SIZE;
mTouchSlop = TOUCH_SLOP;
mDoubleTapSlop = DOUBLE_TAP_SLOP;
@@ -164,6 +171,7 @@ public class ViewConfiguration {
mEdgeSlop = (int) (density * EDGE_SLOP + 0.5f);
mFadingEdgeLength = (int) (density * FADING_EDGE_LENGTH + 0.5f);
mMinimumFlingVelocity = (int) (density * MINIMUM_FLING_VELOCITY + 0.5f);
+ mMaximumFlingVelocity = (int) (density * MAXIMUM_FLING_VELOCITY + 0.5f);
mScrollbarSize = (int) (density * SCROLL_BAR_SIZE + 0.5f);
mTouchSlop = (int) (density * TOUCH_SLOP + 0.5f);
mDoubleTapSlop = (int) (density * DOUBLE_TAP_SLOP + 0.5f);
@@ -367,6 +375,23 @@ public class ViewConfiguration {
}
/**
+ * @return Maximum velocity to initiate a fling, as measured in pixels per second.
+ *
+ * @deprecated Use {@link #getScaledMaximumFlingVelocity()} instead.
+ */
+ @Deprecated
+ public static int getMaximumFlingVelocity() {
+ return MAXIMUM_FLING_VELOCITY;
+ }
+
+ /**
+ * @return Maximum velocity to initiate a fling, as measured in pixels per second.
+ */
+ public int getScaledMaximumFlingVelocity() {
+ return mMaximumFlingVelocity;
+ }
+
+ /**
* The maximum drawing cache size expressed in bytes.
*
* @return the maximum size of View's drawing cache expressed in bytes
diff --git a/core/java/android/webkit/WebView.java b/core/java/android/webkit/WebView.java
index 429f0f9..fcf946f 100644
--- a/core/java/android/webkit/WebView.java
+++ b/core/java/android/webkit/WebView.java
@@ -237,6 +237,7 @@ public class WebView extends AbsoluteLayout
* Helper class to get velocity for fling
*/
VelocityTracker mVelocityTracker;
+ private int mMaximumFling;
/**
* Touch mode
@@ -676,7 +677,8 @@ public class WebView extends AbsoluteLayout
setClickable(true);
setLongClickable(true);
- final int slop = ViewConfiguration.get(getContext()).getScaledTouchSlop();
+ final ViewConfiguration configuration = ViewConfiguration.get(getContext());
+ final int slop = configuration.getScaledTouchSlop();
mTouchSlopSquare = slop * slop;
mMinLockSnapReverseDistance = slop;
final float density = getContext().getResources().getDisplayMetrics().density;
@@ -692,6 +694,7 @@ public class WebView extends AbsoluteLayout
DEFAULT_MIN_ZOOM_SCALE = 0.25f * density;
mMaxZoomScale = DEFAULT_MAX_ZOOM_SCALE;
mMinZoomScale = DEFAULT_MIN_ZOOM_SCALE;
+ mMaximumFling = configuration.getScaledMaximumFlingVelocity();
}
/* package */void updateDefaultZoomDensity(int zoomDensity) {
@@ -4157,7 +4160,7 @@ public class WebView extends AbsoluteLayout
int maxX = Math.max(computeHorizontalScrollRange() - getViewWidth(), 0);
int maxY = Math.max(computeVerticalScrollRange() - getViewHeight(), 0);
- mVelocityTracker.computeCurrentVelocity(1000);
+ mVelocityTracker.computeCurrentVelocity(1000, mMaximumFling);
int vx = (int) mVelocityTracker.getXVelocity();
int vy = (int) mVelocityTracker.getYVelocity();
diff --git a/core/java/android/widget/AbsListView.java b/core/java/android/widget/AbsListView.java
index 23a38db..f9ca8cb 100644
--- a/core/java/android/widget/AbsListView.java
+++ b/core/java/android/widget/AbsListView.java
@@ -438,6 +438,8 @@ public abstract class AbsListView extends AdapterView<ListAdapter> implements Te
private InputConnectionWrapper mPublicInputConnection;
private Runnable mClearScrollingCache;
+ private int mMinimumVelocity;
+ private int mMaximumVelocity;
/**
* Interface definition for a callback to be invoked when the list or grid
@@ -549,7 +551,10 @@ public abstract class AbsListView extends AdapterView<ListAdapter> implements Te
setAlwaysDrawnWithCacheEnabled(false);
setScrollingCacheEnabled(true);
- mTouchSlop = ViewConfiguration.get(mContext).getScaledTouchSlop();
+ final ViewConfiguration configuration = ViewConfiguration.get(mContext);
+ mTouchSlop = configuration.getScaledTouchSlop();
+ mMinimumVelocity = configuration.getScaledMinimumFlingVelocity();
+ mMaximumVelocity = configuration.getScaledMaximumFlingVelocity();
mDensityScale = getContext().getResources().getDisplayMetrics().density;
}
@@ -2058,12 +2063,9 @@ public abstract class AbsListView extends AdapterView<ListAdapter> implements Te
break;
case TOUCH_MODE_SCROLL:
final VelocityTracker velocityTracker = mVelocityTracker;
- velocityTracker.computeCurrentVelocity(1000);
- int initialVelocity = (int)velocityTracker.getYVelocity();
-
- if ((Math.abs(initialVelocity) >
- ViewConfiguration.get(mContext).getScaledMinimumFlingVelocity()) &&
- (getChildCount() > 0)) {
+ velocityTracker.computeCurrentVelocity(1000, mMaximumVelocity);
+ final int initialVelocity = (int) velocityTracker.getYVelocity();
+ if (Math.abs(initialVelocity) > mMinimumVelocity && (getChildCount() > 0)) {
if (mFlingRunnable == null) {
mFlingRunnable = new FlingRunnable();
}
diff --git a/core/java/android/widget/HorizontalScrollView.java b/core/java/android/widget/HorizontalScrollView.java
index 02fc7c6..f86b37c 100644
--- a/core/java/android/widget/HorizontalScrollView.java
+++ b/core/java/android/widget/HorizontalScrollView.java
@@ -114,6 +114,8 @@ public class HorizontalScrollView extends FrameLayout {
private boolean mSmoothScrollingEnabled = true;
private int mTouchSlop;
+ private int mMinimumVelocity;
+ private int mMaximumVelocity;
public HorizontalScrollView(Context context) {
this(context, null);
@@ -179,7 +181,10 @@ public class HorizontalScrollView extends FrameLayout {
setFocusable(true);
setDescendantFocusability(FOCUS_AFTER_DESCENDANTS);
setWillNotDraw(false);
- mTouchSlop = ViewConfiguration.get(getContext()).getScaledTouchSlop();
+ final ViewConfiguration configuration = ViewConfiguration.get(mContext);
+ mTouchSlop = configuration.getScaledTouchSlop();
+ mMinimumVelocity = configuration.getScaledMinimumFlingVelocity();
+ mMaximumVelocity = configuration.getScaledMaximumFlingVelocity();
}
@Override
@@ -477,12 +482,10 @@ public class HorizontalScrollView extends FrameLayout {
break;
case MotionEvent.ACTION_UP:
final VelocityTracker velocityTracker = mVelocityTracker;
- velocityTracker.computeCurrentVelocity(1000);
+ velocityTracker.computeCurrentVelocity(1000, mMaximumVelocity);
int initialVelocity = (int) velocityTracker.getXVelocity();
- if ((Math.abs(initialVelocity) >
- ViewConfiguration.get(mContext).getScaledMinimumFlingVelocity()) &&
- getChildCount() > 0) {
+ if ((Math.abs(initialVelocity) > mMinimumVelocity) && getChildCount() > 0) {
fling(-initialVelocity);
}
diff --git a/core/java/android/widget/ScrollView.java b/core/java/android/widget/ScrollView.java
index c9b3751..90e1242 100644
--- a/core/java/android/widget/ScrollView.java
+++ b/core/java/android/widget/ScrollView.java
@@ -115,6 +115,8 @@ public class ScrollView extends FrameLayout {
private boolean mSmoothScrollingEnabled = true;
private int mTouchSlop;
+ private int mMinimumVelocity;
+ private int mMaximumVelocity;
public ScrollView(Context context) {
this(context, null);
@@ -180,7 +182,10 @@ public class ScrollView extends FrameLayout {
setFocusable(true);
setDescendantFocusability(FOCUS_AFTER_DESCENDANTS);
setWillNotDraw(false);
- mTouchSlop = ViewConfiguration.get(getContext()).getScaledTouchSlop();
+ final ViewConfiguration configuration = ViewConfiguration.get(mContext);
+ mTouchSlop = configuration.getScaledTouchSlop();
+ mMinimumVelocity = configuration.getScaledMinimumFlingVelocity();
+ mMaximumVelocity = configuration.getScaledMaximumFlingVelocity();
}
@Override
@@ -478,12 +483,10 @@ public class ScrollView extends FrameLayout {
break;
case MotionEvent.ACTION_UP:
final VelocityTracker velocityTracker = mVelocityTracker;
- velocityTracker.computeCurrentVelocity(1000);
+ velocityTracker.computeCurrentVelocity(1000, mMaximumVelocity);
int initialVelocity = (int) velocityTracker.getYVelocity();
- if ((Math.abs(initialVelocity) >
- ViewConfiguration.get(mContext).getScaledMinimumFlingVelocity()) &&
- getChildCount() > 0) {
+ if ((Math.abs(initialVelocity) > mMinimumVelocity) && getChildCount() > 0) {
fling(-initialVelocity);
}