CardViewEclairMr1.java revision 4eb77f0ed24a9d300f7d12959de8cf7efd837e2f
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 Boyarpackage android.support.v7.widget; 1783b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar 1883b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyarimport android.content.Context; 1983b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyarimport android.graphics.Canvas; 2083b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyarimport android.graphics.Paint; 2118ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyarimport android.graphics.Rect; 2283b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyarimport android.graphics.RectF; 2318ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyarimport android.view.View; 2483b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar 2583b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyarclass CardViewEclairMr1 implements CardViewImpl { 2683b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar 2783b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar final RectF sCornerRect = new RectF(); 2883b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar 2983b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar @Override 3083b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar public void initStatic() { 3183b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar // Draws a round rect using 7 draw operations. This is faster than using 3283b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar // canvas.drawRoundRect before JBMR1 because API 11-16 used alpha mask textures to draw 3383b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar // shapes. 3483b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar RoundRectDrawableWithShadow.sRoundRectHelper 3583b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar = new RoundRectDrawableWithShadow.RoundRectHelper() { 3683b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar @Override 3783b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar public void drawRoundRect(Canvas canvas, RectF bounds, float cornerRadius, 3883b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar Paint paint) { 3983b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar final float twoRadius = cornerRadius * 2; 4083b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar final float innerWidth = bounds.width() - twoRadius; 4183b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar final float innerHeight = bounds.height() - twoRadius; 4283b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar sCornerRect.set(bounds.left, bounds.top, 4383b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar bounds.left + cornerRadius * 2, bounds.top + cornerRadius * 2); 4483b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar 4583b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar canvas.drawArc(sCornerRect, 180, 90, true, paint); 4683b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar sCornerRect.offset(innerWidth, 0); 4783b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar canvas.drawArc(sCornerRect, 270, 90, true, paint); 4883b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar sCornerRect.offset(0, innerHeight); 4983b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar canvas.drawArc(sCornerRect, 0, 90, true, paint); 5083b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar sCornerRect.offset(-innerWidth, 0); 5183b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar canvas.drawArc(sCornerRect, 90, 90, true, paint); 5283b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar 5383b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar //draw top and bottom pieces 5483b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar canvas.drawRect(bounds.left + cornerRadius, bounds.top, 5583b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar bounds.right - cornerRadius, bounds.top + cornerRadius, 5683b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar paint); 5783b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar canvas.drawRect(bounds.left + cornerRadius, 5883b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar bounds.bottom - cornerRadius, bounds.right - cornerRadius, 5983b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar bounds.bottom, paint); 6083b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar 6183b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar //center 6283b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar canvas.drawRect(bounds.left, bounds.top + cornerRadius, 6383b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar bounds.right, bounds.bottom - cornerRadius, paint); 6483b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar } 6583b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar }; 6683b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar } 6783b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar 6883b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar @Override 6983b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar public void initialize(CardViewDelegate cardView, Context context, int backgroundColor, 7018ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar float radius, float elevation, float maxElevation) { 7118ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar RoundRectDrawableWithShadow background = createBackground(context, backgroundColor, radius, 7218ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar elevation, maxElevation); 73c42ba8c000d1e6ce85e152dfc17089a0a69e739fYigit Boyar background.setAddPaddingForCorners(cardView.getPreventCornerOverlap()); 7483b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar cardView.setBackgroundDrawable(background); 7518ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar updatePadding(cardView); 7618ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar } 7718ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar 7818ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar RoundRectDrawableWithShadow createBackground(Context context, int backgroundColor, 7918ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar float radius, float elevation, float maxElevation) { 8018ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar return new RoundRectDrawableWithShadow(context.getResources(), backgroundColor, radius, 8118ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar elevation, maxElevation); 8218ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar } 8318ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar 84bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar @Override 85bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar public void updatePadding(CardViewDelegate cardView) { 8618ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar Rect shadowPadding = new Rect(); 8718ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar getShadowBackground(cardView).getMaxShadowAndCornerPadding(shadowPadding); 8818ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar ((View)cardView).setMinimumHeight((int) Math.ceil(getMinHeight(cardView))); 8918ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar ((View)cardView).setMinimumWidth((int) Math.ceil(getMinWidth(cardView))); 90bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar cardView.setShadowPadding(shadowPadding.left, shadowPadding.top, 91bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar shadowPadding.right, shadowPadding.bottom); 92bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar } 93bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar 94bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar @Override 95bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar public void onCompatPaddingChanged(CardViewDelegate cardView) { 96bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar // NO OP 9783b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar } 9883b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar 9983b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar @Override 100c42ba8c000d1e6ce85e152dfc17089a0a69e739fYigit Boyar public void onPreventCornerOverlapChanged(CardViewDelegate cardView) { 101c42ba8c000d1e6ce85e152dfc17089a0a69e739fYigit Boyar getShadowBackground(cardView).setAddPaddingForCorners(cardView.getPreventCornerOverlap()); 102c42ba8c000d1e6ce85e152dfc17089a0a69e739fYigit Boyar updatePadding(cardView); 103c42ba8c000d1e6ce85e152dfc17089a0a69e739fYigit Boyar } 104c42ba8c000d1e6ce85e152dfc17089a0a69e739fYigit Boyar 105c42ba8c000d1e6ce85e152dfc17089a0a69e739fYigit Boyar @Override 1064eb77f0ed24a9d300f7d12959de8cf7efd837e2fYigit Boyar public void setBackgroundColor(CardViewDelegate cardView, int color) { 1074eb77f0ed24a9d300f7d12959de8cf7efd837e2fYigit Boyar getShadowBackground(cardView).setColor(color); 1084eb77f0ed24a9d300f7d12959de8cf7efd837e2fYigit Boyar } 1094eb77f0ed24a9d300f7d12959de8cf7efd837e2fYigit Boyar 1104eb77f0ed24a9d300f7d12959de8cf7efd837e2fYigit Boyar @Override 11183b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar public void setRadius(CardViewDelegate cardView, float radius) { 11218ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar getShadowBackground(cardView).setCornerRadius(radius); 11318ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar updatePadding(cardView); 11483b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar } 11583b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar 11683b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar @Override 11783b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar public float getRadius(CardViewDelegate cardView) { 11818ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar return getShadowBackground(cardView).getCornerRadius(); 11918ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar } 12018ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar 12118ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar @Override 12218ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar public void setElevation(CardViewDelegate cardView, float elevation) { 12318ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar getShadowBackground(cardView).setShadowSize(elevation); 12418ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar } 12518ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar 12618ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar @Override 12718ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar public float getElevation(CardViewDelegate cardView) { 12818ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar return getShadowBackground(cardView).getShadowSize(); 12918ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar } 13018ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar 13118ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar @Override 13218ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar public void setMaxElevation(CardViewDelegate cardView, float maxElevation) { 13318ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar getShadowBackground(cardView).setMaxShadowSize(maxElevation); 13418ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar updatePadding(cardView); 13518ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar } 13618ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar 13718ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar @Override 13818ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar public float getMaxElevation(CardViewDelegate cardView) { 13918ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar return getShadowBackground(cardView).getMaxShadowSize(); 14018ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar } 14118ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar 14218ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar @Override 14318ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar public float getMinWidth(CardViewDelegate cardView) { 14418ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar return getShadowBackground(cardView).getMinWidth(); 14518ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar } 14618ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar 14718ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar @Override 14818ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar public float getMinHeight(CardViewDelegate cardView) { 14918ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar return getShadowBackground(cardView).getMinHeight(); 15018ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar } 15118ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar 15218ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar private RoundRectDrawableWithShadow getShadowBackground(CardViewDelegate cardView) { 15318ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar return ((RoundRectDrawableWithShadow) cardView.getBackground()); 15483b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar } 15583b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar}