summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--core/java/android/view/View.java514
-rw-r--r--core/java/android/view/ViewConfiguration.java18
-rw-r--r--graphics/java/android/graphics/drawable/Drawable.java16
3 files changed, 295 insertions, 253 deletions
diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java
index 5ee3c16..6d3c07a 100644
--- a/core/java/android/view/View.java
+++ b/core/java/android/view/View.java
@@ -16,9 +16,7 @@
package android.view;
-import android.animation.Animator;
import android.animation.AnimatorInflater;
-import android.animation.ObjectAnimator;
import android.animation.StateListAnimator;
import android.annotation.DrawableRes;
import android.annotation.IdRes;
@@ -34,10 +32,13 @@ import android.content.res.TypedArray;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Insets;
+import android.graphics.Interpolator;
import android.graphics.LinearGradient;
import android.graphics.Matrix;
import android.graphics.Outline;
import android.graphics.Paint;
+import android.graphics.Path;
+import android.graphics.PathMeasure;
import android.graphics.PixelFormat;
import android.graphics.Point;
import android.graphics.PorterDuff;
@@ -4325,7 +4326,9 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
* @hide This is the real method; the public one is shimmed to be safe to call from apps.
*/
protected void initializeFadingEdgeInternal(TypedArray a) {
- getScrollCache().fadingEdgeLength = a.getDimensionPixelSize(
+ initScrollCache();
+
+ mScrollCache.fadingEdgeLength = a.getDimensionPixelSize(
R.styleable.View_fadingEdgeLength,
ViewConfiguration.get(mContext).getScaledFadingEdgeLength());
}
@@ -4359,7 +4362,8 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
* content in this view is visible.
*/
public void setFadingEdgeLength(int length) {
- getScrollCache().fadingEdgeLength = length;
+ initScrollCache();
+ mScrollCache.fadingEdgeLength = length;
}
/**
@@ -4463,7 +4467,10 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
* @hide
*/
protected void initializeScrollbarsInternal(TypedArray a) {
- final ScrollabilityCache scrollabilityCache = getScrollCache();
+ initScrollCache();
+
+ final ScrollabilityCache scrollabilityCache = mScrollCache;
+
if (scrollabilityCache.scrollBar == null) {
scrollabilityCache.scrollBar = new ScrollBarDrawable();
scrollabilityCache.scrollBar.setCallback(this);
@@ -4471,16 +4478,23 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
}
final boolean fadeScrollbars = a.getBoolean(R.styleable.View_fadeScrollbars, true);
- scrollabilityCache.setFadingEnabled(fadeScrollbars);
+
+ if (!fadeScrollbars) {
+ scrollabilityCache.state = ScrollabilityCache.ON;
+ }
+ scrollabilityCache.fadeScrollBars = fadeScrollbars;
+
scrollabilityCache.scrollBarFadeDuration = a.getInt(
- R.styleable.View_scrollbarFadeDuration,
- ViewConfiguration.getScrollBarFadeDuration());
+ R.styleable.View_scrollbarFadeDuration, ViewConfiguration
+ .getScrollBarFadeDuration());
scrollabilityCache.scrollBarDefaultDelayBeforeFade = a.getInt(
R.styleable.View_scrollbarDefaultDelayBeforeFade,
ViewConfiguration.getScrollDefaultDelay());
+
+
scrollabilityCache.scrollBarSize = a.getDimensionPixelSize(
- R.styleable.View_scrollbarSize,
+ com.android.internal.R.styleable.View_scrollbarSize,
ViewConfiguration.get(mContext).getScaledScrollBarSize());
Drawable track = a.getDrawable(R.styleable.View_scrollbarTrackHorizontal);
@@ -4525,12 +4539,18 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
}
/**
- * Returns the scrollability cache, initializing a new cache if necessary.
+ * <p>
+ * Initalizes the scrollability cache if necessary.
+ * </p>
*/
- private ScrollabilityCache getScrollCache() {
+ private void initScrollCache() {
if (mScrollCache == null) {
- mScrollCache = new ScrollabilityCache(this);
+ mScrollCache = new ScrollabilityCache(ViewConfiguration.get(mContext), this);
}
+ }
+
+ private ScrollabilityCache getScrollCache() {
+ initScrollCache();
return mScrollCache;
}
@@ -11559,30 +11579,31 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
* @see #setVerticalScrollBarEnabled(boolean)
*/
protected boolean awakenScrollBars() {
- return mScrollCache != null
- && awakenScrollBars(mScrollCache.scrollBarDefaultDelayBeforeFade, true);
+ return mScrollCache != null &&
+ awakenScrollBars(mScrollCache.scrollBarDefaultDelayBeforeFade, true);
}
/**
* Trigger the scrollbars to draw.
- * <p>
* This method differs from awakenScrollBars() only in its default duration.
* initialAwakenScrollBars() will show the scroll bars for longer than
* usual to give the user more of a chance to notice them.
*
* @return true if the animation is played, false otherwise.
- * @see #awakenScrollBars()
*/
private boolean initialAwakenScrollBars() {
- return mScrollCache != null
- && awakenScrollBars(mScrollCache.scrollBarDelayBeforeInitialFade, true);
+ return mScrollCache != null &&
+ awakenScrollBars(mScrollCache.scrollBarDefaultDelayBeforeFade * 4, true);
}
/**
+ * <p>
* Trigger the scrollbars to draw. When invoked this method starts an
* animation to fade the scrollbars out after a fixed delay. If a subclass
* provides animated scrolling, the start delay should equal the duration of
* the scrolling animation.
+ * </p>
+ *
* <p>
* The animation starts only if at least one of the scrollbars is enabled,
* as specified by {@link #isHorizontalScrollBarEnabled()} and
@@ -11590,14 +11611,18 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
* this method returns true, and false otherwise. If the animation is
* started, this method calls {@link #invalidate()}; in that case the caller
* should not call {@link #invalidate()}.
+ * </p>
+ *
* <p>
* This method should be invoked every time a subclass directly updates the
* scroll parameters.
+ * </p>
*
- * @param fadeOutDelay the delay in milliseconds before the fade out
- * animation should start, or 0 to start the animation
- * immediately
+ * @param startDelay the delay, in milliseconds, after which the animation
+ * should start; when the delay is 0, the animation starts
+ * immediately
* @return true if the animation is played, false otherwise
+ *
* @see #scrollBy(int, int)
* @see #scrollTo(int, int)
* @see #isHorizontalScrollBarEnabled()
@@ -11605,15 +11630,18 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
* @see #setHorizontalScrollBarEnabled(boolean)
* @see #setVerticalScrollBarEnabled(boolean)
*/
- protected boolean awakenScrollBars(int fadeOutDelay) {
- return awakenScrollBars(fadeOutDelay, true);
+ protected boolean awakenScrollBars(int startDelay) {
+ return awakenScrollBars(startDelay, true);
}
/**
+ * <p>
* Trigger the scrollbars to draw. When invoked this method starts an
* animation to fade the scrollbars out after a fixed delay. If a subclass
* provides animated scrolling, the start delay should equal the duration of
* the scrolling animation.
+ * </p>
+ *
* <p>
* The animation starts only if at least one of the scrollbars is enabled,
* as specified by {@link #isHorizontalScrollBarEnabled()} and
@@ -11622,18 +11650,21 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
* started, this method calls {@link #invalidate()} if the invalidate parameter
* is set to true; in that case the caller
* should not call {@link #invalidate()}.
+ * </p>
+ *
* <p>
* This method should be invoked every time a subclass directly updates the
* scroll parameters.
- * <p>
- * <strong>Note:</strong> If the view has not explicitly requested
- * scrollbars prior calling this method, this is a no-op.
+ * </p>
+ *
+ * @param startDelay the delay, in milliseconds, after which the animation
+ * should start; when the delay is 0, the animation starts
+ * immediately
+ *
+ * @param invalidate Whether this method should call invalidate
*
- * @param fadeOutDelay the delay in milliseconds before the fade out
- * animation should start, or 0 to start the animation
- * immediately
- * @param invalidate whether this method should call invalidate
* @return true if the animation is played, false otherwise
+ *
* @see #scrollBy(int, int)
* @see #scrollTo(int, int)
* @see #isHorizontalScrollBarEnabled()
@@ -11641,15 +11672,50 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
* @see #setHorizontalScrollBarEnabled(boolean)
* @see #setVerticalScrollBarEnabled(boolean)
*/
- protected boolean awakenScrollBars(int fadeOutDelay, boolean invalidate) {
- if (mScrollCache == null
- || (!isHorizontalScrollBarEnabled() && !isVerticalScrollBarEnabled())) {
- // We're not supposed to show scroll bars right now.
+ protected boolean awakenScrollBars(int startDelay, boolean invalidate) {
+ final ScrollabilityCache scrollCache = mScrollCache;
+
+ if (scrollCache == null || !scrollCache.fadeScrollBars) {
return false;
}
- mScrollCache.awakenScrollBars(fadeOutDelay);
- return true;
+ if (scrollCache.scrollBar == null) {
+ scrollCache.scrollBar = new ScrollBarDrawable();
+ scrollCache.scrollBar.setCallback(this);
+ scrollCache.scrollBar.setState(getDrawableState());
+ }
+
+ if (isHorizontalScrollBarEnabled() || isVerticalScrollBarEnabled()) {
+
+ if (invalidate) {
+ // Invalidate to show the scrollbars
+ postInvalidateOnAnimation();
+ }
+
+ if (scrollCache.state == ScrollabilityCache.OFF) {
+ // FIXME: this is copied from WindowManagerService.
+ // We should get this value from the system when it
+ // is possible to do so.
+ final int KEY_REPEAT_FIRST_DELAY = 750;
+ startDelay = Math.max(KEY_REPEAT_FIRST_DELAY, startDelay);
+ }
+
+ // Tell mScrollCache when we should start fading. This may
+ // extend the fade start time if one was already scheduled
+ long fadeStartTime = AnimationUtils.currentAnimationTimeMillis() + startDelay;
+ scrollCache.fadeStartTime = fadeStartTime;
+ scrollCache.state = ScrollabilityCache.ON;
+
+ // Schedule our fader to run, unscheduling any old ones first
+ if (mAttachInfo != null) {
+ mAttachInfo.mHandler.removeCallbacks(scrollCache);
+ mAttachInfo.mHandler.postAtTime(scrollCache, fadeStartTime);
+ }
+
+ return true;
+ }
+
+ return false;
}
/**
@@ -12330,7 +12396,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
public void setHorizontalFadingEdgeEnabled(boolean horizontalFadingEdgeEnabled) {
if (isHorizontalFadingEdgeEnabled() != horizontalFadingEdgeEnabled) {
if (horizontalFadingEdgeEnabled) {
- getScrollCache();
+ initScrollCache();
}
mViewFlags ^= FADING_EDGE_HORIZONTAL;
@@ -12367,7 +12433,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
public void setVerticalFadingEdgeEnabled(boolean verticalFadingEdgeEnabled) {
if (isVerticalFadingEdgeEnabled() != verticalFadingEdgeEnabled) {
if (verticalFadingEdgeEnabled) {
- getScrollCache();
+ initScrollCache();
}
mViewFlags ^= FADING_EDGE_VERTICAL;
@@ -12507,7 +12573,14 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
* @attr ref android.R.styleable#View_fadeScrollbars
*/
public void setScrollbarFadingEnabled(boolean fadeScrollbars) {
- getScrollCache().setFadingEnabled(fadeScrollbars);
+ initScrollCache();
+ final ScrollabilityCache scrollabilityCache = mScrollCache;
+ scrollabilityCache.fadeScrollBars = fadeScrollbars;
+ if (fadeScrollbars) {
+ scrollabilityCache.state = ScrollabilityCache.OFF;
+ } else {
+ scrollabilityCache.state = ScrollabilityCache.ON;
+ }
}
/**
@@ -12519,7 +12592,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
* @attr ref android.R.styleable#View_fadeScrollbars
*/
public boolean isScrollbarFadingEnabled() {
- return mScrollCache != null && mScrollCache.isFadingEnabled();
+ return mScrollCache != null && mScrollCache.fadeScrollBars;
}
/**
@@ -12801,85 +12874,129 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
}
/**
- * Request the drawing of the horizontal and the vertical scrollbar. The
- * scrollbars are painted only if they have been awakened first.
+ * <p>Request the drawing of the horizontal and the vertical scrollbar. The
+ * scrollbars are painted only if they have been awakened first.</p>
*
* @param canvas the canvas on which to draw the scrollbars
+ *
* @see #awakenScrollBars(int)
*/
protected final void onDrawScrollBars(Canvas canvas) {
+ // scrollbars are drawn only when the animation is running
final ScrollabilityCache cache = mScrollCache;
- if (cache == null) {
- // This view does not currently support scrolling.
- return;
- }
-
- final int viewFlags = mViewFlags;
- final boolean drawHorizontalScrollBar =
- (viewFlags & SCROLLBARS_HORIZONTAL) == SCROLLBARS_HORIZONTAL;
- final boolean drawVerticalScrollBar =
- (viewFlags & SCROLLBARS_VERTICAL) == SCROLLBARS_VERTICAL
- && !isVerticalScrollBarHidden();
- if (!drawVerticalScrollBar && !drawHorizontalScrollBar) {
- // This view does not currently draw scrollbars.
- return;
- }
+ if (cache != null) {
- final ScrollBarDrawable scrollBar = cache.scrollBar;
- final int width = mRight - mLeft;
- final int height = mBottom - mTop;
- final int scrollX = mScrollX;
- final int scrollY = mScrollY;
- final int inside = (viewFlags & SCROLLBARS_OUTSIDE_MASK) == 0 ? ~0 : 0;
+ int state = cache.state;
- if (drawHorizontalScrollBar) {
- int size = scrollBar.getSize(false);
- if (size <= 0) {
- size = cache.scrollBarSize;
+ if (state == ScrollabilityCache.OFF) {
+ return;
}
- scrollBar.setParameters(computeHorizontalScrollRange(), computeHorizontalScrollOffset(),
- computeHorizontalScrollExtent(), false);
- final int verticalScrollBarGap = drawVerticalScrollBar ?
- getVerticalScrollbarWidth() : 0;
+ boolean invalidate = false;
- final int left = scrollX + (mPaddingLeft & inside);
- final int right = scrollX + width - (mUserPaddingRight & inside) - verticalScrollBarGap;
- final int top = scrollY + height - size - (mUserPaddingBottom & inside);
- final int bottom = top + size;
-
- onDrawHorizontalScrollBar(canvas, scrollBar, left, top, right, bottom);
- }
+ if (state == ScrollabilityCache.FADING) {
+ // We're fading -- get our fade interpolation
+ if (cache.interpolatorValues == null) {
+ cache.interpolatorValues = new float[1];
+ }
- if (drawVerticalScrollBar) {
- int size = scrollBar.getSize(true);
- if (size <= 0) {
- size = cache.scrollBarSize;
- }
+ float[] values = cache.interpolatorValues;
- scrollBar.setParameters(computeVerticalScrollRange(), computeVerticalScrollOffset(),
- computeVerticalScrollExtent(), true);
+ // Stops the animation if we're done
+ if (cache.scrollBarInterpolator.timeToValues(values) ==
+ Interpolator.Result.FREEZE_END) {
+ cache.state = ScrollabilityCache.OFF;
+ } else {
+ cache.scrollBar.mutate().setAlpha(Math.round(values[0]));
+ }
- final int verticalScrollbarPosition;
- if (mVerticalScrollbarPosition == SCROLLBAR_POSITION_DEFAULT) {
- verticalScrollbarPosition = isLayoutRtl() ?
- SCROLLBAR_POSITION_LEFT : SCROLLBAR_POSITION_RIGHT;
+ // This will make the scroll bars inval themselves after
+ // drawing. We only want this when we're fading so that
+ // we prevent excessive redraws
+ invalidate = true;
} else {
- verticalScrollbarPosition = mVerticalScrollbarPosition;
+ // We're just on -- but we may have been fading before so
+ // reset alpha
+ cache.scrollBar.mutate().setAlpha(255);
}
- final int left;
- if (verticalScrollbarPosition == SCROLLBAR_POSITION_LEFT) {
- left = scrollX + (mUserPaddingLeft & inside);
- } else {
- left = scrollX + width - size - (mUserPaddingRight & inside);
- }
- final int top = scrollY + (mPaddingTop & inside);
- final int right = left + size;
- final int bottom = scrollY + height - (mUserPaddingBottom & inside);
+ final int viewFlags = mViewFlags;
+
+ final boolean drawHorizontalScrollBar =
+ (viewFlags & SCROLLBARS_HORIZONTAL) == SCROLLBARS_HORIZONTAL;
+ final boolean drawVerticalScrollBar =
+ (viewFlags & SCROLLBARS_VERTICAL) == SCROLLBARS_VERTICAL
+ && !isVerticalScrollBarHidden();
+
+ if (drawVerticalScrollBar || drawHorizontalScrollBar) {
+ final int width = mRight - mLeft;
+ final int height = mBottom - mTop;
+
+ final ScrollBarDrawable scrollBar = cache.scrollBar;
+
+ final int scrollX = mScrollX;
+ final int scrollY = mScrollY;
+ final int inside = (viewFlags & SCROLLBARS_OUTSIDE_MASK) == 0 ? ~0 : 0;
+
+ int left;
+ int top;
+ int right;
+ int bottom;
- onDrawVerticalScrollBar(canvas, scrollBar, left, top, right, bottom);
+ if (drawHorizontalScrollBar) {
+ int size = scrollBar.getSize(false);
+ if (size <= 0) {
+ size = cache.scrollBarSize;
+ }
+
+ scrollBar.setParameters(computeHorizontalScrollRange(),
+ computeHorizontalScrollOffset(),
+ computeHorizontalScrollExtent(), false);
+ final int verticalScrollBarGap = drawVerticalScrollBar ?
+ getVerticalScrollbarWidth() : 0;
+ top = scrollY + height - size - (mUserPaddingBottom & inside);
+ left = scrollX + (mPaddingLeft & inside);
+ right = scrollX + width - (mUserPaddingRight & inside) - verticalScrollBarGap;
+ bottom = top + size;
+ onDrawHorizontalScrollBar(canvas, scrollBar, left, top, right, bottom);
+ if (invalidate) {
+ invalidate(left, top, right, bottom);
+ }
+ }
+
+ if (drawVerticalScrollBar) {
+ int size = scrollBar.getSize(true);
+ if (size <= 0) {
+ size = cache.scrollBarSize;
+ }
+
+ scrollBar.setParameters(computeVerticalScrollRange(),
+ computeVerticalScrollOffset(),
+ computeVerticalScrollExtent(), true);
+ int verticalScrollbarPosition = mVerticalScrollbarPosition;
+ if (verticalScrollbarPosition == SCROLLBAR_POSITION_DEFAULT) {
+ verticalScrollbarPosition = isLayoutRtl() ?
+ SCROLLBAR_POSITION_LEFT : SCROLLBAR_POSITION_RIGHT;
+ }
+ switch (verticalScrollbarPosition) {
+ default:
+ case SCROLLBAR_POSITION_RIGHT:
+ left = scrollX + width - size - (mUserPaddingRight & inside);
+ break;
+ case SCROLLBAR_POSITION_LEFT:
+ left = scrollX + (mUserPaddingLeft & inside);
+ break;
+ }
+ top = scrollY + (mPaddingTop & inside);
+ right = left + size;
+ bottom = scrollY + height - (mUserPaddingBottom & inside);
+ onDrawVerticalScrollBar(canvas, scrollBar, left, top, right, bottom);
+ if (invalidate) {
+ invalidate(left, top, right, bottom);
+ }
+ }
+ }
}
}
@@ -15245,7 +15362,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
canvas.saveLayer(right - length, top, right, bottom, null, flags);
}
} else {
- scrollabilityCache.setFadingEdgeColor(solidColor);
+ scrollabilityCache.setFadeColor(solidColor);
}
// Step 3, draw the content
@@ -15255,9 +15372,9 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
dispatchDraw(canvas);
// Step 5, draw the fade effect and restore layers
- final Paint p = scrollabilityCache.fadingEdgePaint;
+ final Paint p = scrollabilityCache.paint;
final Matrix matrix = scrollabilityCache.matrix;
- final Shader fade = scrollabilityCache.fadingEdgeShader;
+ final Shader fade = scrollabilityCache.shader;
if (drawTop) {
matrix.setScale(1, fadeHeight * topFadeStrength);
@@ -20517,164 +20634,121 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
}
/**
- * ScrollabilityCache holds various fields used by a View when scrolling
+ * <p>ScrollabilityCache holds various fields used by a View when scrolling
* is supported. This avoids keeping too many unused fields in most
- * instances of View.
+ * instances of View.</p>
*/
- private static class ScrollabilityCache {
- public final Paint fadingEdgePaint = new Paint();
- public final Matrix matrix = new Matrix();
-
- /** The view that owns this cache. */
- private final View mHost;
+ private static class ScrollabilityCache implements Runnable {
/**
- * Minimum delay in milliseconds before the fade-out animation begins.
- * Only used if the scrollbar was previously invisible.
+ * Scrollbars are not visible
*/
- private static final int MIN_FADE_DELAY_FROM_OFF = 750;
+ public static final int OFF = 0;
/**
- * Default delay in milliseconds before the fade-out animation begins.
+ * Scrollbars are visible
*/
- public int scrollBarDefaultDelayBeforeFade;
+ public static final int ON = 1;
/**
- * Delay in milliseconds before the fade-out animation begins. Only
- * used if the scrollbar is being shown to the user for the first time.
+ * Scrollbars are fading away
*/
- public int scrollBarDelayBeforeInitialFade;
+ public static final int FADING = 2;
- /** Duration in milliseconds of the fade-out animation. */
- public int scrollBarFadeDuration;
+ public boolean fadeScrollBars;
- public ScrollBarDrawable scrollBar;
- public Shader fadingEdgeShader;
public int fadingEdgeLength;
+ public int scrollBarDefaultDelayBeforeFade;
+ public int scrollBarFadeDuration;
+
public int scrollBarSize;
+ public ScrollBarDrawable scrollBar;
+ public float[] interpolatorValues;
+ public View host;
+
+ public final Paint paint;
+ public final Matrix matrix;
+ public Shader shader;
+
+ public final Interpolator scrollBarInterpolator = new Interpolator(1, 2);
+
+ private static final float[] OPAQUE = { 255 };
+ private static final float[] TRANSPARENT = { 0.0f };
/**
- * Whether scrollbar fading is enabled. If false, scrollbars are always
- * visible.
+ * When fading should start. This time moves into the future every time
+ * a new scroll happens. Measured based on SystemClock.uptimeMillis()
*/
- private boolean mIsFadingEnabled;
+ public long fadeStartTime;
- private Animator mFadeAnim;
- private int mFadingEdgeLastColor;
- public ScrollabilityCache(View host) {
- mHost = host;
+ /**
+ * The current state of the scrollbars: ON, OFF, or FADING
+ */
+ public int state = OFF;
- scrollBarFadeDuration = ViewConfiguration.getScrollBarFadeDuration();
- scrollBarDefaultDelayBeforeFade = ViewConfiguration.getScrollDefaultDelay();
- scrollBarDelayBeforeInitialFade = ViewConfiguration.getScrollDefaultInitialDelay();
+ private int mLastColor;
- final ViewConfiguration configuration = ViewConfiguration.get(host.getContext());
- scrollBarSize = configuration.getScaledScrollBarSize();
+ public ScrollabilityCache(ViewConfiguration configuration, View host) {
fadingEdgeLength = configuration.getScaledFadingEdgeLength();
+ scrollBarSize = configuration.getScaledScrollBarSize();
+ scrollBarDefaultDelayBeforeFade = ViewConfiguration.getScrollDefaultDelay();
+ scrollBarFadeDuration = ViewConfiguration.getScrollBarFadeDuration();
+
+ paint = new Paint();
+ matrix = new Matrix();
+ // use use a height of 1, and then wack the matrix each time we
+ // actually use it.
+ shader = new LinearGradient(0, 0, 0, 1, 0xFF000000, 0, Shader.TileMode.CLAMP);
+ paint.setShader(shader);
+ paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_OUT));
- // Force the fading edge color to change.
- mFadingEdgeLastColor = -1;
- setFadingEdgeColor(0);
+ this.host = host;
}
- public void setFadingEdgeColor(int color) {
- if (mFadingEdgeLastColor != color) {
- mFadingEdgeLastColor = color;
+ public void setFadeColor(int color) {
+ if (color != mLastColor) {
+ mLastColor = color;
- final int color0;
- final int color1;
- final PorterDuffXfermode xfermode;
if (color != 0) {
- color0 = color | 0xFF000000;
- color1 = color & 0x00FFFFFF;
- xfermode = null;
+ shader = new LinearGradient(0, 0, 0, 1, color | 0xFF000000,
+ color & 0x00FFFFFF, Shader.TileMode.CLAMP);
+ paint.setShader(shader);
+ // Restore the default transfer mode (src_over)
+ paint.setXfermode(null);
} else {
- color0 = 0xFF000000;
- color1 = 0;
- xfermode = new PorterDuffXfermode(PorterDuff.Mode.DST_OUT);
+ shader = new LinearGradient(0, 0, 0, 1, 0xFF000000, 0, Shader.TileMode.CLAMP);
+ paint.setShader(shader);
+ paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_OUT));
}
-
- // Use a height of 1 and then whack the matrix each time we
- // actually use it.
- fadingEdgeShader = new LinearGradient(
- 0, 0, 0, 1, color0, color1, Shader.TileMode.CLAMP);
- fadingEdgePaint.setShader(fadingEdgeShader);
- fadingEdgePaint.setXfermode(xfermode);
- }
- }
-
- public void setFadingEnabled(boolean enabled) {
- if (mIsFadingEnabled != enabled) {
- mIsFadingEnabled = enabled;
-
- setFadingAlpha(enabled ? 0 : 255);
}
}
- public boolean isFadingEnabled() {
- return mIsFadingEnabled;
- }
+ public void run() {
+ long now = AnimationUtils.currentAnimationTimeMillis();
+ if (now >= fadeStartTime) {
- /**
- * Cancels any ongoing or pending fade animations and immediately sets
- * the scroll bar alpha value.
- *
- * @param alpha the scrollbar alpha value
- */
- public void setFadingAlpha(int alpha) {
- if (mFadeAnim != null) {
- mFadeAnim.cancel();
- mFadeAnim = null;
- }
- mHost.removeCallbacks(mFadeOutRunnable);
+ // the animation fades the scrollbars out by changing
+ // the opacity (alpha) from fully opaque to fully
+ // transparent
+ int nextFrame = (int) now;
+ int framesCount = 0;
- scrollBar.setAlpha(alpha);
- }
+ Interpolator interpolator = scrollBarInterpolator;
- /**
- * If fading is enabled, cancels any ongoing or pending fade animations
- * and immediately sets the scroll bar alpha value to the maximum, then
- * posts a delayed fade-out animation.
- *
- * @param fadeOutDelay the delay before the fade-out animation starts
- * @return {@code true} if the scroll bars changed, false otherwise
- */
- public boolean awakenScrollBars(int fadeOutDelay) {
- if (!mIsFadingEnabled) {
- return false;
- }
+ // Start opaque
+ interpolator.setKeyFrame(framesCount++, nextFrame, OPAQUE);
- if (scrollBar == null) {
- scrollBar = new ScrollBarDrawable();
- scrollBar.setCallback(mHost);
- scrollBar.setState(mHost.getDrawableState());
- }
+ // End transparent
+ nextFrame += scrollBarFadeDuration;
+ interpolator.setKeyFrame(framesCount, nextFrame, TRANSPARENT);
- // Removes pending callbacks.
- setFadingAlpha(255);
+ state = FADING;
- final int startingAlpha = scrollBar.getAlpha();
- if (startingAlpha == 0) {
- fadeOutDelay = Math.max(ScrollabilityCache.MIN_FADE_DELAY_FROM_OFF, fadeOutDelay);
+ // Kick off the fade animation
+ host.invalidate(true);
}
-
- mHost.postDelayed(mFadeOutRunnable, fadeOutDelay);
-
- return true;
}
-
- private final Runnable mFadeOutRunnable = new Runnable() {
- @Override
- public void run() {
- final ObjectAnimator anim = ObjectAnimator.ofInt(
- scrollBar, ScrollBarDrawable.ALPHA, 0);
- anim.setDuration(scrollBarFadeDuration);
- anim.start();
-
- mFadeAnim = anim;
- }
- };
}
/**
diff --git a/core/java/android/view/ViewConfiguration.java b/core/java/android/view/ViewConfiguration.java
index d733513..4e91ad4 100644
--- a/core/java/android/view/ViewConfiguration.java
+++ b/core/java/android/view/ViewConfiguration.java
@@ -47,12 +47,6 @@ public class ViewConfiguration {
private static final int SCROLL_BAR_DEFAULT_DELAY = 300;
/**
- * Default delay before the scrollbars fade in milliseconds for the first
- * time they are shown to the user.
- */
- private static final int SCROLL_BAR_DEFAULT_INITIAL_DELAY = 1500;
-
- /**
* Defines the length of the fading edges in dips
*/
private static final int FADING_EDGE_LENGTH = 12;
@@ -401,23 +395,13 @@ public class ViewConfiguration {
}
/**
- * @return Default delay in milliseconds before the scrollbars fade out
- * after they have been awoken.
+ * @return Default delay before the scrollbars fade in milliseconds
*/
public static int getScrollDefaultDelay() {
return SCROLL_BAR_DEFAULT_DELAY;
}
/**
- * @return Default delay in milliseconds before the scrollbars fade out
- * after they are initially shown to the user.
- * @hide Pending cleanup of ViewConfiguration values.
- */
- public static int getScrollDefaultInitialDelay() {
- return SCROLL_BAR_DEFAULT_INITIAL_DELAY;
- }
-
- /**
* @return the length of the fading edges in dips
*
* @deprecated Use {@link #getScaledFadingEdgeLength()} instead.
diff --git a/graphics/java/android/graphics/drawable/Drawable.java b/graphics/java/android/graphics/drawable/Drawable.java
index 98767a7..247f94a 100644
--- a/graphics/java/android/graphics/drawable/Drawable.java
+++ b/graphics/java/android/graphics/drawable/Drawable.java
@@ -39,7 +39,6 @@ import android.graphics.Xfermode;
import android.os.Trace;
import android.util.AttributeSet;
import android.util.DisplayMetrics;
-import android.util.IntProperty;
import android.util.StateSet;
import android.util.TypedValue;
import android.util.Xml;
@@ -1372,20 +1371,5 @@ public abstract class Drawable {
default: return defaultMode;
}
}
-
- /** @hide */
- public static final IntProperty<Drawable> ALPHA = new IntProperty<Drawable>("alpha") {
- @Override
- public void setValue(Drawable object, int value) {
- object.mutate();
- object.setAlpha(value);
- object.invalidateSelf();
- }
-
- @Override
- public Integer get(Drawable object) {
- return object.getAlpha();
- }
- };
}