From 02473da2b0a99d886d0dbcf5fba5619047855111 Mon Sep 17 00:00:00 2001 From: Michael Jurka Date: Thu, 8 Sep 2011 18:26:23 -0700 Subject: [PATCH] Fix FrameLayout padding when foreground drawable is set The padding of the foreground drawable was being added to the padding that already existed, even if the foreground drawable was drawing within the padded region. This was preventing having a foreground drawable and a background drawable set on a FrameLayout that overlapped perfectly. Change-Id: I355ff9323fb49afc5816f47ec9e257e0ff849861 --- core/java/android/widget/FrameLayout.java | 45 ++++++++++++++++++----- 1 file changed, 35 insertions(+), 10 deletions(-) diff --git a/core/java/android/widget/FrameLayout.java b/core/java/android/widget/FrameLayout.java index 398a7ebacaca2..74a57b0033b8e 100644 --- a/core/java/android/widget/FrameLayout.java +++ b/core/java/android/widget/FrameLayout.java @@ -250,6 +250,27 @@ public class FrameLayout extends ViewGroup { return mForeground; } + private int getPaddingLeftWithForeground() { + return mForegroundInPadding ? Math.max(mPaddingLeft, mForegroundPaddingLeft) : + mPaddingLeft + mForegroundPaddingLeft; + } + + private int getPaddingRightWithForeground() { + return mForegroundInPadding ? Math.max(mPaddingRight, mForegroundPaddingRight) : + mPaddingRight + mForegroundPaddingRight; + } + + private int getPaddingTopWithForeground() { + return mForegroundInPadding ? Math.max(mPaddingTop, mForegroundPaddingTop) : + mPaddingTop + mForegroundPaddingTop; + } + + private int getPaddingBottomWithForeground() { + return mForegroundInPadding ? Math.max(mPaddingBottom, mForegroundPaddingBottom) : + mPaddingBottom + mForegroundPaddingBottom; + } + + /** * {@inheritDoc} */ @@ -286,8 +307,8 @@ public class FrameLayout extends ViewGroup { } // Account for padding too - maxWidth += mPaddingLeft + mPaddingRight + mForegroundPaddingLeft + mForegroundPaddingRight; - maxHeight += mPaddingTop + mPaddingBottom + mForegroundPaddingTop + mForegroundPaddingBottom; + maxWidth += getPaddingLeftWithForeground() + getPaddingRightWithForeground(); + maxHeight += getPaddingTopWithForeground() + getPaddingBottomWithForeground(); // Check against our minimum height and width maxHeight = Math.max(maxHeight, getSuggestedMinimumHeight()); @@ -315,21 +336,25 @@ public class FrameLayout extends ViewGroup { if (lp.width == LayoutParams.MATCH_PARENT) { childWidthMeasureSpec = MeasureSpec.makeMeasureSpec(getMeasuredWidth() - - mPaddingLeft - mPaddingRight - lp.leftMargin - lp.rightMargin, + getPaddingLeftWithForeground() - getPaddingRightWithForeground() - + lp.leftMargin - lp.rightMargin, MeasureSpec.EXACTLY); } else { childWidthMeasureSpec = getChildMeasureSpec(widthMeasureSpec, - mPaddingLeft + mPaddingRight + lp.leftMargin + lp.rightMargin, + getPaddingLeftWithForeground() + getPaddingRightWithForeground() + + lp.leftMargin + lp.rightMargin, lp.width); } if (lp.height == LayoutParams.MATCH_PARENT) { childHeightMeasureSpec = MeasureSpec.makeMeasureSpec(getMeasuredHeight() - - mPaddingTop - mPaddingBottom - lp.topMargin - lp.bottomMargin, + getPaddingTopWithForeground() - getPaddingBottomWithForeground() - + lp.topMargin - lp.bottomMargin, MeasureSpec.EXACTLY); } else { childHeightMeasureSpec = getChildMeasureSpec(heightMeasureSpec, - mPaddingTop + mPaddingBottom + lp.topMargin + lp.bottomMargin, + getPaddingTopWithForeground() + getPaddingBottomWithForeground() + + lp.topMargin + lp.bottomMargin, lp.height); } @@ -345,11 +370,11 @@ public class FrameLayout extends ViewGroup { protected void onLayout(boolean changed, int left, int top, int right, int bottom) { final int count = getChildCount(); - final int parentLeft = mPaddingLeft + mForegroundPaddingLeft; - final int parentRight = right - left - mPaddingRight - mForegroundPaddingRight; + final int parentLeft = getPaddingLeftWithForeground(); + final int parentRight = right - left - getPaddingRightWithForeground(); - final int parentTop = mPaddingTop + mForegroundPaddingTop; - final int parentBottom = bottom - top - mPaddingBottom - mForegroundPaddingBottom; + final int parentTop = getPaddingTopWithForeground(); + final int parentBottom = bottom - top - getPaddingBottomWithForeground(); mForegroundBoundsChanged = true;