diff options
Diffstat (limited to 'core/java/android/widget/AbsSeekBar.java')
-rw-r--r-- | core/java/android/widget/AbsSeekBar.java | 64 |
1 files changed, 54 insertions, 10 deletions
diff --git a/core/java/android/widget/AbsSeekBar.java b/core/java/android/widget/AbsSeekBar.java index be7e0bc..6597d12 100644 --- a/core/java/android/widget/AbsSeekBar.java +++ b/core/java/android/widget/AbsSeekBar.java @@ -16,6 +16,7 @@ package android.widget; +import android.animation.ObjectAnimator; import android.annotation.Nullable; import android.content.Context; import android.content.res.ColorStateList; @@ -63,6 +64,9 @@ public abstract class AbsSeekBar extends ProgressBar { * progress. */ private int mKeyProgressIncrement = 1; + private ObjectAnimator mPositionAnimator; + private static final int PROGRESS_ANIMATION_DURATION = 250; + private static final int NO_ALPHA = 0xFF; private float mDisabledAlpha; @@ -361,18 +365,17 @@ public abstract class AbsSeekBar extends ProgressBar { void onProgressRefresh(float scale, boolean fromUser) { super.onProgressRefresh(scale, fromUser); - final Drawable thumb = mThumb; - if (thumb != null) { - setThumbPos(getWidth(), thumb, scale, Integer.MIN_VALUE); - - // Since we draw translated, the drawable's bounds that it signals - // for invalidation won't be the actual bounds we want invalidated, - // so just invalidate this whole view. - invalidate(); + if (!isAnimationRunning()) { + setThumbPos(scale); } } @Override + void onAnimatePosition(float scale, boolean fromUser) { + setThumbPos(scale); + } + + @Override protected void onSizeChanged(int w, int h, int oldw, int oldh) { super.onSizeChanged(w, h, oldw, oldh); @@ -414,6 +417,18 @@ public abstract class AbsSeekBar extends ProgressBar { return max > 0 ? getProgress() / (float) max : 0; } + private void setThumbPos(float scale) { + final Drawable thumb = mThumb; + if (thumb != null) { + setThumbPos(getWidth(), thumb, scale, Integer.MIN_VALUE); + // Since we draw translated, the drawable's bounds that it signals + // for invalidation won't be the actual bounds we want invalidated, + // so just invalidate this whole view. + invalidate(); + + } + } + /** * Updates the thumb drawable bounds. * @@ -676,13 +691,13 @@ public abstract class AbsSeekBar extends ProgressBar { switch (keyCode) { case KeyEvent.KEYCODE_DPAD_LEFT: if (progress <= 0) break; - setProgress(progress - mKeyProgressIncrement, true); + animateSetProgress(progress - mKeyProgressIncrement); onKeyChange(); return true; case KeyEvent.KEYCODE_DPAD_RIGHT: if (progress >= getMax()) break; - setProgress(progress + mKeyProgressIncrement, true); + animateSetProgress(progress + mKeyProgressIncrement); onKeyChange(); return true; } @@ -691,6 +706,35 @@ public abstract class AbsSeekBar extends ProgressBar { return super.onKeyDown(keyCode, event); } + boolean isAnimationRunning() { + return mPositionAnimator != null && mPositionAnimator.isRunning(); + } + + @Override + public void setProgress(int progress, boolean fromUser) { + if (isAnimationRunning()) { + mPositionAnimator.cancel(); + } + super.setProgress(progress, fromUser); + } + + void animateSetProgress(int progress) { + float curProgress = isAnimationRunning() ? getAnimationPosition() : getProgress(); + + if (progress < 0) { + progress = 0; + } else if (progress > getMax()) { + progress = getMax(); + } + setProgressValueOnly(progress); + + mPositionAnimator = ObjectAnimator.ofFloat(this, "animationPosition", curProgress, + progress); + mPositionAnimator.setDuration(PROGRESS_ANIMATION_DURATION); + mPositionAnimator.setAutoCancel(true); + mPositionAnimator.start(); + } + @Override public void onInitializeAccessibilityEvent(AccessibilityEvent event) { super.onInitializeAccessibilityEvent(event); |