1d4d171425e64ee23a8e3034eebeee3270f21002bJon Miranda/* 2d4d171425e64ee23a8e3034eebeee3270f21002bJon Miranda * Copyright (C) 2017 The Android Open Source Project 3d4d171425e64ee23a8e3034eebeee3270f21002bJon Miranda * 4d4d171425e64ee23a8e3034eebeee3270f21002bJon Miranda * Licensed under the Apache License, Version 2.0 (the "License"); 5d4d171425e64ee23a8e3034eebeee3270f21002bJon Miranda * you may not use this file except in compliance with the License. 6d4d171425e64ee23a8e3034eebeee3270f21002bJon Miranda * You may obtain a copy of the License at 7d4d171425e64ee23a8e3034eebeee3270f21002bJon Miranda * 8d4d171425e64ee23a8e3034eebeee3270f21002bJon Miranda * http://www.apache.org/licenses/LICENSE-2.0 9d4d171425e64ee23a8e3034eebeee3270f21002bJon Miranda * 10d4d171425e64ee23a8e3034eebeee3270f21002bJon Miranda * Unless required by applicable law or agreed to in writing, software 11d4d171425e64ee23a8e3034eebeee3270f21002bJon Miranda * distributed under the License is distributed on an "AS IS" BASIS, 12d4d171425e64ee23a8e3034eebeee3270f21002bJon Miranda * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13d4d171425e64ee23a8e3034eebeee3270f21002bJon Miranda * See the License for the specific language governing permissions and 14d4d171425e64ee23a8e3034eebeee3270f21002bJon Miranda * limitations under the License. 15d4d171425e64ee23a8e3034eebeee3270f21002bJon Miranda */ 16d4d171425e64ee23a8e3034eebeee3270f21002bJon Miranda 17d4d171425e64ee23a8e3034eebeee3270f21002bJon Mirandapackage com.android.launcher3.anim; 18d4d171425e64ee23a8e3034eebeee3270f21002bJon Miranda 19d4d171425e64ee23a8e3034eebeee3270f21002bJon Mirandaimport android.graphics.Rect; 20d4d171425e64ee23a8e3034eebeee3270f21002bJon Miranda 21acaf5b3a37af11b40166c10e856175bb96cb1476Tonyimport com.android.launcher3.popup.PopupContainerWithArrow; 22acaf5b3a37af11b40166c10e856175bb96cb1476Tony 23acaf5b3a37af11b40166c10e856175bb96cb1476Tonyimport static com.android.launcher3.popup.PopupContainerWithArrow.ROUNDED_BOTTOM_CORNERS; 24acaf5b3a37af11b40166c10e856175bb96cb1476Tonyimport static com.android.launcher3.popup.PopupContainerWithArrow.ROUNDED_TOP_CORNERS; 25acaf5b3a37af11b40166c10e856175bb96cb1476Tony 26d4d171425e64ee23a8e3034eebeee3270f21002bJon Miranda/** 27d4d171425e64ee23a8e3034eebeee3270f21002bJon Miranda * A {@link RevealOutlineAnimation} that provides an outline that interpolates between two radii 28d4d171425e64ee23a8e3034eebeee3270f21002bJon Miranda * and two {@link Rect}s. 29d4d171425e64ee23a8e3034eebeee3270f21002bJon Miranda * 30d4d171425e64ee23a8e3034eebeee3270f21002bJon Miranda * An example usage of this provider is an outline that starts out as a circle and ends 31d4d171425e64ee23a8e3034eebeee3270f21002bJon Miranda * as a rounded rectangle. 32d4d171425e64ee23a8e3034eebeee3270f21002bJon Miranda */ 33d4d171425e64ee23a8e3034eebeee3270f21002bJon Mirandapublic class RoundedRectRevealOutlineProvider extends RevealOutlineAnimation { 34d4d171425e64ee23a8e3034eebeee3270f21002bJon Miranda private final float mStartRadius; 35d4d171425e64ee23a8e3034eebeee3270f21002bJon Miranda private final float mEndRadius; 36d4d171425e64ee23a8e3034eebeee3270f21002bJon Miranda 37d4d171425e64ee23a8e3034eebeee3270f21002bJon Miranda private final Rect mStartRect; 38d4d171425e64ee23a8e3034eebeee3270f21002bJon Miranda private final Rect mEndRect; 39d4d171425e64ee23a8e3034eebeee3270f21002bJon Miranda 40acaf5b3a37af11b40166c10e856175bb96cb1476Tony private final @PopupContainerWithArrow.RoundedCornerFlags int mRoundedCorners; 41acaf5b3a37af11b40166c10e856175bb96cb1476Tony 42d4d171425e64ee23a8e3034eebeee3270f21002bJon Miranda public RoundedRectRevealOutlineProvider(float startRadius, float endRadius, Rect startRect, 43d4d171425e64ee23a8e3034eebeee3270f21002bJon Miranda Rect endRect) { 44acaf5b3a37af11b40166c10e856175bb96cb1476Tony this(startRadius, endRadius, startRect, endRect, 45acaf5b3a37af11b40166c10e856175bb96cb1476Tony ROUNDED_TOP_CORNERS | ROUNDED_BOTTOM_CORNERS); 46acaf5b3a37af11b40166c10e856175bb96cb1476Tony } 47acaf5b3a37af11b40166c10e856175bb96cb1476Tony 48acaf5b3a37af11b40166c10e856175bb96cb1476Tony public RoundedRectRevealOutlineProvider(float startRadius, float endRadius, Rect startRect, 49acaf5b3a37af11b40166c10e856175bb96cb1476Tony Rect endRect, int roundedCorners) { 50d4d171425e64ee23a8e3034eebeee3270f21002bJon Miranda mStartRadius = startRadius; 51d4d171425e64ee23a8e3034eebeee3270f21002bJon Miranda mEndRadius = endRadius; 52d4d171425e64ee23a8e3034eebeee3270f21002bJon Miranda mStartRect = startRect; 53d4d171425e64ee23a8e3034eebeee3270f21002bJon Miranda mEndRect = endRect; 54acaf5b3a37af11b40166c10e856175bb96cb1476Tony mRoundedCorners = roundedCorners; 55d4d171425e64ee23a8e3034eebeee3270f21002bJon Miranda } 56d4d171425e64ee23a8e3034eebeee3270f21002bJon Miranda 57d4d171425e64ee23a8e3034eebeee3270f21002bJon Miranda @Override 58d4d171425e64ee23a8e3034eebeee3270f21002bJon Miranda public boolean shouldRemoveElevationDuringAnimation() { 59aa2272f81cc4a62f847db777efda7959cc2b9979Tony Wickham return false; 60d4d171425e64ee23a8e3034eebeee3270f21002bJon Miranda } 61d4d171425e64ee23a8e3034eebeee3270f21002bJon Miranda 62d4d171425e64ee23a8e3034eebeee3270f21002bJon Miranda @Override 63d4d171425e64ee23a8e3034eebeee3270f21002bJon Miranda public void setProgress(float progress) { 64d4d171425e64ee23a8e3034eebeee3270f21002bJon Miranda mOutlineRadius = (1 - progress) * mStartRadius + progress * mEndRadius; 65d4d171425e64ee23a8e3034eebeee3270f21002bJon Miranda 66d4d171425e64ee23a8e3034eebeee3270f21002bJon Miranda mOutline.left = (int) ((1 - progress) * mStartRect.left + progress * mEndRect.left); 67d4d171425e64ee23a8e3034eebeee3270f21002bJon Miranda mOutline.top = (int) ((1 - progress) * mStartRect.top + progress * mEndRect.top); 68acaf5b3a37af11b40166c10e856175bb96cb1476Tony if ((mRoundedCorners & ROUNDED_TOP_CORNERS) == 0) { 69acaf5b3a37af11b40166c10e856175bb96cb1476Tony mOutline.top -= mOutlineRadius; 70acaf5b3a37af11b40166c10e856175bb96cb1476Tony } 71d4d171425e64ee23a8e3034eebeee3270f21002bJon Miranda mOutline.right = (int) ((1 - progress) * mStartRect.right + progress * mEndRect.right); 72d4d171425e64ee23a8e3034eebeee3270f21002bJon Miranda mOutline.bottom = (int) ((1 - progress) * mStartRect.bottom + progress * mEndRect.bottom); 73acaf5b3a37af11b40166c10e856175bb96cb1476Tony if ((mRoundedCorners & ROUNDED_BOTTOM_CORNERS) == 0) { 74acaf5b3a37af11b40166c10e856175bb96cb1476Tony mOutline.bottom += mOutlineRadius; 75acaf5b3a37af11b40166c10e856175bb96cb1476Tony } 76d4d171425e64ee23a8e3034eebeee3270f21002bJon Miranda } 77d4d171425e64ee23a8e3034eebeee3270f21002bJon Miranda} 78