CardView.java revision a52784195525cdb1f2bb4d8dde1b8b314f480957
183b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar/* 283b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar * Copyright (C) 2014 The Android Open Source Project 383b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar * 483b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar * Licensed under the Apache License, Version 2.0 (the "License"); 583b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar * you may not use this file except in compliance with the License. 683b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar * You may obtain a copy of the License at 783b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar * 883b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar * http://www.apache.org/licenses/LICENSE-2.0 983b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar * 1083b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar * Unless required by applicable law or agreed to in writing, software 1183b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar * distributed under the License is distributed on an "AS IS" BASIS, 1283b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1383b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar * See the License for the specific language governing permissions and 1483b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar * limitations under the License. 1583b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar */ 1683b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar 1783b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyarpackage android.support.v7.widget; 1883b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar 1983b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyarimport android.content.Context; 2083b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyarimport android.content.res.TypedArray; 2118ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyarimport android.graphics.Rect; 2283b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyarimport android.os.Build; 2383b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyarimport android.support.v7.cardview.R; 2483b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyarimport android.util.AttributeSet; 2583b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyarimport android.widget.FrameLayout; 2683b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar 2783b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar/** 2818ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar * A FrameLayout with a rounded corner background and shadow. 2983b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar * <p> 3083b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar * CardView uses <code>elevation</code> property on L for shadows and falls back to a custom shadow 3183b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar * implementation on older platforms. 3283b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar * <p> 3318ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar * Due to expensive nature of rounded corner clipping, on platforms before L, CardView does not 3418ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar * clip its children that intersect with rounded corners. Instead, it adds padding to avoid such 3583b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar * intersection. 3618ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar * <p> 3718ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar * Before L, CardView adds padding to its content and draws shadows to that area. This padding 38bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar * amount is equal to <code>maxCardElevation + (1 - cos45) * cornerRadius</code> on the sides and 39bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar * <code>maxCardElevation * 1.5 + (1 - cos45) * cornerRadius</code> on top and bottom. 40bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar * <p> 41bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar * Since padding is used to offset content for shadows, you cannot set padding on CardView. Instead, 42bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar * you can use content padding attributes in XML or {@link #setContentPadding(int, int, int, int)} 43bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar * in code to set the padding between the edges of the Card and children of CardView. 44bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar * <p> 45bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar * Note that, if you specify exact dimensions for the CardView, because of the shadows, its content 46bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar * area will be different between platforms before L and after L. By using api version specific 47bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar * resource values, you can avoid these changes. Alternatively, If you want CardView to add inner 48bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar * padding on platforms L and after as well, you can set {@link #setUseCompatPadding(boolean)} to 49bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar * <code>true</code>. 5018ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar * <p> 5118ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar * To change CardView's elevation in a backward compatible way, use 5218ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar * {@link #setCardElevation(float)}. CardView will use elevation API on L and before L, it will 5318ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar * change the shadow size. To avoid moving the View while shadow size is changing, shadow size is 5418ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar * clamped by {@link #getMaxCardElevation()}. If you want to change elevation dynamically, you 5518ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar * should call {@link #setMaxCardElevation(float)} when CardView is initialized. 5683b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar * 5783b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar * @attr ref android.support.v7.cardview.R.styleable#CardView_cardBackgroundColor 58bc943f7fa746c149c5e4c3a4eed7febe494d5df5Yigit Boyar * @attr ref android.support.v7.cardview.R.styleable#CardView_cardCornerRadius 5918ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar * @attr ref android.support.v7.cardview.R.styleable#CardView_cardElevation 6018ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar * @attr ref android.support.v7.cardview.R.styleable#CardView_cardMaxElevation 61bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar * @attr ref android.support.v7.cardview.R.styleable#CardView_cardUseCompatPadding 62bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar * @attr ref android.support.v7.cardview.R.styleable#CardView_contentPadding 63bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar * @attr ref android.support.v7.cardview.R.styleable#CardView_contentPaddingLeft 64bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar * @attr ref android.support.v7.cardview.R.styleable#CardView_contentPaddingTop 65bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar * @attr ref android.support.v7.cardview.R.styleable#CardView_contentPaddingRight 66bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar * @attr ref android.support.v7.cardview.R.styleable#CardView_contentPaddingBottom 6783b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar */ 6883b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyarpublic class CardView extends FrameLayout implements CardViewDelegate { 6983b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar 70bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar private static final CardViewImpl IMPL; 7118ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar 7283b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar static { 73a52784195525cdb1f2bb4d8dde1b8b314f480957Chet Haase if (Build.VERSION.SDK_INT >= 21) { 7483b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar IMPL = new CardViewApi21(); 7583b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar } else if (Build.VERSION.SDK_INT >= 17) { 7683b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar IMPL = new CardViewJellybeanMr1(); 7783b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar } else { 7883b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar IMPL = new CardViewEclairMr1(); 7983b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar } 8083b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar IMPL.initStatic(); 8183b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar } 8283b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar 83bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar private boolean mCompatPadding; 84bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar 85bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar private final Rect mContentPadding = new Rect(); 86bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar 87bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar private final Rect mShadowBounds = new Rect(); 88bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar 89bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar 9083b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar public CardView(Context context) { 9183b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar super(context); 9283b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar initialize(context, null, 0); 9383b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar } 9483b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar 9583b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar public CardView(Context context, AttributeSet attrs) { 9683b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar super(context, attrs); 9783b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar initialize(context, attrs, 0); 9883b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar } 9983b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar 10083b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar public CardView(Context context, AttributeSet attrs, int defStyleAttr) { 10183b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar super(context, attrs, defStyleAttr); 10283b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar initialize(context, attrs, defStyleAttr); 10383b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar } 10483b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar 105bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar @Override 106bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar public void setPadding(int left, int top, int right, int bottom) { 107bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar // NO OP 108bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar } 109bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar 110bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar public void setPaddingRelative(int start, int top, int end, int bottom) { 111bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar // NO OP 112bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar } 113bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar 114bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar /** 115bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar * Returns whether CardView will add inner padding on platforms L and after. 116bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar * 117bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar * @return True CardView adds inner padding on platforms L and after to have same dimensions 118bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar * with platforms before L. 119bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar */ 120bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar public boolean getUseCompatPadding() { 121bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar return mCompatPadding; 122bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar } 123bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar 124bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar /** 125bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar * CardView adds additional padding to draw shadows on platforms before L. 126bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar * <p> 127bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar * This may cause Cards to have different sizes between L and before L. If you need to align 128bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar * CardView with other Views, you may need api version specific dimension resources to account 129bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar * for the changes. 130bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar * As an alternative, you can set this flag to <code>true</code> and CardView will add the same 131bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar * padding values on platforms L and after. 132bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar * <p> 133bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar * Since setting this flag to true adds unnecessary gaps in the UI, default value is 134bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar * <code>false</code>. 135bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar * 136bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar * @attr ref android.support.v7.cardview.R.styleable#CardView_cardUseCompatPadding 137bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar * @param useCompatPadding True if CardView should add padding for the shadows on platforms L 138bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar * and above. 139bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar */ 140bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar public void setUseCompatPadding(boolean useCompatPadding) { 141bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar if (mCompatPadding == useCompatPadding) { 142bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar return; 143bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar } 144bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar mCompatPadding = useCompatPadding; 145bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar IMPL.onCompatPaddingChanged(this); 146bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar } 147bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar 148bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar /** 149bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar * Sets the padding between the Card's edges and the children of CardView. 150bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar * <p> 151bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar * Depending on platform version or {@link #getUseCompatPadding()} settings, CardView may 152bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar * update these values before calling {@link android.view.View#setPadding(int, int, int, int)}. 153bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar * 154bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar * @attr ref android.support.v7.cardview.R.styleable#CardView_contentPadding 155bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar * @attr ref android.support.v7.cardview.R.styleable#CardView_contentPaddingLeft 156bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar * @attr ref android.support.v7.cardview.R.styleable#CardView_contentPaddingTop 157bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar * @attr ref android.support.v7.cardview.R.styleable#CardView_contentPaddingRight 158bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar * @attr ref android.support.v7.cardview.R.styleable#CardView_contentPaddingBottom 159bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar * @param left The left padding in pixels 160bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar * @param top the top padding in pixels 161bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar * @param right the right padding in pixels 162bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar * @param bottom the bottom padding in pixels 163bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar */ 164bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar public void setContentPadding(int left, int top, int right, int bottom) { 165bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar mContentPadding.set(left, top, right, bottom); 166bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar IMPL.updatePadding(this); 167bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar } 16818ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar 16918ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar @Override 17018ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 17118ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar if (IMPL instanceof CardViewApi21 == false) { 17218ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar final int widthMode = MeasureSpec.getMode(widthMeasureSpec); 17318ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar switch (widthMode) { 17418ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar case MeasureSpec.EXACTLY: 17518ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar case MeasureSpec.AT_MOST: 17618ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar final int minWidth = (int) Math.ceil(IMPL.getMinWidth(this)); 17718ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar widthMeasureSpec = MeasureSpec.makeMeasureSpec(Math.max(minWidth, 17818ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar MeasureSpec.getSize(widthMeasureSpec)), widthMode); 17918ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar break; 18018ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar } 18118ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar 18218ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar final int heightMode = MeasureSpec.getMode(heightMeasureSpec); 18318ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar switch (heightMode) { 18418ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar case MeasureSpec.EXACTLY: 18518ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar case MeasureSpec.AT_MOST: 18618ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar final int minHeight = (int) Math.ceil(IMPL.getMinHeight(this)); 18718ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar heightMeasureSpec = MeasureSpec.makeMeasureSpec(Math.max(minHeight, 18818ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar MeasureSpec.getSize(heightMeasureSpec)), heightMode); 18918ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar break; 19018ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar } 19118ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar super.onMeasure(widthMeasureSpec, heightMeasureSpec); 19218ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar } else { 19318ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar super.onMeasure(widthMeasureSpec, heightMeasureSpec); 19418ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar } 19518ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar } 19618ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar 19783b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar private void initialize(Context context, AttributeSet attrs, int defStyleAttr) { 19883b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.CardView, defStyleAttr, 199bc943f7fa746c149c5e4c3a4eed7febe494d5df5Yigit Boyar R.style.CardView_Light); 20083b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar int backgroundColor = a.getColor(R.styleable.CardView_cardBackgroundColor, 0); 20183b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar float radius = a.getDimension(R.styleable.CardView_cardCornerRadius, 0); 20218ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar float elevation = a.getDimension(R.styleable.CardView_cardElevation, 0); 20318ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar float maxElevation = a.getDimension(R.styleable.CardView_cardMaxElevation, 0); 204bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar mCompatPadding = a.getBoolean(R.styleable.CardView_cardUseCompatPadding, false); 205bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar int defaultPadding = a.getDimensionPixelSize(R.styleable.CardView_contentPadding, 0); 206bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar mContentPadding.left = a.getDimensionPixelSize(R.styleable.CardView_contentPaddingLeft, 207bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar defaultPadding); 208bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar mContentPadding.top = a.getDimensionPixelSize(R.styleable.CardView_contentPaddingTop, 209bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar defaultPadding); 210bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar mContentPadding.right = a.getDimensionPixelSize(R.styleable.CardView_contentPaddingRight, 211bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar defaultPadding); 212bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar mContentPadding.bottom = a.getDimensionPixelSize(R.styleable.CardView_contentPaddingBottom, 213bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar defaultPadding); 21418ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar if (elevation > maxElevation) { 21518ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar maxElevation = elevation; 21618ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar } 21783b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar a.recycle(); 21818ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar IMPL.initialize(this, context, backgroundColor, radius, elevation, maxElevation); 21983b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar } 22083b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar 22183b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar /** 222bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar * Returns the inner padding after the Card's left edge 223bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar * 224bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar * @return the inner padding after the Card's left edge 225bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar */ 226bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar public int getContentPaddingLeft() { 227bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar return mContentPadding.left; 228bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar } 229bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar 230bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar /** 231bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar * Returns the inner padding before the Card's right edge 232bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar * 233bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar * @return the inner padding before the Card's right edge 234bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar */ 235bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar public int getContentPaddingRight() { 236bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar return mContentPadding.right; 237bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar } 238bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar 239bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar /** 240bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar * Returns the inner padding after the Card's top edge 241bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar * 242bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar * @return the inner padding after the Card's top edge 243bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar */ 244bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar public int getContentPaddingTop() { 245bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar return mContentPadding.top; 246bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar } 247bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar 248bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar /** 249bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar * Returns the inner padding before the Card's bottom edge 250bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar * 251bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar * @return the inner padding before the Card's bottom edge 252bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar */ 253bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar public int getContentPaddingBottom() { 254bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar return mContentPadding.bottom; 255bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar } 256bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar 257bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar /** 25883b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar * Updates the corner radius of the CardView. 25983b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar * 26083b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar * @param radius The radius in pixels of the corners of the rectangle shape 261bc943f7fa746c149c5e4c3a4eed7febe494d5df5Yigit Boyar * @attr ref android.support.v7.cardview.R.styleable#CardView_cardCornerRadius 26283b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar * @see #setRadius(float) 26383b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar */ 26483b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar public void setRadius(float radius) { 26583b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar IMPL.setRadius(this, radius); 26683b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar } 26783b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar 26883b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar /** 26983b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar * Returns the corner radius of the CardView. 27083b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar * 27183b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar * @return Corner radius of the CardView 27283b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar * @see #getRadius() 27383b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar */ 27483b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar public float getRadius() { 27583b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar return IMPL.getRadius(this); 27683b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar } 27718ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar 27818ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar /** 279bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar * Internal method used by CardView implementations to update the padding. 280bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar * @hide 281bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar */ 282bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar @Override 283bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar public void setShadowPadding(int left, int top, int right, int bottom) { 284bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar mShadowBounds.set(left, top, right, bottom); 285bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar super.setPadding(left + mContentPadding.left, top + mContentPadding.top, 286bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar right + mContentPadding.right, bottom + mContentPadding.bottom); 287bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar } 288bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar 289bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar /** 29018ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar * Updates the backward compatible elevation of the CardView. 29118ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar * 29218ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar * @param radius The backward compatible elevation in pixels. 29318ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar * @attr ref android.support.v7.cardview.R.styleable#CardView_cardElevation 29418ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar * @see #getCardElevation() 29518ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar * @see #setMaxCardElevation(float) 29618ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar */ 29718ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar public void setCardElevation(float radius) { 29818ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar IMPL.setElevation(this, radius); 29918ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar } 30018ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar 30118ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar /** 30218ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar * Returns the backward compatible elevation of the CardView. 30318ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar * 30418ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar * @return Elevation of the CardView 30518ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar * @see #setCardElevation(float) 30618ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar * @see #getMaxCardElevation() 30718ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar */ 30818ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar public float getCardElevation() { 30918ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar return IMPL.getElevation(this); 31018ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar } 31118ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar 31218ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar /** 31318ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar * Updates the backward compatible elevation of the CardView. 31418ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar * <p> 315bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar * Calling this method has no effect if device OS version is L or newer and 316bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar * {@link #getUseCompatPadding()} is <code>false</code>. 31718ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar * 31818ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar * @param radius The backward compatible elevation in pixels. 31918ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar * @attr ref android.support.v7.cardview.R.styleable#CardView_cardElevation 32018ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar * @see #setCardElevation(float) 32118ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar * @see #getMaxCardElevation() 32218ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar */ 32318ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar public void setMaxCardElevation(float radius) { 32418ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar IMPL.setMaxElevation(this, radius); 32518ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar } 32618ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar 32718ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar /** 32818ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar * Returns the backward compatible elevation of the CardView. 32918ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar * 33018ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar * @return Elevation of the CardView 33118ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar * @see #setMaxCardElevation(float) 33218ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar * @see #getCardElevation() 33318ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar */ 33418ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar public float getMaxCardElevation() { 33518ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar return IMPL.getMaxElevation(this); 33618ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar } 337bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar 338bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar @Override 339bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar public boolean useCompatPadding() { 340bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar return mCompatPadding; 341bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar } 342bc943f7fa746c149c5e4c3a4eed7febe494d5df5Yigit Boyar} 343