Merge change 5417 into donut

* changes:
  Fixes #1943309. RelativeLayout was confused by gravities.
This commit is contained in:
Android (Google) Code Review
2009-06-25 14:49:23 -07:00

View File

@@ -340,10 +340,16 @@ public class RelativeLayout extends ViewGroup {
int right = Integer.MIN_VALUE; int right = Integer.MIN_VALUE;
int bottom = Integer.MIN_VALUE; int bottom = Integer.MIN_VALUE;
boolean offsetHorizontalAxis = false;
boolean offsetVerticalAxis = false;
if ((horizontalGravity || verticalGravity) && mIgnoreGravity != View.NO_ID) { if ((horizontalGravity || verticalGravity) && mIgnoreGravity != View.NO_ID) {
ignore = findViewById(mIgnoreGravity); ignore = findViewById(mIgnoreGravity);
} }
final boolean isWrapContentWidth = widthMode != MeasureSpec.EXACTLY;
final boolean isWrapContentHeight = heightMode != MeasureSpec.EXACTLY;
View[] views = mSortedHorizontalChildren; View[] views = mSortedHorizontalChildren;
int count = views.length; int count = views.length;
for (int i = 0; i < count; i++) { for (int i = 0; i < count; i++) {
@@ -353,12 +359,15 @@ public class RelativeLayout extends ViewGroup {
applyHorizontalSizeRules(params, myWidth); applyHorizontalSizeRules(params, myWidth);
measureChildHorizontal(child, params, myWidth); measureChildHorizontal(child, params, myWidth);
positionChildHorizontal(child, params, myWidth); if (positionChildHorizontal(child, params, myWidth, isWrapContentWidth)) {
offsetHorizontalAxis = true;
}
} }
} }
views = mSortedVerticalChildren; views = mSortedVerticalChildren;
count = views.length; count = views.length;
for (int i = 0; i < count; i++) { for (int i = 0; i < count; i++) {
View child = views[i]; View child = views[i];
if (child.getVisibility() != GONE) { if (child.getVisibility() != GONE) {
@@ -366,12 +375,15 @@ public class RelativeLayout extends ViewGroup {
applyVerticalSizeRules(params, myHeight); applyVerticalSizeRules(params, myHeight);
measureChild(child, params, myWidth, myHeight); measureChild(child, params, myWidth, myHeight);
positionChildVertical(child, params, myHeight); if (positionChildVertical(child, params, myHeight, isWrapContentHeight)) {
offsetVerticalAxis = true;
}
if (widthMode != MeasureSpec.EXACTLY) { if (isWrapContentWidth) {
width = Math.max(width, params.mRight); width = Math.max(width, params.mRight);
} }
if (heightMode != MeasureSpec.EXACTLY) {
if (isWrapContentHeight) {
height = Math.max(height, params.mBottom); height = Math.max(height, params.mBottom);
} }
@@ -407,7 +419,7 @@ public class RelativeLayout extends ViewGroup {
} }
} }
if (widthMode != MeasureSpec.EXACTLY) { if (isWrapContentWidth) {
// Width already has left padding in it since it was calculated by looking at // Width already has left padding in it since it was calculated by looking at
// the right of each child view // the right of each child view
width += mPaddingRight; width += mPaddingRight;
@@ -418,8 +430,22 @@ public class RelativeLayout extends ViewGroup {
width = Math.max(width, getSuggestedMinimumWidth()); width = Math.max(width, getSuggestedMinimumWidth());
width = resolveSize(width, widthMeasureSpec); width = resolveSize(width, widthMeasureSpec);
if (offsetHorizontalAxis) {
for (int i = 0; i < count; i++) {
View child = getChildAt(i);
if (child.getVisibility() != GONE) {
LayoutParams params = (LayoutParams) child.getLayoutParams();
final int[] rules = params.getRules();
if (rules[CENTER_IN_PARENT] != 0 || rules[CENTER_HORIZONTAL] != 0) {
centerHorizontal(child, params, width);
} }
if (heightMode != MeasureSpec.EXACTLY) { }
}
}
}
if (isWrapContentHeight) {
// Height already has top padding in it since it was calculated by looking at // Height already has top padding in it since it was calculated by looking at
// the bottom of each child view // the bottom of each child view
height += mPaddingBottom; height += mPaddingBottom;
@@ -430,6 +456,19 @@ public class RelativeLayout extends ViewGroup {
height = Math.max(height, getSuggestedMinimumHeight()); height = Math.max(height, getSuggestedMinimumHeight());
height = resolveSize(height, heightMeasureSpec); height = resolveSize(height, heightMeasureSpec);
if (offsetVerticalAxis) {
for (int i = 0; i < count; i++) {
View child = getChildAt(i);
if (child.getVisibility() != GONE) {
LayoutParams params = (LayoutParams) child.getLayoutParams();
final int[] rules = params.getRules();
if (rules[CENTER_IN_PARENT] != 0 || rules[CENTER_VERTICAL] != 0) {
centerVertical(child, params, height);
}
}
}
}
} }
if (horizontalGravity || verticalGravity) { if (horizontalGravity || verticalGravity) {
@@ -600,7 +639,9 @@ public class RelativeLayout extends ViewGroup {
return MeasureSpec.makeMeasureSpec(childSpecSize, childSpecMode); return MeasureSpec.makeMeasureSpec(childSpecSize, childSpecMode);
} }
private void positionChildHorizontal(View child, LayoutParams params, int myWidth) { private boolean positionChildHorizontal(View child, LayoutParams params, int myWidth,
boolean wrapContent) {
int[] rules = params.getRules(); int[] rules = params.getRules();
if (params.mLeft < 0 && params.mRight >= 0) { if (params.mLeft < 0 && params.mRight >= 0) {
@@ -611,16 +652,25 @@ public class RelativeLayout extends ViewGroup {
params.mRight = params.mLeft + child.getMeasuredWidth(); params.mRight = params.mLeft + child.getMeasuredWidth();
} else if (params.mLeft < 0 && params.mRight < 0) { } else if (params.mLeft < 0 && params.mRight < 0) {
// Both left and right vary // Both left and right vary
if (0 != rules[CENTER_IN_PARENT] || 0 != rules[CENTER_HORIZONTAL]) { if (rules[CENTER_IN_PARENT] != 0 || rules[CENTER_HORIZONTAL] != 0) {
if (!wrapContent) {
centerHorizontal(child, params, myWidth); centerHorizontal(child, params, myWidth);
} else { } else {
params.mLeft = mPaddingLeft + params.leftMargin; params.mLeft = mPaddingLeft + params.leftMargin;
params.mRight = params.mLeft + child.getMeasuredWidth(); params.mRight = params.mLeft + child.getMeasuredWidth();
} }
return true;
} else {
params.mLeft = mPaddingLeft + params.leftMargin;
params.mRight = params.mLeft + child.getMeasuredWidth();
} }
} }
return false;
}
private boolean positionChildVertical(View child, LayoutParams params, int myHeight,
boolean wrapContent) {
private void positionChildVertical(View child, LayoutParams params, int myHeight) {
int[] rules = params.getRules(); int[] rules = params.getRules();
if (params.mTop < 0 && params.mBottom >= 0) { if (params.mTop < 0 && params.mBottom >= 0) {
@@ -631,14 +681,21 @@ public class RelativeLayout extends ViewGroup {
params.mBottom = params.mTop + child.getMeasuredHeight(); params.mBottom = params.mTop + child.getMeasuredHeight();
} else if (params.mTop < 0 && params.mBottom < 0) { } else if (params.mTop < 0 && params.mBottom < 0) {
// Both top and bottom vary // Both top and bottom vary
if (0 != rules[CENTER_IN_PARENT] || 0 != rules[CENTER_VERTICAL]) { if (rules[CENTER_IN_PARENT] != 0 || rules[CENTER_VERTICAL] != 0) {
if (!wrapContent) {
centerVertical(child, params, myHeight); centerVertical(child, params, myHeight);
} else { } else {
params.mTop = mPaddingTop + params.topMargin; params.mTop = mPaddingTop + params.topMargin;
params.mBottom = params.mTop + child.getMeasuredHeight(); params.mBottom = params.mTop + child.getMeasuredHeight();
} }
return true;
} else {
params.mTop = mPaddingTop + params.topMargin;
params.mBottom = params.mTop + child.getMeasuredHeight();
} }
} }
return false;
}
private void applyHorizontalSizeRules(LayoutParams childParams, int myWidth) { private void applyHorizontalSizeRules(LayoutParams childParams, int myWidth) {
int[] rules = childParams.getRules(); int[] rules = childParams.getRules();