diff options
Diffstat (limited to 'core/java/android/widget/EdgeEffect.java')
| -rw-r--r-- | core/java/android/widget/EdgeEffect.java | 50 |
1 files changed, 20 insertions, 30 deletions
diff --git a/core/java/android/widget/EdgeEffect.java b/core/java/android/widget/EdgeEffect.java index 3c411126627f..5f55887d6019 100644 --- a/core/java/android/widget/EdgeEffect.java +++ b/core/java/android/widget/EdgeEffect.java @@ -130,7 +130,11 @@ public class EdgeEffect { public @interface EdgeEffectType { } - private static final float DEFAULT_MAX_STRETCH_INTENSITY = 0.08f; + private static final float LINEAR_STRETCH_INTENSITY = 0.03f; + + private static final float EXP_STRETCH_INTENSITY = 0.02f; + + private static final float SCROLL_DIST_AFFECTED_BY_EXP_STRETCH = 0.4f; @SuppressWarnings("UnusedDeclaration") private static final String TAG = "EdgeEffect"; @@ -176,9 +180,6 @@ public class EdgeEffect { private long mStartTime; private float mDuration; - private float mStretchIntensity = DEFAULT_MAX_STRETCH_INTENSITY; - private float mStretchDistanceFraction = 1f; - private float mStretchDistance = -1f; private final Interpolator mInterpolator = new DecelerateInterpolator(); @@ -269,16 +270,6 @@ public class EdgeEffect { } /** - * Configure the distance in pixels to stretch the content. This is only consumed as part - * if {@link #setType(int)} is set to {@link #TYPE_STRETCH} - * @param stretchDistance Stretch distance in pixels when the target View is overscrolled - * @hide - */ - public void setStretchDistance(float stretchDistance) { - mStretchDistance = stretchDistance; - } - - /** * Reports if this EdgeEffect's animation is finished. If this method returns false * after a call to {@link #draw(Canvas)} the host widget should schedule another * drawing pass to continue the animation. @@ -520,13 +511,6 @@ public class EdgeEffect { } /** - * @hide - */ - public void setMaxStretchIntensity(float stretchIntensity) { - mStretchIntensity = stretchIntensity; - } - - /** * Set or clear the blend mode. A blend mode defines how source pixels * (generated by a drawing command) are composited with the destination pixels * (content of the render target). @@ -642,22 +626,19 @@ public class EdgeEffect { // assume rotations of increments of 90 degrees float x = mTmpPoints[10] - mTmpPoints[8]; float width = right - left; - float vecX = Math.max(-1f, Math.min(1f, x / width)); + float vecX = dampStretchVector(Math.max(-1f, Math.min(1f, x / width))); float y = mTmpPoints[11] - mTmpPoints[9]; float height = bottom - top; - float vecY = Math.max(-1f, Math.min(1f, y / height)); + float vecY = dampStretchVector(Math.max(-1f, Math.min(1f, y / height))); renderNode.stretch( left, top, right, bottom, - vecX * mStretchIntensity, - vecY * mStretchIntensity, - // TODO (njawad/mount) figure out proper stretch distance from UX - // for now leverage placeholder logic if no stretch distance is provided to - // consume the displacement ratio times the minimum of the width or height - mStretchDistance > 0 ? mStretchDistance : - (mStretchDistanceFraction * Math.max(mWidth, mHeight)) + vecX, + vecY, + mWidth, + mHeight ); } @@ -794,4 +775,13 @@ public class EdgeEffect { return Math.abs(mVelocity) < VELOCITY_THRESHOLD && Math.abs(displacement) < VALUE_THRESHOLD; } + + private float dampStretchVector(float normalizedVec) { + float sign = normalizedVec > 0 ? 1f : -1f; + float overscroll = Math.abs(normalizedVec); + float linearIntensity = LINEAR_STRETCH_INTENSITY * overscroll; + double scalar = Math.E / SCROLL_DIST_AFFECTED_BY_EXP_STRETCH; + double expIntensity = EXP_STRETCH_INTENSITY * (1 - Math.exp(-overscroll * scalar)); + return sign * (float) (linearIntensity + expIntensity); + } } |
