/* * Copyright (C) 2016 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.launcher3.util; import android.annotation.TargetApi; import android.graphics.Rect; import android.os.Build; import android.view.ViewOutlineProvider; @TargetApi(Build.VERSION_CODES.LOLLIPOP) /** * A {@link ViewOutlineProvider} that animates a reveal in a "pill" shape. * A pill is simply a round rect, but we assume the width is greater than * the height and that the radius is equal to half the height. */ public class PillRevealOutlineProvider extends RevealOutlineAnimation { private int mCenterX; private int mCenterY; protected Rect mPillRect; /** * @param x reveal center x * @param y reveal center y * @param pillRect round rect that represents the final pill shape */ public PillRevealOutlineProvider(int x, int y, Rect pillRect) { mCenterX = x; mCenterY = y; mPillRect = pillRect; mOutlineRadius = pillRect.height() / 2f; } @Override public boolean shouldRemoveElevationDuringAnimation() { return false; } @Override public void setProgress(float progress) { // Assumes width is greater than height. int centerToEdge = Math.max(mCenterX, mPillRect.width() - mCenterX); int currentSize = (int) (progress * centerToEdge); // Bound the outline to the final pill shape defined by mPillRect. mOutline.left = Math.max(mPillRect.left, mCenterX - currentSize); mOutline.top = Math.max(mPillRect.top, mCenterY - currentSize); mOutline.right = Math.min(mPillRect.right, mCenterX + currentSize); mOutline.bottom = Math.min(mPillRect.bottom, mCenterY + currentSize); mOutlineRadius = mOutline.height() / 2; } }