Created
April 28, 2014 12:28
-
-
Save mrenouf/11370336 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/** | |
* <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.</p> | |
*/ | |
private static class ScrollabilityCache implements Runnable { | |
/** | |
* Scrollbars are not visible | |
*/ | |
public static final int OFF = 0; | |
/** | |
* Scrollbars are visible | |
*/ | |
public static final int ON = 1; | |
/** | |
* Scrollbars are fading away | |
*/ | |
public static final int FADING = 2; | |
public boolean fadeScrollBars; | |
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 }; | |
/** | |
* When fading should start. This time moves into the future every time | |
* a new scroll happens. Measured based on SystemClock.uptimeMillis() | |
*/ | |
public long fadeStartTime; | |
/** | |
* The current state of the scrollbars: ON, OFF, or FADING | |
*/ | |
public int state = OFF; | |
private int mLastColor; | |
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)); | |
this.host = host; | |
} | |
public void setFadeColor(int color) { | |
if (color != mLastColor) { | |
mLastColor = color; | |
if (color != 0) { | |
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 { | |
shader = new LinearGradient(0, 0, 0, 1, 0xFF000000, 0, Shader.TileMode.CLAMP); | |
paint.setShader(shader); | |
paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_OUT)); | |
} | |
} | |
} | |
public void run() { | |
long now = AnimationUtils.currentAnimationTimeMillis(); | |
if (now >= fadeStartTime) { | |
// the animation fades the scrollbars out by changing | |
// the opacity (alpha) from fully opaque to fully | |
// transparent | |
int nextFrame = (int) now; | |
int framesCount = 0; | |
Interpolator interpolator = scrollBarInterpolator; | |
// Start opaque | |
interpolator.setKeyFrame(framesCount++, nextFrame, OPAQUE); | |
// End transparent | |
nextFrame += scrollBarFadeDuration; | |
interpolator.setKeyFrame(framesCount, nextFrame, TRANSPARENT); | |
state = FADING; | |
// Kick off the fade animation | |
host.invalidate(true); | |
} | |
} | |
} | |
/** | |
* Resuable callback for sending | |
* {@link AccessibilityEvent#TYPE_VIEW_SCROLLED} accessibility event. | |
*/ | |
private class SendViewScrolledAccessibilityEvent implements Runnable { | |
public volatile boolean mIsPending; | |
public void run() { | |
sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_SCROLLED); | |
mIsPending = false; | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment