summaryrefslogtreecommitdiffstats
path: root/core/java/android/widget/AbsSeekBar.java
diff options
context:
space:
mode:
Diffstat (limited to 'core/java/android/widget/AbsSeekBar.java')
-rw-r--r--core/java/android/widget/AbsSeekBar.java64
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);