diff options
Diffstat (limited to 'core/java/android')
| -rw-r--r-- | core/java/android/widget/AbsSeekBar.java | 37 | ||||
| -rw-r--r-- | core/java/android/widget/ProgressBar.java | 74 | ||||
| -rw-r--r-- | core/java/android/widget/SeekBar.java | 6 |
3 files changed, 96 insertions, 21 deletions
diff --git a/core/java/android/widget/AbsSeekBar.java b/core/java/android/widget/AbsSeekBar.java index 01a95a4205d4..8ee43342795c 100644 --- a/core/java/android/widget/AbsSeekBar.java +++ b/core/java/android/widget/AbsSeekBar.java @@ -469,7 +469,7 @@ public abstract class AbsSeekBar extends ProgressBar { /** * Returns the amount of progress changed via the arrow keys. * <p> - * By default, this will be a value that is derived from the max progress. + * By default, this will be a value that is derived from the progress range. * * @return The amount to increment or decrement when the user presses the * arrow keys. This will be positive. @@ -479,13 +479,27 @@ public abstract class AbsSeekBar extends ProgressBar { } @Override + public synchronized void setMin(int min) { + super.setMin(min); + int range = getMax() - getMin(); + + if ((mKeyProgressIncrement == 0) || (range / mKeyProgressIncrement > 20)) { + + // It will take the user too long to change this via keys, change it + // to something more reasonable + setKeyProgressIncrement(Math.max(1, Math.round((float) range / 20))); + } + } + + @Override public synchronized void setMax(int max) { super.setMax(max); + int range = getMax() - getMin(); - if ((mKeyProgressIncrement == 0) || (getMax() / mKeyProgressIncrement > 20)) { + if ((mKeyProgressIncrement == 0) || (range / mKeyProgressIncrement > 20)) { // It will take the user too long to change this via keys, change it // to something more reasonable - setKeyProgressIncrement(Math.max(1, Math.round((float) getMax() / 20))); + setKeyProgressIncrement(Math.max(1, Math.round((float) range / 20))); } } @@ -596,8 +610,10 @@ public abstract class AbsSeekBar extends ProgressBar { } private float getScale() { - final int max = getMax(); - return max > 0 ? getProgress() / (float) max : 0; + int min = getMin(); + int max = getMax(); + int range = max - min; + return range > 0 ? (getProgress() - min) / (float) range : 0; } /** @@ -691,7 +707,7 @@ public abstract class AbsSeekBar extends ProgressBar { */ void drawTickMarks(Canvas canvas) { if (mTickMark != null) { - final int count = getMax(); + final int count = getMax() - getMin(); if (count > 1) { final int w = mTickMark.getIntrinsicWidth(); final int h = mTickMark.getIntrinsicHeight(); @@ -847,8 +863,8 @@ public abstract class AbsSeekBar extends ProgressBar { } } - final int max = getMax(); - progress += scale * max; + final int range = getMax() - getMin(); + progress += scale * range; setHotspot(x, y); setProgressInternal(Math.round(progress), true, false); @@ -922,7 +938,7 @@ public abstract class AbsSeekBar extends ProgressBar { if (isEnabled()) { final int progress = getProgress(); - if (progress > 0) { + if (progress > getMin()) { info.addAction(AccessibilityNodeInfo.AccessibilityAction.ACTION_SCROLL_BACKWARD); } if (progress < getMax()) { @@ -960,7 +976,8 @@ public abstract class AbsSeekBar extends ProgressBar { if (!canUserSetProgress()) { return false; } - int increment = Math.max(1, Math.round((float) getMax() / 20)); + int range = getMax() - getMin(); + int increment = Math.max(1, Math.round((float) range / 20)); if (action == AccessibilityNodeInfo.ACTION_SCROLL_BACKWARD) { increment = -increment; } diff --git a/core/java/android/widget/ProgressBar.java b/core/java/android/widget/ProgressBar.java index 3c967acdfc55..4a28cc469227 100644 --- a/core/java/android/widget/ProgressBar.java +++ b/core/java/android/widget/ProgressBar.java @@ -185,6 +185,7 @@ import java.util.ArrayList; * @attr ref android.R.styleable#ProgressBar_indeterminateDuration * @attr ref android.R.styleable#ProgressBar_indeterminateOnly * @attr ref android.R.styleable#ProgressBar_interpolator + * @attr ref android.R.styleable#ProgressBar_min * @attr ref android.R.styleable#ProgressBar_max * @attr ref android.R.styleable#ProgressBar_maxHeight * @attr ref android.R.styleable#ProgressBar_maxWidth @@ -215,7 +216,10 @@ public class ProgressBar extends View { private int mProgress; private int mSecondaryProgress; + private int mMin; + private boolean mMinInitialized; private int mMax; + private boolean mMaxInitialized; private int mBehavior; private int mDuration; @@ -308,6 +312,7 @@ public class ProgressBar extends View { setInterpolator(context, resID); } + setMin(a.getInt(R.styleable.ProgressBar_min, mMin)); setMax(a.getInt(R.styleable.ProgressBar_max, mMax)); setProgress(a.getInt(R.styleable.ProgressBar_progress, mProgress)); @@ -565,6 +570,7 @@ public class ProgressBar extends View { * </ul> */ private void initProgressBar() { + mMin = 0; mMax = 100; mProgress = 0; mSecondaryProgress = 0; @@ -1310,7 +1316,8 @@ public class ProgressBar extends View { private synchronized void doRefreshProgress(int id, int progress, boolean fromUser, boolean callBackToApp, boolean animate) { - final float scale = mMax > 0 ? progress / (float) mMax : 0; + int range = mMax - mMin; + final float scale = range > 0 ? (progress - mMin) / (float) range : 0; final boolean isPrimary = id == R.id.progress; if (isPrimary && animate) { @@ -1436,7 +1443,7 @@ public class ProgressBar extends View { return false; } - progress = MathUtils.constrain(progress, 0, mMax); + progress = MathUtils.constrain(progress, mMin, mMax); if (progress == mProgress) { // No change from current. @@ -1466,8 +1473,8 @@ public class ProgressBar extends View { return; } - if (secondaryProgress < 0) { - secondaryProgress = 0; + if (secondaryProgress < mMin) { + secondaryProgress = mMin; } if (secondaryProgress > mMax) { @@ -1515,6 +1522,20 @@ public class ProgressBar extends View { } /** + * <p>Return the lower limit of this progress bar's range.</p> + * + * @return a positive integer + * + * @see #setMin(int) + * @see #getProgress() + * @see #getSecondaryProgress() + */ + @ViewDebug.ExportedProperty(category = "progress") + public synchronized int getMin() { + return mMin; + } + + /** * <p>Return the upper limit of this progress bar's range.</p> * * @return a positive integer @@ -1529,7 +1550,37 @@ public class ProgressBar extends View { } /** - * <p>Set the range of the progress bar to 0...<tt>max</tt>.</p> + * <p>Set the lower range of the progress bar to <tt>min</tt>.</p> + * + * @param min the lower range of this progress bar + * + * @see #getMin() + * @see #setProgress(int) + * @see #setSecondaryProgress(int) + */ + @android.view.RemotableViewMethod + public synchronized void setMin(int min) { + if (mMaxInitialized) { + if (min > mMax) { + min = mMax; + } + } + mMinInitialized = true; + if (mMaxInitialized && min != mMin) { + mMin = min; + postInvalidate(); + + if (mProgress < min) { + mProgress = min; + } + refreshProgress(R.id.progress, mProgress, false, false); + } else { + mMin = min; + } + } + + /** + * <p>Set the upper range of the progress bar <tt>max</tt>.</p> * * @param max the upper range of this progress bar * @@ -1539,10 +1590,13 @@ public class ProgressBar extends View { */ @android.view.RemotableViewMethod public synchronized void setMax(int max) { - if (max < 0) { - max = 0; + if (mMinInitialized) { + if (max < mMin) { + max = mMin; + } } - if (max != mMax) { + mMaxInitialized = true; + if (mMinInitialized && max != mMax) { mMax = max; postInvalidate(); @@ -1550,6 +1604,8 @@ public class ProgressBar extends View { mProgress = max; } refreshProgress(R.id.progress, mProgress, false, false); + } else { + mMax = max; } } @@ -1959,7 +2015,7 @@ public class ProgressBar extends View { @Override public void onInitializeAccessibilityEventInternal(AccessibilityEvent event) { super.onInitializeAccessibilityEventInternal(event); - event.setItemCount(mMax); + event.setItemCount(mMax - mMin); event.setCurrentItemIndex(mProgress); } diff --git a/core/java/android/widget/SeekBar.java b/core/java/android/widget/SeekBar.java index 5d01d8d7cb16..f9aced09adcf 100644 --- a/core/java/android/widget/SeekBar.java +++ b/core/java/android/widget/SeekBar.java @@ -46,8 +46,10 @@ public class SeekBar extends AbsSeekBar { * to distinguish user-initiated changes from those that occurred programmatically. * * @param seekBar The SeekBar whose progress has changed - * @param progress The current progress level. This will be in the range 0..max where max - * was set by {@link ProgressBar#setMax(int)}. (The default value for max is 100.) + * @param progress The current progress level. This will be in the range min..max where min + * and max were set by {@link ProgressBar#setMin(int)} and + * {@link ProgressBar#setMax(int)}, respectively. (The default values for + * min is 0 and max is 100.) * @param fromUser True if the progress change was initiated by the user. */ void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser); |
