final void update() { if (mIsRunning) { // Update the animated fraction final long elapsed = SystemClock.uptimeMillis() - mStartTime; final float linearFraction = MathUtils.constrain(elapsed / (float) mDuration, 0f, 1f); mAnimatedFraction = mInterpolator != null ? mInterpolator.getInterpolation(linearFraction) : linearFraction; // If we're running, dispatch to the update listeners dispatchAnimationUpdate(); // Check to see if we've passed the animation duration if (SystemClock.uptimeMillis() >= (mStartTime + mDuration)) { mIsRunning = false; dispatchAnimationEnd(); } } if (mIsRunning) { // If we're still running, post another delayed runnable sHandler.postDelayed(mRunnable, HANDLER_DELAY); } }
/** * Creates an approximated cubic gradient using a multi-stop linear gradient. See <a * href="https://plus.google.com/+RomanNurik/posts/2QvHVFWrHZf">this post</a> for more details. */ public static Drawable makeCubicGradientScrimDrawable( @ColorInt int baseColor, int numStops, int gravity) { numStops = Math.max(numStops, 2); PaintDrawable paintDrawable = new PaintDrawable(); paintDrawable.setShape(new RectShape()); final int[] stopColors = new int[numStops]; int alpha = Color.alpha(baseColor); for (int i = 0; i < numStops; i++) { float x = i * 1f / (numStops - 1); float opacity = MathUtils.constrain(0, 1, (float) Math.pow(x, 3)); stopColors[i] = ColorUtils.modifyAlpha(baseColor, (int) (alpha * opacity)); } final float x0, x1, y0, y1; switch (gravity & Gravity.HORIZONTAL_GRAVITY_MASK) { case Gravity.LEFT: x0 = 1; x1 = 0; break; case Gravity.RIGHT: x0 = 0; x1 = 1; break; default: x0 = 0; x1 = 0; break; } switch (gravity & Gravity.VERTICAL_GRAVITY_MASK) { case Gravity.TOP: y0 = 1; y1 = 0; break; case Gravity.BOTTOM: y0 = 0; y1 = 1; break; default: y0 = 0; y1 = 0; break; } paintDrawable.setShaderFactory( new ShapeDrawable.ShaderFactory() { @Override public Shader resize(int width, int height) { LinearGradient linearGradient = new LinearGradient( width * x0, height * y0, width * x1, height * y1, stopColors, null, Shader.TileMode.CLAMP); return linearGradient; } }); return paintDrawable; }