CardViewEclairMr1.java revision 378f43e4b46983d21915b37ff483b1725f144dae
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); 64378f43e4b46983d21915b37ff483b1725f144daeAurimas Liutikas 658578605a165ca215bab90ee548cd305abadfa893Aurimas Liutikas canvas.drawRect(bounds.left + roundedCornerRadius - 1f, 66378f43e4b46983d21915b37ff483b1725f144daeAurimas Liutikas bounds.bottom - roundedCornerRadius, 678578605a165ca215bab90ee548cd305abadfa893Aurimas Liutikas bounds.right - roundedCornerRadius + 1f, bounds.bottom, paint); 68db27cfc95b2f12aefacdd4d656910650a7fd4663Yigit Boyar } 698578605a165ca215bab90ee548cd305abadfa893Aurimas Liutikas // center 70378f43e4b46983d21915b37ff483b1725f144daeAurimas Liutikas canvas.drawRect(bounds.left, bounds.top + cornerRadius, 71378f43e4b46983d21915b37ff483b1725f144daeAurimas Liutikas bounds.right, bounds.bottom - cornerRadius , paint); 7283b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar } 7383b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar }; 7483b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar } 7583b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar 7683b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar @Override 7783b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar public void initialize(CardViewDelegate cardView, Context context, int backgroundColor, 7818ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar float radius, float elevation, float maxElevation) { 7918ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar RoundRectDrawableWithShadow background = createBackground(context, backgroundColor, radius, 8018ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar elevation, maxElevation); 81c42ba8c000d1e6ce85e152dfc17089a0a69e739fYigit Boyar background.setAddPaddingForCorners(cardView.getPreventCornerOverlap()); 8283b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar cardView.setBackgroundDrawable(background); 8318ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar updatePadding(cardView); 8418ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar } 8518ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar 8618ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar RoundRectDrawableWithShadow createBackground(Context context, int backgroundColor, 8718ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar float radius, float elevation, float maxElevation) { 8818ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar return new RoundRectDrawableWithShadow(context.getResources(), backgroundColor, radius, 8918ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar elevation, maxElevation); 9018ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar } 9118ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar 92bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar @Override 93bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar public void updatePadding(CardViewDelegate cardView) { 9418ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar Rect shadowPadding = new Rect(); 9518ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar getShadowBackground(cardView).getMaxShadowAndCornerPadding(shadowPadding); 9672aedb5058595ed481c93f78deb9dc1b00fecf2aYigit Boyar cardView.setMinWidthHeightInternal((int) Math.ceil(getMinWidth(cardView)), 9772aedb5058595ed481c93f78deb9dc1b00fecf2aYigit Boyar (int) Math.ceil(getMinHeight(cardView))); 98bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar cardView.setShadowPadding(shadowPadding.left, shadowPadding.top, 99bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar shadowPadding.right, shadowPadding.bottom); 100bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar } 101bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar 102bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar @Override 103bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar public void onCompatPaddingChanged(CardViewDelegate cardView) { 104bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar // NO OP 10583b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar } 10683b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar 10783b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar @Override 108c42ba8c000d1e6ce85e152dfc17089a0a69e739fYigit Boyar public void onPreventCornerOverlapChanged(CardViewDelegate cardView) { 109c42ba8c000d1e6ce85e152dfc17089a0a69e739fYigit Boyar getShadowBackground(cardView).setAddPaddingForCorners(cardView.getPreventCornerOverlap()); 110c42ba8c000d1e6ce85e152dfc17089a0a69e739fYigit Boyar updatePadding(cardView); 111c42ba8c000d1e6ce85e152dfc17089a0a69e739fYigit Boyar } 112c42ba8c000d1e6ce85e152dfc17089a0a69e739fYigit Boyar 113c42ba8c000d1e6ce85e152dfc17089a0a69e739fYigit Boyar @Override 1144eb77f0ed24a9d300f7d12959de8cf7efd837e2fYigit Boyar public void setBackgroundColor(CardViewDelegate cardView, int color) { 1154eb77f0ed24a9d300f7d12959de8cf7efd837e2fYigit Boyar getShadowBackground(cardView).setColor(color); 1164eb77f0ed24a9d300f7d12959de8cf7efd837e2fYigit Boyar } 1174eb77f0ed24a9d300f7d12959de8cf7efd837e2fYigit Boyar 1184eb77f0ed24a9d300f7d12959de8cf7efd837e2fYigit Boyar @Override 11983b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar public void setRadius(CardViewDelegate cardView, float radius) { 12018ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar getShadowBackground(cardView).setCornerRadius(radius); 12118ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar updatePadding(cardView); 12283b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar } 12383b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar 12483b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar @Override 12583b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar public float getRadius(CardViewDelegate cardView) { 12618ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar return getShadowBackground(cardView).getCornerRadius(); 12718ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar } 12818ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar 12918ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar @Override 13018ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar public void setElevation(CardViewDelegate cardView, float elevation) { 13118ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar getShadowBackground(cardView).setShadowSize(elevation); 13218ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar } 13318ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar 13418ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar @Override 13518ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar public float getElevation(CardViewDelegate cardView) { 13618ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar return getShadowBackground(cardView).getShadowSize(); 13718ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar } 13818ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar 13918ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar @Override 14018ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar public void setMaxElevation(CardViewDelegate cardView, float maxElevation) { 14118ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar getShadowBackground(cardView).setMaxShadowSize(maxElevation); 14218ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar updatePadding(cardView); 14318ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar } 14418ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar 14518ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar @Override 14618ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar public float getMaxElevation(CardViewDelegate cardView) { 14718ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar return getShadowBackground(cardView).getMaxShadowSize(); 14818ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar } 14918ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar 15018ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar @Override 15118ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar public float getMinWidth(CardViewDelegate cardView) { 15218ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar return getShadowBackground(cardView).getMinWidth(); 15318ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar } 15418ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar 15518ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar @Override 15618ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar public float getMinHeight(CardViewDelegate cardView) { 15718ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar return getShadowBackground(cardView).getMinHeight(); 15818ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar } 15918ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar 16018ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar private RoundRectDrawableWithShadow getShadowBackground(CardViewDelegate cardView) { 16118ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar return ((RoundRectDrawableWithShadow) cardView.getBackground()); 16283b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar } 163aa1de96894cfef188ac84b721812551d8f79a69dYigit Boyar} 164