CardViewEclairMr1.java revision ffbf42aa3acb41b82cc6c1226c63c3649bedfe49
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; 2383b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar 2483b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyarclass CardViewEclairMr1 implements CardViewImpl { 2583b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar 2683b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar final RectF sCornerRect = new RectF(); 2783b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar 2883b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar @Override 2983b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar public void initStatic() { 3083b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar // Draws a round rect using 7 draw operations. This is faster than using 3183b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar // canvas.drawRoundRect before JBMR1 because API 11-16 used alpha mask textures to draw 3283b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar // shapes. 338578605a165ca215bab90ee548cd305abadfa893Aurimas Liutikas RoundRectDrawableWithShadow.sRoundRectHelper = 348578605a165ca215bab90ee548cd305abadfa893Aurimas Liutikas new RoundRectDrawableWithShadow.RoundRectHelper() { 3583b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar @Override 3683b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar public void drawRoundRect(Canvas canvas, RectF bounds, float cornerRadius, 3783b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar Paint paint) { 3883b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar final float twoRadius = cornerRadius * 2; 39db27cfc95b2f12aefacdd4d656910650a7fd4663Yigit Boyar final float innerWidth = bounds.width() - twoRadius - 1; 40db27cfc95b2f12aefacdd4d656910650a7fd4663Yigit Boyar final float innerHeight = bounds.height() - twoRadius - 1; 41db27cfc95b2f12aefacdd4d656910650a7fd4663Yigit Boyar if (cornerRadius >= 1f) { 428578605a165ca215bab90ee548cd305abadfa893Aurimas Liutikas // increment corner radius to account for half pixels. 438578605a165ca215bab90ee548cd305abadfa893Aurimas Liutikas float roundedCornerRadius = cornerRadius + .5f; 448578605a165ca215bab90ee548cd305abadfa893Aurimas Liutikas sCornerRect.set(-roundedCornerRadius, -roundedCornerRadius, roundedCornerRadius, 458578605a165ca215bab90ee548cd305abadfa893Aurimas Liutikas roundedCornerRadius); 46db27cfc95b2f12aefacdd4d656910650a7fd4663Yigit Boyar int saved = canvas.save(); 478578605a165ca215bab90ee548cd305abadfa893Aurimas Liutikas canvas.translate(bounds.left + roundedCornerRadius, 488578605a165ca215bab90ee548cd305abadfa893Aurimas Liutikas bounds.top + roundedCornerRadius); 49db27cfc95b2f12aefacdd4d656910650a7fd4663Yigit Boyar canvas.drawArc(sCornerRect, 180, 90, true, paint); 50db27cfc95b2f12aefacdd4d656910650a7fd4663Yigit Boyar canvas.translate(innerWidth, 0); 51db27cfc95b2f12aefacdd4d656910650a7fd4663Yigit Boyar canvas.rotate(90); 52db27cfc95b2f12aefacdd4d656910650a7fd4663Yigit Boyar canvas.drawArc(sCornerRect, 180, 90, true, paint); 53db27cfc95b2f12aefacdd4d656910650a7fd4663Yigit Boyar canvas.translate(innerHeight, 0); 54db27cfc95b2f12aefacdd4d656910650a7fd4663Yigit Boyar canvas.rotate(90); 55db27cfc95b2f12aefacdd4d656910650a7fd4663Yigit Boyar canvas.drawArc(sCornerRect, 180, 90, true, paint); 56db27cfc95b2f12aefacdd4d656910650a7fd4663Yigit Boyar canvas.translate(innerWidth, 0); 57db27cfc95b2f12aefacdd4d656910650a7fd4663Yigit Boyar canvas.rotate(90); 58db27cfc95b2f12aefacdd4d656910650a7fd4663Yigit Boyar canvas.drawArc(sCornerRect, 180, 90, true, paint); 59db27cfc95b2f12aefacdd4d656910650a7fd4663Yigit Boyar canvas.restoreToCount(saved); 60db27cfc95b2f12aefacdd4d656910650a7fd4663Yigit Boyar //draw top and bottom pieces 618578605a165ca215bab90ee548cd305abadfa893Aurimas Liutikas canvas.drawRect(bounds.left + roundedCornerRadius - 1f, bounds.top, 628578605a165ca215bab90ee548cd305abadfa893Aurimas Liutikas bounds.right - roundedCornerRadius + 1f, 638578605a165ca215bab90ee548cd305abadfa893Aurimas Liutikas bounds.top + roundedCornerRadius, paint); 648578605a165ca215bab90ee548cd305abadfa893Aurimas Liutikas canvas.drawRect(bounds.left + roundedCornerRadius - 1f, 658578605a165ca215bab90ee548cd305abadfa893Aurimas Liutikas bounds.bottom - roundedCornerRadius + 1f, 668578605a165ca215bab90ee548cd305abadfa893Aurimas Liutikas bounds.right - roundedCornerRadius + 1f, bounds.bottom, paint); 67db27cfc95b2f12aefacdd4d656910650a7fd4663Yigit Boyar } 688578605a165ca215bab90ee548cd305abadfa893Aurimas Liutikas // center 69db27cfc95b2f12aefacdd4d656910650a7fd4663Yigit Boyar canvas.drawRect(bounds.left, bounds.top + Math.max(0, cornerRadius - 1f), 70db27cfc95b2f12aefacdd4d656910650a7fd4663Yigit Boyar bounds.right, bounds.bottom - cornerRadius + 1f, paint); 7183b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar } 7283b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar }; 7383b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar } 7483b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar 7583b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar @Override 7683b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar public void initialize(CardViewDelegate cardView, Context context, int backgroundColor, 7718ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar float radius, float elevation, float maxElevation) { 7818ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar RoundRectDrawableWithShadow background = createBackground(context, backgroundColor, radius, 7918ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar elevation, maxElevation); 80c42ba8c000d1e6ce85e152dfc17089a0a69e739fYigit Boyar background.setAddPaddingForCorners(cardView.getPreventCornerOverlap()); 81ffbf42aa3acb41b82cc6c1226c63c3649bedfe49Chris Banes cardView.setCardBackground(background); 8218ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar updatePadding(cardView); 8318ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar } 8418ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar 85ffbf42aa3acb41b82cc6c1226c63c3649bedfe49Chris Banes private RoundRectDrawableWithShadow createBackground(Context context, int backgroundColor, 8618ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar float radius, float elevation, float maxElevation) { 8718ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar return new RoundRectDrawableWithShadow(context.getResources(), backgroundColor, radius, 8818ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar elevation, maxElevation); 8918ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar } 9018ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar 91bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar @Override 92bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar public void updatePadding(CardViewDelegate cardView) { 9318ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar Rect shadowPadding = new Rect(); 9418ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar getShadowBackground(cardView).getMaxShadowAndCornerPadding(shadowPadding); 9572aedb5058595ed481c93f78deb9dc1b00fecf2aYigit Boyar cardView.setMinWidthHeightInternal((int) Math.ceil(getMinWidth(cardView)), 9672aedb5058595ed481c93f78deb9dc1b00fecf2aYigit Boyar (int) Math.ceil(getMinHeight(cardView))); 97bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar cardView.setShadowPadding(shadowPadding.left, shadowPadding.top, 98bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar shadowPadding.right, shadowPadding.bottom); 99bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar } 100bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar 101bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar @Override 102bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar public void onCompatPaddingChanged(CardViewDelegate cardView) { 103bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar // NO OP 10483b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar } 10583b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar 10683b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar @Override 107c42ba8c000d1e6ce85e152dfc17089a0a69e739fYigit Boyar public void onPreventCornerOverlapChanged(CardViewDelegate cardView) { 108c42ba8c000d1e6ce85e152dfc17089a0a69e739fYigit Boyar getShadowBackground(cardView).setAddPaddingForCorners(cardView.getPreventCornerOverlap()); 109c42ba8c000d1e6ce85e152dfc17089a0a69e739fYigit Boyar updatePadding(cardView); 110c42ba8c000d1e6ce85e152dfc17089a0a69e739fYigit Boyar } 111c42ba8c000d1e6ce85e152dfc17089a0a69e739fYigit Boyar 112c42ba8c000d1e6ce85e152dfc17089a0a69e739fYigit Boyar @Override 1134eb77f0ed24a9d300f7d12959de8cf7efd837e2fYigit Boyar public void setBackgroundColor(CardViewDelegate cardView, int color) { 1144eb77f0ed24a9d300f7d12959de8cf7efd837e2fYigit Boyar getShadowBackground(cardView).setColor(color); 1154eb77f0ed24a9d300f7d12959de8cf7efd837e2fYigit Boyar } 1164eb77f0ed24a9d300f7d12959de8cf7efd837e2fYigit Boyar 1174eb77f0ed24a9d300f7d12959de8cf7efd837e2fYigit Boyar @Override 11883b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar public void setRadius(CardViewDelegate cardView, float radius) { 11918ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar getShadowBackground(cardView).setCornerRadius(radius); 12018ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar updatePadding(cardView); 12183b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar } 12283b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar 12383b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar @Override 12483b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar public float getRadius(CardViewDelegate cardView) { 12518ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar return getShadowBackground(cardView).getCornerRadius(); 12618ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar } 12718ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar 12818ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar @Override 12918ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar public void setElevation(CardViewDelegate cardView, float elevation) { 13018ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar getShadowBackground(cardView).setShadowSize(elevation); 13118ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar } 13218ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar 13318ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar @Override 13418ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar public float getElevation(CardViewDelegate cardView) { 13518ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar return getShadowBackground(cardView).getShadowSize(); 13618ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar } 13718ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar 13818ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar @Override 13918ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar public void setMaxElevation(CardViewDelegate cardView, float maxElevation) { 14018ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar getShadowBackground(cardView).setMaxShadowSize(maxElevation); 14118ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar updatePadding(cardView); 14218ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar } 14318ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar 14418ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar @Override 14518ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar public float getMaxElevation(CardViewDelegate cardView) { 14618ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar return getShadowBackground(cardView).getMaxShadowSize(); 14718ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar } 14818ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar 14918ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar @Override 15018ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar public float getMinWidth(CardViewDelegate cardView) { 15118ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar return getShadowBackground(cardView).getMinWidth(); 15218ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar } 15318ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar 15418ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar @Override 15518ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar public float getMinHeight(CardViewDelegate cardView) { 15618ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar return getShadowBackground(cardView).getMinHeight(); 15718ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar } 15818ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar 15918ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar private RoundRectDrawableWithShadow getShadowBackground(CardViewDelegate cardView) { 160ffbf42aa3acb41b82cc6c1226c63c3649bedfe49Chris Banes return ((RoundRectDrawableWithShadow) cardView.getCardBackground()); 16183b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar } 162aa1de96894cfef188ac84b721812551d8f79a69dYigit Boyar} 163