Loading core/java/android/widget/EdgeEffect.java +45 −11 Original line number Diff line number Diff line Loading @@ -16,6 +16,7 @@ package android.widget; import android.animation.ValueAnimator; import android.annotation.ColorInt; import android.annotation.IntDef; import android.annotation.NonNull; Loading Loading @@ -75,6 +76,11 @@ public class EdgeEffect { */ public static final BlendMode DEFAULT_BLEND_MODE = BlendMode.SRC_ATOP; /** * Completely disable edge effect */ private static final int TYPE_NONE = -1; /** * Use a color edge glow for the edge effect. */ Loading Loading @@ -114,7 +120,7 @@ public class EdgeEffect { private static final float ON_ABSORB_VELOCITY_ADJUSTMENT = 13f; /** @hide */ @IntDef({TYPE_GLOW, TYPE_STRETCH}) @IntDef({TYPE_NONE, TYPE_GLOW, TYPE_STRETCH}) @Retention(RetentionPolicy.SOURCE) public @interface EdgeEffectType { } Loading Loading @@ -195,6 +201,12 @@ public class EdgeEffect { private float mBaseGlowScale; private float mDisplacement = 0.5f; private float mTargetDisplacement = 0.5f; /** * Current edge effect type, consumers should always query * {@link #getCurrentEdgeEffectBehavior()} instead of this parameter * directly in case animations have been disabled (ex. for accessibility reasons) */ private @EdgeEffectType int mEdgeEffectType = TYPE_GLOW; private Matrix mTmpMatrix = null; private float[] mTmpPoints = null; Loading Loading @@ -227,6 +239,15 @@ public class EdgeEffect { mPaint.setBlendMode(DEFAULT_BLEND_MODE); } @EdgeEffectType private int getCurrentEdgeEffectBehavior() { if (!ValueAnimator.areAnimatorsEnabled()) { return TYPE_NONE; } else { return mEdgeEffectType; } } /** * Set the size of this edge effect in pixels. * Loading Loading @@ -302,14 +323,19 @@ public class EdgeEffect { * Values may be from 0-1. */ public void onPull(float deltaDistance, float displacement) { int edgeEffectBehavior = getCurrentEdgeEffectBehavior(); if (edgeEffectBehavior == TYPE_NONE) { finish(); return; } final long now = AnimationUtils.currentAnimationTimeMillis(); mTargetDisplacement = displacement; if (mState == STATE_PULL_DECAY && now - mStartTime < mDuration && mEdgeEffectType == TYPE_GLOW) { && edgeEffectBehavior == TYPE_GLOW) { return; } if (mState != STATE_PULL) { if (mEdgeEffectType == TYPE_STRETCH) { if (edgeEffectBehavior == TYPE_STRETCH) { // Restore the mPullDistance to the fraction it is currently showing -- we want // to "catch" the current stretch value. mPullDistance = mDistance; Loading Loading @@ -342,7 +368,7 @@ public class EdgeEffect { mGlowAlphaFinish = mGlowAlpha; mGlowScaleYFinish = mGlowScaleY; if (mEdgeEffectType == TYPE_STRETCH && mDistance == 0) { if (edgeEffectBehavior == TYPE_STRETCH && mDistance == 0) { mState = STATE_IDLE; } } Loading Loading @@ -377,13 +403,17 @@ public class EdgeEffect { * 0 and <code>deltaDistance</code>. */ public float onPullDistance(float deltaDistance, float displacement) { int edgeEffectBehavior = getCurrentEdgeEffectBehavior(); if (edgeEffectBehavior == TYPE_NONE) { return 0f; } float finalDistance = Math.max(0f, deltaDistance + mDistance); float delta = finalDistance - mDistance; if (delta == 0f && mDistance == 0f) { return 0f; // No pull, don't do anything. } if (mState != STATE_PULL && mState != STATE_PULL_DECAY && mEdgeEffectType == TYPE_GLOW) { if (mState != STATE_PULL && mState != STATE_PULL_DECAY && edgeEffectBehavior == TYPE_GLOW) { // Catch the edge glow in the middle of an animation. mPullDistance = mDistance; mState = STATE_PULL; Loading Loading @@ -442,11 +472,12 @@ public class EdgeEffect { * @param velocity Velocity at impact in pixels per second. */ public void onAbsorb(int velocity) { if (mEdgeEffectType == TYPE_STRETCH) { int edgeEffectBehavior = getCurrentEdgeEffectBehavior(); if (edgeEffectBehavior == TYPE_STRETCH) { mState = STATE_RECEDE; mVelocity = velocity * ON_ABSORB_VELOCITY_ADJUSTMENT; mStartTime = AnimationUtils.currentAnimationTimeMillis(); } else { } else if (edgeEffectBehavior == TYPE_GLOW) { mState = STATE_ABSORB; mVelocity = 0; velocity = Math.min(Math.max(MIN_VELOCITY, Math.abs(velocity)), MAX_VELOCITY); Loading @@ -470,6 +501,8 @@ public class EdgeEffect { mGlowAlphaStart, Math.min(velocity * VELOCITY_GLOW_FACTOR * .00001f, MAX_ALPHA)); mTargetDisplacement = 0.5f; } else { finish(); } } Loading Loading @@ -532,7 +565,8 @@ public class EdgeEffect { * animation */ public boolean draw(Canvas canvas) { if (mEdgeEffectType == TYPE_GLOW) { int edgeEffectBehavior = getCurrentEdgeEffectBehavior(); if (edgeEffectBehavior == TYPE_GLOW) { update(); final int count = canvas.save(); Loading @@ -549,7 +583,7 @@ public class EdgeEffect { mPaint.setAlpha((int) (0xff * mGlowAlpha)); canvas.drawCircle(centerX, centerY, mRadius, mPaint); canvas.restoreToCount(count); } else if (canvas instanceof RecordingCanvas) { } else if (edgeEffectBehavior == TYPE_STRETCH && canvas instanceof RecordingCanvas) { if (mState == STATE_RECEDE) { updateSpring(); } Loading Loading @@ -604,8 +638,8 @@ public class EdgeEffect { ); } } else { // This is TYPE_STRETCH and drawing into a Canvas that isn't a Recording Canvas, // so no effect can be shown. Just end the effect. // Animations have been disabled or this is TYPE_STRETCH and drawing into a Canvas // that isn't a Recording Canvas, so no effect can be shown. Just end the effect. mState = STATE_IDLE; mDistance = 0; mVelocity = 0; Loading Loading
core/java/android/widget/EdgeEffect.java +45 −11 Original line number Diff line number Diff line Loading @@ -16,6 +16,7 @@ package android.widget; import android.animation.ValueAnimator; import android.annotation.ColorInt; import android.annotation.IntDef; import android.annotation.NonNull; Loading Loading @@ -75,6 +76,11 @@ public class EdgeEffect { */ public static final BlendMode DEFAULT_BLEND_MODE = BlendMode.SRC_ATOP; /** * Completely disable edge effect */ private static final int TYPE_NONE = -1; /** * Use a color edge glow for the edge effect. */ Loading Loading @@ -114,7 +120,7 @@ public class EdgeEffect { private static final float ON_ABSORB_VELOCITY_ADJUSTMENT = 13f; /** @hide */ @IntDef({TYPE_GLOW, TYPE_STRETCH}) @IntDef({TYPE_NONE, TYPE_GLOW, TYPE_STRETCH}) @Retention(RetentionPolicy.SOURCE) public @interface EdgeEffectType { } Loading Loading @@ -195,6 +201,12 @@ public class EdgeEffect { private float mBaseGlowScale; private float mDisplacement = 0.5f; private float mTargetDisplacement = 0.5f; /** * Current edge effect type, consumers should always query * {@link #getCurrentEdgeEffectBehavior()} instead of this parameter * directly in case animations have been disabled (ex. for accessibility reasons) */ private @EdgeEffectType int mEdgeEffectType = TYPE_GLOW; private Matrix mTmpMatrix = null; private float[] mTmpPoints = null; Loading Loading @@ -227,6 +239,15 @@ public class EdgeEffect { mPaint.setBlendMode(DEFAULT_BLEND_MODE); } @EdgeEffectType private int getCurrentEdgeEffectBehavior() { if (!ValueAnimator.areAnimatorsEnabled()) { return TYPE_NONE; } else { return mEdgeEffectType; } } /** * Set the size of this edge effect in pixels. * Loading Loading @@ -302,14 +323,19 @@ public class EdgeEffect { * Values may be from 0-1. */ public void onPull(float deltaDistance, float displacement) { int edgeEffectBehavior = getCurrentEdgeEffectBehavior(); if (edgeEffectBehavior == TYPE_NONE) { finish(); return; } final long now = AnimationUtils.currentAnimationTimeMillis(); mTargetDisplacement = displacement; if (mState == STATE_PULL_DECAY && now - mStartTime < mDuration && mEdgeEffectType == TYPE_GLOW) { && edgeEffectBehavior == TYPE_GLOW) { return; } if (mState != STATE_PULL) { if (mEdgeEffectType == TYPE_STRETCH) { if (edgeEffectBehavior == TYPE_STRETCH) { // Restore the mPullDistance to the fraction it is currently showing -- we want // to "catch" the current stretch value. mPullDistance = mDistance; Loading Loading @@ -342,7 +368,7 @@ public class EdgeEffect { mGlowAlphaFinish = mGlowAlpha; mGlowScaleYFinish = mGlowScaleY; if (mEdgeEffectType == TYPE_STRETCH && mDistance == 0) { if (edgeEffectBehavior == TYPE_STRETCH && mDistance == 0) { mState = STATE_IDLE; } } Loading Loading @@ -377,13 +403,17 @@ public class EdgeEffect { * 0 and <code>deltaDistance</code>. */ public float onPullDistance(float deltaDistance, float displacement) { int edgeEffectBehavior = getCurrentEdgeEffectBehavior(); if (edgeEffectBehavior == TYPE_NONE) { return 0f; } float finalDistance = Math.max(0f, deltaDistance + mDistance); float delta = finalDistance - mDistance; if (delta == 0f && mDistance == 0f) { return 0f; // No pull, don't do anything. } if (mState != STATE_PULL && mState != STATE_PULL_DECAY && mEdgeEffectType == TYPE_GLOW) { if (mState != STATE_PULL && mState != STATE_PULL_DECAY && edgeEffectBehavior == TYPE_GLOW) { // Catch the edge glow in the middle of an animation. mPullDistance = mDistance; mState = STATE_PULL; Loading Loading @@ -442,11 +472,12 @@ public class EdgeEffect { * @param velocity Velocity at impact in pixels per second. */ public void onAbsorb(int velocity) { if (mEdgeEffectType == TYPE_STRETCH) { int edgeEffectBehavior = getCurrentEdgeEffectBehavior(); if (edgeEffectBehavior == TYPE_STRETCH) { mState = STATE_RECEDE; mVelocity = velocity * ON_ABSORB_VELOCITY_ADJUSTMENT; mStartTime = AnimationUtils.currentAnimationTimeMillis(); } else { } else if (edgeEffectBehavior == TYPE_GLOW) { mState = STATE_ABSORB; mVelocity = 0; velocity = Math.min(Math.max(MIN_VELOCITY, Math.abs(velocity)), MAX_VELOCITY); Loading @@ -470,6 +501,8 @@ public class EdgeEffect { mGlowAlphaStart, Math.min(velocity * VELOCITY_GLOW_FACTOR * .00001f, MAX_ALPHA)); mTargetDisplacement = 0.5f; } else { finish(); } } Loading Loading @@ -532,7 +565,8 @@ public class EdgeEffect { * animation */ public boolean draw(Canvas canvas) { if (mEdgeEffectType == TYPE_GLOW) { int edgeEffectBehavior = getCurrentEdgeEffectBehavior(); if (edgeEffectBehavior == TYPE_GLOW) { update(); final int count = canvas.save(); Loading @@ -549,7 +583,7 @@ public class EdgeEffect { mPaint.setAlpha((int) (0xff * mGlowAlpha)); canvas.drawCircle(centerX, centerY, mRadius, mPaint); canvas.restoreToCount(count); } else if (canvas instanceof RecordingCanvas) { } else if (edgeEffectBehavior == TYPE_STRETCH && canvas instanceof RecordingCanvas) { if (mState == STATE_RECEDE) { updateSpring(); } Loading Loading @@ -604,8 +638,8 @@ public class EdgeEffect { ); } } else { // This is TYPE_STRETCH and drawing into a Canvas that isn't a Recording Canvas, // so no effect can be shown. Just end the effect. // Animations have been disabled or this is TYPE_STRETCH and drawing into a Canvas // that isn't a Recording Canvas, so no effect can be shown. Just end the effect. mState = STATE_IDLE; mDistance = 0; mVelocity = 0; Loading