1dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu/* 2dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu * Copyright (C) 2014 The Android Open Source Project 3dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu * 4dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except 5dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu * in compliance with the License. You may obtain a copy of the License at 6dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu * 7dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu * http://www.apache.org/licenses/LICENSE-2.0 8dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu * 9dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu * Unless required by applicable law or agreed to in writing, software distributed under the License 10dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express 11dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu * or implied. See the License for the specific language governing permissions and limitations under 12dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu * the License. 13dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu */ 14dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gupackage android.support.v17.leanback.widget; 15dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu 16dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Guimport android.content.Context; 1770acb0c19be3831a2080e4f902324de16bfbf62eTor Norbyeimport android.support.annotation.ColorInt; 18dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Guimport android.support.v17.leanback.R; 19dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Guimport android.util.AttributeSet; 20dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Guimport android.view.LayoutInflater; 21dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Guimport android.view.View; 22dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Guimport android.view.ViewGroup; 234c94efdb022031d2cbf5e80c8aa3703b01d78f68Dake Guimport android.graphics.Rect; 24dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu 25dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu/** 26a00bada00bff4a58436a39472ab14ccb7a8f619dCraig Stout * Provides an SDK version-independent wrapper to support shadows, color overlays, and rounded 27a00bada00bff4a58436a39472ab14ccb7a8f619dCraig Stout * corners. 28dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu * <p> 29dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu * {@link #prepareParentForShadow(ViewGroup)} must be called on parent of container 30dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu * before using shadow. Depending on sdk version, optical bounds might be applied 31dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu * to parent. 32dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu * </p> 33dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu * <p> 34a00bada00bff4a58436a39472ab14ccb7a8f619dCraig Stout * If shadows can appear outside the bounds of the parent view, setClipChildren(false) must 35a00bada00bff4a58436a39472ab14ccb7a8f619dCraig Stout * be called on the grandparent view. 36dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu * </p> 37dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu * <p> 38a00bada00bff4a58436a39472ab14ccb7a8f619dCraig Stout * {@link #initialize(boolean, boolean, boolean)} must be first called on the container. 39a00bada00bff4a58436a39472ab14ccb7a8f619dCraig Stout * Then call {@link #wrap(View)} to insert the wrapped view into the container. 40a00bada00bff4a58436a39472ab14ccb7a8f619dCraig Stout * </p> 41a00bada00bff4a58436a39472ab14ccb7a8f619dCraig Stout * <p> 42a00bada00bff4a58436a39472ab14ccb7a8f619dCraig Stout * Call {@link #setShadowFocusLevel(float)} to control the strength of the shadow (focused shadows 43a00bada00bff4a58436a39472ab14ccb7a8f619dCraig Stout * cast stronger shadows). 44dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu * </p> 45dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu * <p> 46f110e403308bae45a8016f462052d8c2dee870cfTim Kilbourn * Call {@link #setOverlayColor(int)} to control overlay color. 47dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu * </p> 48dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu */ 4985886809580d605d44a1f45d8bb80742d6ca987eDake Gupublic class ShadowOverlayContainer extends ViewGroup { 50dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu 51f4acd3cf076435ce836a6d4a9027b73ec3050defCraig Stout /** 52f4acd3cf076435ce836a6d4a9027b73ec3050defCraig Stout * No shadow. 53f4acd3cf076435ce836a6d4a9027b73ec3050defCraig Stout */ 54f4acd3cf076435ce836a6d4a9027b73ec3050defCraig Stout public static final int SHADOW_NONE = 1; 55f4acd3cf076435ce836a6d4a9027b73ec3050defCraig Stout 56f4acd3cf076435ce836a6d4a9027b73ec3050defCraig Stout /** 57f4acd3cf076435ce836a6d4a9027b73ec3050defCraig Stout * Shadows are fixed. 58f4acd3cf076435ce836a6d4a9027b73ec3050defCraig Stout */ 59f4acd3cf076435ce836a6d4a9027b73ec3050defCraig Stout public static final int SHADOW_STATIC = 2; 60f4acd3cf076435ce836a6d4a9027b73ec3050defCraig Stout 61f4acd3cf076435ce836a6d4a9027b73ec3050defCraig Stout /** 62f4acd3cf076435ce836a6d4a9027b73ec3050defCraig Stout * Shadows depend on the size, shape, and position of the view. 63f4acd3cf076435ce836a6d4a9027b73ec3050defCraig Stout */ 64f4acd3cf076435ce836a6d4a9027b73ec3050defCraig Stout public static final int SHADOW_DYNAMIC = 3; 65f4acd3cf076435ce836a6d4a9027b73ec3050defCraig Stout 66dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu private boolean mInitialized; 67dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu private View mColorDimOverlay; 68dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu private Object mShadowImpl; 6985886809580d605d44a1f45d8bb80742d6ca987eDake Gu private View mWrappedView; 70a76db0cf97b5f05ef0a5e1f6d999933f738f4a3eCraig Stout private boolean mRoundedCorners; 71f4acd3cf076435ce836a6d4a9027b73ec3050defCraig Stout private int mShadowType = SHADOW_NONE; 72f4acd3cf076435ce836a6d4a9027b73ec3050defCraig Stout private float mUnfocusedZ; 73f4acd3cf076435ce836a6d4a9027b73ec3050defCraig Stout private float mFocusedZ; 744c94efdb022031d2cbf5e80c8aa3703b01d78f68Dake Gu private static final Rect sTempRect = new Rect(); 75dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu 76dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu public ShadowOverlayContainer(Context context) { 77dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu this(context, null, 0); 78dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu } 79dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu 80dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu public ShadowOverlayContainer(Context context, AttributeSet attrs) { 81dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu this(context, attrs, 0); 82dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu } 83dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu 84dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu public ShadowOverlayContainer(Context context, AttributeSet attrs, int defStyle) { 85dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu super(context, attrs, defStyle); 86f4acd3cf076435ce836a6d4a9027b73ec3050defCraig Stout useStaticShadow(); 87f4acd3cf076435ce836a6d4a9027b73ec3050defCraig Stout useDynamicShadow(); 88dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu } 89dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu 90dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu /** 91dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu * Return true if the platform sdk supports shadow. 92dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu */ 93dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu public static boolean supportsShadow() { 94f4acd3cf076435ce836a6d4a9027b73ec3050defCraig Stout return StaticShadowHelper.getInstance().supportsShadow(); 95f4acd3cf076435ce836a6d4a9027b73ec3050defCraig Stout } 96f4acd3cf076435ce836a6d4a9027b73ec3050defCraig Stout 97f4acd3cf076435ce836a6d4a9027b73ec3050defCraig Stout /** 98f4acd3cf076435ce836a6d4a9027b73ec3050defCraig Stout * Returns true if the platform sdk supports dynamic shadows. 99f4acd3cf076435ce836a6d4a9027b73ec3050defCraig Stout */ 100f4acd3cf076435ce836a6d4a9027b73ec3050defCraig Stout public static boolean supportsDynamicShadow() { 101f4acd3cf076435ce836a6d4a9027b73ec3050defCraig Stout return ShadowHelper.getInstance().supportsDynamicShadow(); 102dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu } 103dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu 104dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu /** 105dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu * {@link #prepareParentForShadow(ViewGroup)} must be called on parent of container 106dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu * before using shadow. Depending on sdk version, optical bounds might be applied 107dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu * to parent. 108dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu */ 109dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu public static void prepareParentForShadow(ViewGroup parent) { 110f4acd3cf076435ce836a6d4a9027b73ec3050defCraig Stout StaticShadowHelper.getInstance().prepareParent(parent); 111f4acd3cf076435ce836a6d4a9027b73ec3050defCraig Stout } 112f4acd3cf076435ce836a6d4a9027b73ec3050defCraig Stout 113f4acd3cf076435ce836a6d4a9027b73ec3050defCraig Stout /** 114f4acd3cf076435ce836a6d4a9027b73ec3050defCraig Stout * Sets the shadow type to {@link #SHADOW_DYNAMIC} if supported. 115f4acd3cf076435ce836a6d4a9027b73ec3050defCraig Stout */ 116f4acd3cf076435ce836a6d4a9027b73ec3050defCraig Stout public void useDynamicShadow() { 117f4acd3cf076435ce836a6d4a9027b73ec3050defCraig Stout useDynamicShadow(getResources().getDimension(R.dimen.lb_material_shadow_normal_z), 118f4acd3cf076435ce836a6d4a9027b73ec3050defCraig Stout getResources().getDimension(R.dimen.lb_material_shadow_focused_z)); 119f4acd3cf076435ce836a6d4a9027b73ec3050defCraig Stout } 120f4acd3cf076435ce836a6d4a9027b73ec3050defCraig Stout 121f4acd3cf076435ce836a6d4a9027b73ec3050defCraig Stout /** 122f4acd3cf076435ce836a6d4a9027b73ec3050defCraig Stout * Sets the shadow type to {@link #SHADOW_DYNAMIC} if supported and sets the elevation/Z 123f4acd3cf076435ce836a6d4a9027b73ec3050defCraig Stout * values to the given parameteres. 124f4acd3cf076435ce836a6d4a9027b73ec3050defCraig Stout */ 125f4acd3cf076435ce836a6d4a9027b73ec3050defCraig Stout public void useDynamicShadow(float unfocusedZ, float focusedZ) { 126f4acd3cf076435ce836a6d4a9027b73ec3050defCraig Stout if (mInitialized) { 127f4acd3cf076435ce836a6d4a9027b73ec3050defCraig Stout throw new IllegalStateException("Already initialized"); 128f4acd3cf076435ce836a6d4a9027b73ec3050defCraig Stout } 129f4acd3cf076435ce836a6d4a9027b73ec3050defCraig Stout if (supportsDynamicShadow()) { 130f4acd3cf076435ce836a6d4a9027b73ec3050defCraig Stout mShadowType = SHADOW_DYNAMIC; 131f4acd3cf076435ce836a6d4a9027b73ec3050defCraig Stout mUnfocusedZ = unfocusedZ; 132f4acd3cf076435ce836a6d4a9027b73ec3050defCraig Stout mFocusedZ = focusedZ; 133f4acd3cf076435ce836a6d4a9027b73ec3050defCraig Stout } 134f4acd3cf076435ce836a6d4a9027b73ec3050defCraig Stout } 135f4acd3cf076435ce836a6d4a9027b73ec3050defCraig Stout 136f4acd3cf076435ce836a6d4a9027b73ec3050defCraig Stout /** 137f4acd3cf076435ce836a6d4a9027b73ec3050defCraig Stout * Sets the shadow type to {@link #SHADOW_STATIC} if supported. 138f4acd3cf076435ce836a6d4a9027b73ec3050defCraig Stout */ 139f4acd3cf076435ce836a6d4a9027b73ec3050defCraig Stout public void useStaticShadow() { 140f4acd3cf076435ce836a6d4a9027b73ec3050defCraig Stout if (mInitialized) { 141f4acd3cf076435ce836a6d4a9027b73ec3050defCraig Stout throw new IllegalStateException("Already initialized"); 142f4acd3cf076435ce836a6d4a9027b73ec3050defCraig Stout } 143f4acd3cf076435ce836a6d4a9027b73ec3050defCraig Stout if (supportsShadow()) { 144f4acd3cf076435ce836a6d4a9027b73ec3050defCraig Stout mShadowType = SHADOW_STATIC; 145f4acd3cf076435ce836a6d4a9027b73ec3050defCraig Stout } 146f4acd3cf076435ce836a6d4a9027b73ec3050defCraig Stout } 147f4acd3cf076435ce836a6d4a9027b73ec3050defCraig Stout 148f4acd3cf076435ce836a6d4a9027b73ec3050defCraig Stout /** 149f4acd3cf076435ce836a6d4a9027b73ec3050defCraig Stout * Returns the shadow type, one of {@link #SHADOW_NONE}, {@link #SHADOW_STATIC}, or 150f4acd3cf076435ce836a6d4a9027b73ec3050defCraig Stout * {@link #SHADOW_DYNAMIC}. 151f4acd3cf076435ce836a6d4a9027b73ec3050defCraig Stout */ 152f4acd3cf076435ce836a6d4a9027b73ec3050defCraig Stout public int getShadowType() { 153f4acd3cf076435ce836a6d4a9027b73ec3050defCraig Stout return mShadowType; 154dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu } 155dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu 156dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu /** 15714b5ad0db56bbee8966f3f04ea4a0d6cc93ebcf8Craig Stout * Initialize shadows, color overlay. 1580bc1aae85ac55af50c2debfe711505093fd3626aCraig Stout * @deprecated use {@link #initialize(boolean, boolean, boolean)} instead. 15914b5ad0db56bbee8966f3f04ea4a0d6cc93ebcf8Craig Stout */ 16014b5ad0db56bbee8966f3f04ea4a0d6cc93ebcf8Craig Stout @Deprecated 16114b5ad0db56bbee8966f3f04ea4a0d6cc93ebcf8Craig Stout public void initialize(boolean hasShadow, boolean hasColorDimOverlay) { 16214b5ad0db56bbee8966f3f04ea4a0d6cc93ebcf8Craig Stout initialize(hasShadow, hasColorDimOverlay, true); 16314b5ad0db56bbee8966f3f04ea4a0d6cc93ebcf8Craig Stout } 16414b5ad0db56bbee8966f3f04ea4a0d6cc93ebcf8Craig Stout 16514b5ad0db56bbee8966f3f04ea4a0d6cc93ebcf8Craig Stout /** 1664f34a05cdf73b68c3b2eb8678f740ab15225126aCraig Stout * Initialize shadows, color overlay, and rounded corners. All are optional. 167dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu */ 1684f34a05cdf73b68c3b2eb8678f740ab15225126aCraig Stout public void initialize(boolean hasShadow, boolean hasColorDimOverlay, boolean roundedCorners) { 169dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu if (mInitialized) { 170dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu throw new IllegalStateException(); 171dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu } 172dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu mInitialized = true; 173dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu if (hasShadow) { 174f4acd3cf076435ce836a6d4a9027b73ec3050defCraig Stout switch (mShadowType) { 175f4acd3cf076435ce836a6d4a9027b73ec3050defCraig Stout case SHADOW_DYNAMIC: 176f4acd3cf076435ce836a6d4a9027b73ec3050defCraig Stout mShadowImpl = ShadowHelper.getInstance().addDynamicShadow( 177f4acd3cf076435ce836a6d4a9027b73ec3050defCraig Stout this, mUnfocusedZ, mFocusedZ, roundedCorners); 178f4acd3cf076435ce836a6d4a9027b73ec3050defCraig Stout break; 179f4acd3cf076435ce836a6d4a9027b73ec3050defCraig Stout case SHADOW_STATIC: 180f4acd3cf076435ce836a6d4a9027b73ec3050defCraig Stout mShadowImpl = StaticShadowHelper.getInstance().addStaticShadow( 181f4acd3cf076435ce836a6d4a9027b73ec3050defCraig Stout this, roundedCorners); 182f4acd3cf076435ce836a6d4a9027b73ec3050defCraig Stout break; 183f4acd3cf076435ce836a6d4a9027b73ec3050defCraig Stout } 184dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu } 185a76db0cf97b5f05ef0a5e1f6d999933f738f4a3eCraig Stout mRoundedCorners = roundedCorners; 186dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu if (hasColorDimOverlay) { 187dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu mColorDimOverlay = LayoutInflater.from(getContext()) 188dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu .inflate(R.layout.lb_card_color_overlay, this, false); 189dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu addView(mColorDimOverlay); 190dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu } 191dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu } 192dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu 193dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu /** 194dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu * Set shadow focus level (0 to 1). 0 for unfocused, 1f for fully focused. 195dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu */ 196dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu public void setShadowFocusLevel(float level) { 197dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu if (mShadowImpl != null) { 198dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu if (level < 0f) { 199dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu level = 0f; 200dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu } else if (level > 1f) { 201dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu level = 1f; 202dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu } 203f4acd3cf076435ce836a6d4a9027b73ec3050defCraig Stout switch (mShadowType) { 204f4acd3cf076435ce836a6d4a9027b73ec3050defCraig Stout case SHADOW_DYNAMIC: 205f4acd3cf076435ce836a6d4a9027b73ec3050defCraig Stout ShadowHelper.getInstance().setShadowFocusLevel(mShadowImpl, level); 206f4acd3cf076435ce836a6d4a9027b73ec3050defCraig Stout break; 207f4acd3cf076435ce836a6d4a9027b73ec3050defCraig Stout case SHADOW_STATIC: 208f4acd3cf076435ce836a6d4a9027b73ec3050defCraig Stout StaticShadowHelper.getInstance().setShadowFocusLevel(mShadowImpl, level); 209f4acd3cf076435ce836a6d4a9027b73ec3050defCraig Stout break; 210f4acd3cf076435ce836a6d4a9027b73ec3050defCraig Stout } 211dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu } 212dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu } 213dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu 214dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu /** 215dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu * Set color (with alpha) of the overlay. 216dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu */ 21770acb0c19be3831a2080e4f902324de16bfbf62eTor Norbye public void setOverlayColor(@ColorInt int overlayColor) { 2189240e796bc63422c28f2707840bd99c48573279bDake Gu if (mColorDimOverlay != null) { 2199240e796bc63422c28f2707840bd99c48573279bDake Gu mColorDimOverlay.setBackgroundColor(overlayColor); 2209240e796bc63422c28f2707840bd99c48573279bDake Gu } 221dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu } 222dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu 223dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu /** 224dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu * Inserts view into the wrapper. 225dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu */ 226dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu public void wrap(View view) { 22785886809580d605d44a1f45d8bb80742d6ca987eDake Gu if (!mInitialized || mWrappedView != null) { 228dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu throw new IllegalStateException(); 229dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu } 230dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu if (mColorDimOverlay != null) { 231dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu addView(view, indexOfChild(mColorDimOverlay)); 232dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu } else { 233dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu addView(view); 234dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu } 23585886809580d605d44a1f45d8bb80742d6ca987eDake Gu mWrappedView = view; 236a76db0cf97b5f05ef0a5e1f6d999933f738f4a3eCraig Stout if (mRoundedCorners) { 237a76db0cf97b5f05ef0a5e1f6d999933f738f4a3eCraig Stout RoundedRectHelper.getInstance().setClipToRoundedOutline(mWrappedView, true); 238a76db0cf97b5f05ef0a5e1f6d999933f738f4a3eCraig Stout } 23985886809580d605d44a1f45d8bb80742d6ca987eDake Gu } 24085886809580d605d44a1f45d8bb80742d6ca987eDake Gu 241f4acd3cf076435ce836a6d4a9027b73ec3050defCraig Stout /** 242f4acd3cf076435ce836a6d4a9027b73ec3050defCraig Stout * Returns the wrapper view. 243f4acd3cf076435ce836a6d4a9027b73ec3050defCraig Stout */ 244f4acd3cf076435ce836a6d4a9027b73ec3050defCraig Stout public View getWrappedView() { 245f4acd3cf076435ce836a6d4a9027b73ec3050defCraig Stout return mWrappedView; 246f4acd3cf076435ce836a6d4a9027b73ec3050defCraig Stout } 247f4acd3cf076435ce836a6d4a9027b73ec3050defCraig Stout 24885886809580d605d44a1f45d8bb80742d6ca987eDake Gu @Override 24985886809580d605d44a1f45d8bb80742d6ca987eDake Gu protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 25085886809580d605d44a1f45d8bb80742d6ca987eDake Gu if (mWrappedView == null) { 25185886809580d605d44a1f45d8bb80742d6ca987eDake Gu throw new IllegalStateException(); 25285886809580d605d44a1f45d8bb80742d6ca987eDake Gu } 25385886809580d605d44a1f45d8bb80742d6ca987eDake Gu // padding and child margin are not supported. 25485886809580d605d44a1f45d8bb80742d6ca987eDake Gu // first measure the wrapped view, then measure the shadow view and/or overlay view. 25585886809580d605d44a1f45d8bb80742d6ca987eDake Gu int childWidthMeasureSpec, childHeightMeasureSpec; 25685886809580d605d44a1f45d8bb80742d6ca987eDake Gu LayoutParams lp = mWrappedView.getLayoutParams(); 25785886809580d605d44a1f45d8bb80742d6ca987eDake Gu if (lp.width == LayoutParams.MATCH_PARENT) { 25885886809580d605d44a1f45d8bb80742d6ca987eDake Gu childWidthMeasureSpec = MeasureSpec.makeMeasureSpec 25985886809580d605d44a1f45d8bb80742d6ca987eDake Gu (MeasureSpec.getSize(widthMeasureSpec), MeasureSpec.EXACTLY); 26085886809580d605d44a1f45d8bb80742d6ca987eDake Gu } else { 26185886809580d605d44a1f45d8bb80742d6ca987eDake Gu childWidthMeasureSpec = getChildMeasureSpec(widthMeasureSpec, 0, lp.width); 26285886809580d605d44a1f45d8bb80742d6ca987eDake Gu } 26385886809580d605d44a1f45d8bb80742d6ca987eDake Gu if (lp.height == LayoutParams.MATCH_PARENT) { 26485886809580d605d44a1f45d8bb80742d6ca987eDake Gu childHeightMeasureSpec = MeasureSpec.makeMeasureSpec 26585886809580d605d44a1f45d8bb80742d6ca987eDake Gu (MeasureSpec.getSize(heightMeasureSpec), MeasureSpec.EXACTLY); 26685886809580d605d44a1f45d8bb80742d6ca987eDake Gu } else { 26785886809580d605d44a1f45d8bb80742d6ca987eDake Gu childHeightMeasureSpec = getChildMeasureSpec(heightMeasureSpec, 0, lp.height); 26885886809580d605d44a1f45d8bb80742d6ca987eDake Gu } 26985886809580d605d44a1f45d8bb80742d6ca987eDake Gu mWrappedView.measure(childWidthMeasureSpec, childHeightMeasureSpec); 27085886809580d605d44a1f45d8bb80742d6ca987eDake Gu 27185886809580d605d44a1f45d8bb80742d6ca987eDake Gu int measuredWidth = mWrappedView.getMeasuredWidth(); 27285886809580d605d44a1f45d8bb80742d6ca987eDake Gu int measuredHeight = mWrappedView.getMeasuredHeight(); 27385886809580d605d44a1f45d8bb80742d6ca987eDake Gu 27485886809580d605d44a1f45d8bb80742d6ca987eDake Gu for (int i = 0; i < getChildCount(); i++) { 27585886809580d605d44a1f45d8bb80742d6ca987eDake Gu View child = getChildAt(i); 27685886809580d605d44a1f45d8bb80742d6ca987eDake Gu if (child == mWrappedView) { 27785886809580d605d44a1f45d8bb80742d6ca987eDake Gu continue; 27885886809580d605d44a1f45d8bb80742d6ca987eDake Gu } 27985886809580d605d44a1f45d8bb80742d6ca987eDake Gu lp = child.getLayoutParams(); 28085886809580d605d44a1f45d8bb80742d6ca987eDake Gu if (lp.width == LayoutParams.MATCH_PARENT) { 28185886809580d605d44a1f45d8bb80742d6ca987eDake Gu childWidthMeasureSpec = MeasureSpec.makeMeasureSpec 28285886809580d605d44a1f45d8bb80742d6ca987eDake Gu (measuredWidth, MeasureSpec.EXACTLY); 28385886809580d605d44a1f45d8bb80742d6ca987eDake Gu } else { 28485886809580d605d44a1f45d8bb80742d6ca987eDake Gu childWidthMeasureSpec = getChildMeasureSpec(widthMeasureSpec, 0, lp.width); 28585886809580d605d44a1f45d8bb80742d6ca987eDake Gu } 28685886809580d605d44a1f45d8bb80742d6ca987eDake Gu 28785886809580d605d44a1f45d8bb80742d6ca987eDake Gu if (lp.height == LayoutParams.MATCH_PARENT) { 28885886809580d605d44a1f45d8bb80742d6ca987eDake Gu childHeightMeasureSpec = MeasureSpec.makeMeasureSpec 28985886809580d605d44a1f45d8bb80742d6ca987eDake Gu (measuredHeight, MeasureSpec.EXACTLY); 29085886809580d605d44a1f45d8bb80742d6ca987eDake Gu } else { 29185886809580d605d44a1f45d8bb80742d6ca987eDake Gu childHeightMeasureSpec = getChildMeasureSpec(heightMeasureSpec, 0, lp.height); 29285886809580d605d44a1f45d8bb80742d6ca987eDake Gu } 29385886809580d605d44a1f45d8bb80742d6ca987eDake Gu child.measure(childWidthMeasureSpec, childHeightMeasureSpec); 29485886809580d605d44a1f45d8bb80742d6ca987eDake Gu } 29585886809580d605d44a1f45d8bb80742d6ca987eDake Gu setMeasuredDimension(measuredWidth, measuredHeight); 29685886809580d605d44a1f45d8bb80742d6ca987eDake Gu } 29785886809580d605d44a1f45d8bb80742d6ca987eDake Gu 29885886809580d605d44a1f45d8bb80742d6ca987eDake Gu @Override 29985886809580d605d44a1f45d8bb80742d6ca987eDake Gu protected void onLayout(boolean changed, int l, int t, int r, int b) { 30085886809580d605d44a1f45d8bb80742d6ca987eDake Gu final int count = getChildCount(); 30185886809580d605d44a1f45d8bb80742d6ca987eDake Gu for (int i = 0; i < count; i++) { 30285886809580d605d44a1f45d8bb80742d6ca987eDake Gu final View child = getChildAt(i); 30385886809580d605d44a1f45d8bb80742d6ca987eDake Gu if (child.getVisibility() != GONE) { 30485886809580d605d44a1f45d8bb80742d6ca987eDake Gu final int width = child.getMeasuredWidth(); 30585886809580d605d44a1f45d8bb80742d6ca987eDake Gu final int height = child.getMeasuredHeight(); 30685886809580d605d44a1f45d8bb80742d6ca987eDake Gu child.layout(0, 0, width, height); 30785886809580d605d44a1f45d8bb80742d6ca987eDake Gu } 30885886809580d605d44a1f45d8bb80742d6ca987eDake Gu } 3094c94efdb022031d2cbf5e80c8aa3703b01d78f68Dake Gu if (mWrappedView != null) { 3104c94efdb022031d2cbf5e80c8aa3703b01d78f68Dake Gu sTempRect.left = (int) mWrappedView.getPivotX(); 3114c94efdb022031d2cbf5e80c8aa3703b01d78f68Dake Gu sTempRect.top = (int) mWrappedView.getPivotY(); 3124c94efdb022031d2cbf5e80c8aa3703b01d78f68Dake Gu offsetDescendantRectToMyCoords(mWrappedView, sTempRect); 3134c94efdb022031d2cbf5e80c8aa3703b01d78f68Dake Gu setPivotX(sTempRect.left); 3144c94efdb022031d2cbf5e80c8aa3703b01d78f68Dake Gu setPivotY(sTempRect.top); 3154c94efdb022031d2cbf5e80c8aa3703b01d78f68Dake Gu } 316dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu } 317dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu 318dfd01bbadc107b6b3b2081ddb0236128c425f380Dake Gu} 319