From 283715d348a3fb9c487469d6f2749727b0705710 Mon Sep 17 00:00:00 2001 From: conradchen Date: Wed, 10 Nov 2021 10:44:36 -0500 Subject: [PATCH] [Card] Fix checked icon gravity issues Re-measures the card when checked icon gravity changes in order to move the icon position. Also corrects the padding adjustment logic for pre-lolipop or when compat paddings are being used. PiperOrigin-RevId: 408876717 --- .../material/card/MaterialCardView.java | 2 +- .../material/card/MaterialCardViewHelper.java | 29 ++++++++++--------- 2 files changed, 17 insertions(+), 14 deletions(-) diff --git a/lib/java/com/google/android/material/card/MaterialCardView.java b/lib/java/com/google/android/material/card/MaterialCardView.java index 7340e166ac4..ff759162993 100644 --- a/lib/java/com/google/android/material/card/MaterialCardView.java +++ b/lib/java/com/google/android/material/card/MaterialCardView.java @@ -204,7 +204,7 @@ public void onInitializeAccessibilityEvent(@NonNull AccessibilityEvent accessibi @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); - cardViewHelper.onMeasure(getMeasuredWidth(), getMeasuredHeight()); + cardViewHelper.recalculateCheckedIconPosition(getMeasuredWidth(), getMeasuredHeight()); } /** diff --git a/lib/java/com/google/android/material/card/MaterialCardViewHelper.java b/lib/java/com/google/android/material/card/MaterialCardViewHelper.java index 066da41c4e1..33a2f25aa06 100644 --- a/lib/java/com/google/android/material/card/MaterialCardViewHelper.java +++ b/lib/java/com/google/android/material/card/MaterialCardViewHelper.java @@ -418,30 +418,32 @@ void setCheckedIconMargin(@Dimension int checkedIconMargin) { this.checkedIconMargin = checkedIconMargin; } - void onMeasure(int measuredWidth, int measuredHeight) { + void recalculateCheckedIconPosition(int measuredWidth, int measuredHeight) { if (clickableForegroundDrawable != null) { + boolean isPreLollipop = VERSION.SDK_INT < VERSION_CODES.LOLLIPOP; + int verticalPaddingAdjustment = 0; + int horizontalPaddingAdjustment = 0; + if (isPreLollipop || materialCardView.getUseCompatPadding()) { + verticalPaddingAdjustment = (int) Math.ceil(2f * calculateVerticalBackgroundPadding()); + horizontalPaddingAdjustment = (int) Math.ceil(2f * calculateHorizontalBackgroundPadding()); + } + int left = isCheckedIconEnd() - ? measuredWidth - checkedIconMargin - checkedIconSize + ? measuredWidth - checkedIconMargin - checkedIconSize - horizontalPaddingAdjustment : checkedIconMargin; int bottom = isCheckedIconBottom() ? checkedIconMargin - : measuredHeight - checkedIconMargin - checkedIconSize; - - boolean isPreLollipop = VERSION.SDK_INT < VERSION_CODES.LOLLIPOP; - if (isPreLollipop || materialCardView.getUseCompatPadding()) { - bottom -= (int) Math.ceil(2f * calculateVerticalBackgroundPadding()); - left -= (int) Math.ceil(2f * calculateHorizontalBackgroundPadding()); - } + : measuredHeight - checkedIconMargin - checkedIconSize - verticalPaddingAdjustment; int right = isCheckedIconEnd() ? checkedIconMargin - : measuredWidth - checkedIconMargin - checkedIconSize; + : measuredWidth - checkedIconMargin - checkedIconSize - horizontalPaddingAdjustment; int top = isCheckedIconBottom() - ? measuredHeight - checkedIconMargin - checkedIconSize + ? measuredHeight - checkedIconMargin - checkedIconSize - verticalPaddingAdjustment : checkedIconMargin; if (ViewCompat.getLayoutDirection(materialCardView) == ViewCompat.LAYOUT_DIRECTION_RTL) { @@ -451,8 +453,7 @@ void onMeasure(int measuredWidth, int measuredHeight) { left = tmp; } - clickableForegroundDrawable.setLayerInset( - CHECKED_ICON_LAYER_INDEX, left, top /* top */, right, bottom); + clickableForegroundDrawable.setLayerInset(CHECKED_ICON_LAYER_INDEX, left, top, right, bottom); } } @@ -686,6 +687,8 @@ int getCheckedIconGravity() { void setCheckedIconGravity(@CheckedIconGravity int checkedIconGravity) { this.checkedIconGravity = checkedIconGravity; + recalculateCheckedIconPosition( + materialCardView.getMeasuredWidth(), materialCardView.getMeasuredHeight()); } private boolean isCheckedIconEnd() {