| Index: chrome/android/java/src/org/chromium/chrome/browser/searchwidget/BoxAnimatorScrim.java
|
| diff --git a/chrome/android/java/src/org/chromium/chrome/browser/searchwidget/BoxAnimatorScrim.java b/chrome/android/java/src/org/chromium/chrome/browser/searchwidget/BoxAnimatorScrim.java
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..ae7a4d882582546679901f0258465cbfd96710d3
|
| --- /dev/null
|
| +++ b/chrome/android/java/src/org/chromium/chrome/browser/searchwidget/BoxAnimatorScrim.java
|
| @@ -0,0 +1,87 @@
|
| +// Copyright 2017 The Chromium Authors. All rights reserved.
|
| +// Use of this source code is governed by a BSD-style license that can be
|
| +// found in the LICENSE file.
|
| +
|
| +package org.chromium.chrome.browser.searchwidget;
|
| +
|
| +import android.animation.ValueAnimator;
|
| +import android.content.Context;
|
| +import android.graphics.Canvas;
|
| +import android.graphics.Rect;
|
| +import android.graphics.drawable.Drawable;
|
| +import android.util.AttributeSet;
|
| +import android.view.View;
|
| +
|
| +import org.chromium.base.ApiCompatibilityUtils;
|
| +import org.chromium.chrome.R;
|
| +
|
| +/** Draws a scrim and animates a search box moving into place. */
|
| +class BoxAnimatorScrim extends View implements ValueAnimator.AnimatorUpdateListener {
|
| + /** Transparency used for the scrim. */
|
| + private static final int BACKGROUND_TRANSPARENCY = 154;
|
| +
|
| + private final Drawable mCardDrawable;
|
| + private final Rect mAnimationRect = new Rect();
|
| + private final int mBackgroundColor;
|
| +
|
| + private Rect mSourceRect;
|
| + private Rect mTargetRect;
|
| + private float mInterpolatedValue;
|
| +
|
| + public BoxAnimatorScrim(Context context, AttributeSet attrs) {
|
| + super(context, attrs);
|
| +
|
| + mBackgroundColor =
|
| + ApiCompatibilityUtils.getColor(getResources(), R.color.light_normal_color)
|
| + & 0x00ffffff;
|
| +
|
| + // Mutate to prevent the animation from affecting other places the Drawable is used.
|
| + mCardDrawable = ApiCompatibilityUtils.getDrawable(getResources(), R.drawable.card_single);
|
| + mCardDrawable.mutate();
|
| + }
|
| +
|
| + /** Sets where the box will animate from and where it will go. */
|
| + public void setAnimationRects(Rect source, Rect target) {
|
| + mSourceRect = source;
|
| + mTargetRect = target;
|
| + }
|
| +
|
| + /** Returns the last known value of the animation. */
|
| + public float getInterpolatedValue() {
|
| + return mInterpolatedValue;
|
| + }
|
| +
|
| + /** Set the current value of the animation. */
|
| + public void setInterpolatedValue(float value) {
|
| + mInterpolatedValue = Math.max(0.0f, Math.min(1.0f, value));
|
| + postInvalidateOnAnimation();
|
| + }
|
| +
|
| + @Override
|
| + public void onDraw(Canvas canvas) {
|
| + // Draw the background.
|
| + int currentAlpha = (int) (BACKGROUND_TRANSPARENCY * mInterpolatedValue);
|
| + int color = (currentAlpha << 24) + mBackgroundColor;
|
| + canvas.drawColor(color);
|
| +
|
| + // Draw the search box moving into place, if needed.
|
| + if (mSourceRect == null || mTargetRect == null) return;
|
| + if (mInterpolatedValue >= 1.0f) return;
|
| +
|
| + mAnimationRect.left = (int) interpolate(mSourceRect.left, mTargetRect.left);
|
| + mAnimationRect.right = (int) interpolate(mSourceRect.right, mTargetRect.right);
|
| + mAnimationRect.top = (int) interpolate(mSourceRect.top, mTargetRect.top);
|
| + mAnimationRect.bottom = (int) interpolate(mSourceRect.bottom, mTargetRect.bottom);
|
| + mCardDrawable.setBounds(mAnimationRect);
|
| + mCardDrawable.draw(canvas);
|
| + }
|
| +
|
| + @Override
|
| + public void onAnimationUpdate(ValueAnimator animation) {
|
| + setInterpolatedValue((Float) animation.getAnimatedValue());
|
| + }
|
| +
|
| + private float interpolate(float start, float end) {
|
| + return ((1.0f - mInterpolatedValue) * start) + (mInterpolatedValue * end);
|
| + }
|
| +}
|
|
|