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);
    }
  }
Exemple #2
0
  /**
   * 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;
  }