diff options
Diffstat (limited to 'core/java/android/widget/GridLayout.java')
| -rw-r--r-- | core/java/android/widget/GridLayout.java | 202 |
1 files changed, 59 insertions, 143 deletions
diff --git a/core/java/android/widget/GridLayout.java b/core/java/android/widget/GridLayout.java index f354c6ecd9e8..d9770295ae72 100644 --- a/core/java/android/widget/GridLayout.java +++ b/core/java/android/widget/GridLayout.java @@ -250,6 +250,7 @@ public class GridLayout extends ViewGroup { * {@inheritDoc} */ public GridLayout(Context context) { + //noinspection NullableProblems this(context, null); } @@ -519,14 +520,6 @@ public class GridLayout extends ViewGroup { return result; } - private static int sum(int[] a) { - int result = 0; - for (int i = 0, N = a.length; i < N; i++) { - result += a[i]; - } - return result; - } - @SuppressWarnings("unchecked") private static <T> T[] append(T[] a, T[] b) { T[] result = (T[]) Array.newInstance(a.getClass().getComponentType(), a.length + b.length); @@ -553,6 +546,7 @@ public class GridLayout extends ViewGroup { } } + /** @noinspection UnusedParameters*/ private int getDefaultMargin(View c, boolean horizontal, boolean leading) { if (c.getClass() == Space.class) { return 0; @@ -576,7 +570,7 @@ public class GridLayout extends ViewGroup { return getDefaultMargin(c, isAtEdge, horizontal, leading); } - private int getMargin(View view, boolean horizontal, boolean leading) { + private int getMargin1(View view, boolean horizontal, boolean leading) { LayoutParams lp = getLayoutParams(view); int margin = horizontal ? (leading ? lp.leftMargin : lp.rightMargin) : @@ -584,6 +578,19 @@ public class GridLayout extends ViewGroup { return margin == UNDEFINED ? getDefaultMarginValue(view, lp, horizontal, leading) : margin; } + private int getMargin(View view, boolean horizontal, boolean leading) { + if (mAlignmentMode == ALIGN_MARGINS) { + return getMargin1(view, horizontal, leading); + } else { + Axis axis = horizontal ? mHorizontalAxis : mVerticalAxis; + int[] margins = leading ? axis.getLeadingMargins() : axis.getTrailingMargins(); + LayoutParams lp = getLayoutParams(view); + Spec spec = horizontal ? lp.columnSpec : lp.rowSpec; + int index = leading ? spec.span.min : spec.span.max; + return margins[index]; + } + } + private int getTotalMargin(View child, boolean horizontal) { return getMargin(child, horizontal, true) + getMargin(child, horizontal, false); } @@ -733,15 +740,6 @@ public class GridLayout extends ViewGroup { graphics.drawLine(dx + x1, dy + y1, dx + x2, dy + y2, paint); } - private void drawRectangle(Canvas graphics, int x1, int y1, int x2, int y2, Paint paint) { - x2 = x2 - 1; - y2 = y2 - 1; - graphics.drawLine(x1, y1, x1, y2, paint); - graphics.drawLine(x1, y1, x2, y1, paint); - graphics.drawLine(x1, y2, x2, y2, paint); - graphics.drawLine(x2, y1, x2, y2, paint); - } - @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); @@ -751,6 +749,7 @@ public class GridLayout extends ViewGroup { int width = getWidth() - getPaddingLeft() - getPaddingRight(); Paint paint = new Paint(); + paint.setStyle(Paint.Style.STROKE); paint.setColor(Color.argb(50, 255, 255, 255)); int[] xs = mHorizontalAxis.locations; @@ -773,22 +772,18 @@ public class GridLayout extends ViewGroup { paint.setColor(Color.BLUE); for (int i = 0; i < getChildCount(); i++) { View c = getChildAt(i); - drawRectangle(canvas, - c.getLeft(), - c.getTop(), - c.getRight(), - c.getBottom(), paint); + canvas.drawRect(c.getLeft(), c.getTop(), c.getRight(), c.getBottom(), paint); } // Draw margins paint.setColor(Color.MAGENTA); for (int i = 0; i < getChildCount(); i++) { View c = getChildAt(i); - drawRectangle(canvas, - c.getLeft() - getMargin(c, true, true), - c.getTop() - getMargin(c, false, true), - c.getRight() + getMargin(c, true, false), - c.getBottom() + getMargin(c, false, false), paint); + canvas.drawRect( + c.getLeft() - getMargin1(c, true, true), + c.getTop() - getMargin1(c, false, true), + c.getRight() + getMargin1(c, true, false), + c.getBottom() + getMargin1(c, false, false), paint); } } } @@ -875,11 +870,7 @@ public class GridLayout extends ViewGroup { if (isGone(c)) { return 0; } - int result = getMeasurement(c, horizontal); - if (mAlignmentMode == ALIGN_MARGINS) { - return result + getTotalMargin(c, horizontal); - } - return result; + return getMeasurement(c, horizontal) + getTotalMargin(c, horizontal); } @Override @@ -920,6 +911,9 @@ public class GridLayout extends ViewGroup { mHorizontalAxis.layout(targetWidth - paddingLeft - paddingRight); mVerticalAxis.layout(targetHeight - paddingTop - paddingBottom); + int[] hLocations = mHorizontalAxis.getLocations(); + int[] vLocations = mVerticalAxis.getLocations(); + for (int i = 0, N = getChildCount(); i < N; i++) { View c = getChildAt(i); if (isGone(c)) continue; @@ -930,11 +924,11 @@ public class GridLayout extends ViewGroup { Interval colSpan = columnSpec.span; Interval rowSpan = rowSpec.span; - int x1 = mHorizontalAxis.getLocationIncludingMargin(true, colSpan.min); - int y1 = mVerticalAxis.getLocationIncludingMargin(true, rowSpan.min); + int x1 = hLocations[colSpan.min]; + int y1 = vLocations[rowSpan.min]; - int x2 = mHorizontalAxis.getLocationIncludingMargin(false, colSpan.max); - int y2 = mVerticalAxis.getLocationIncludingMargin(false, rowSpan.max); + int x2 = hLocations[colSpan.max]; + int y2 = vLocations[rowSpan.max]; int cellWidth = x2 - x1; int cellHeight = y2 - y1; @@ -951,36 +945,29 @@ public class GridLayout extends ViewGroup { Bounds rowBounds = mVerticalAxis.getGroupBounds().getValue(i); // Gravity offsets: the location of the alignment group relative to its cell group. + //noinspection NullableProblems int c2ax = protect(hAlign.getAlignmentValue(null, cellWidth - colBounds.size(true))); + //noinspection NullableProblems int c2ay = protect(vAlign.getAlignmentValue(null, cellHeight - rowBounds.size(true))); - if (mAlignmentMode == ALIGN_MARGINS) { - int leftMargin = getMargin(c, true, true); - int topMargin = getMargin(c, false, true); - int rightMargin = getMargin(c, true, false); - int bottomMargin = getMargin(c, false, false); + int leftMargin = getMargin(c, true, true); + int topMargin = getMargin(c, false, true); + int rightMargin = getMargin(c, true, false); + int bottomMargin = getMargin(c, false, false); - // Same calculation as getMeasurementIncludingMargin() - int mWidth = leftMargin + pWidth + rightMargin; - int mHeight = topMargin + pHeight + bottomMargin; + // Same calculation as getMeasurementIncludingMargin() + int mWidth = leftMargin + pWidth + rightMargin; + int mHeight = topMargin + pHeight + bottomMargin; - // Alignment offsets: the location of the view relative to its alignment group. - int a2vx = colBounds.getOffset(c, hAlign, mWidth); - int a2vy = rowBounds.getOffset(c, vAlign, mHeight); + // Alignment offsets: the location of the view relative to its alignment group. + int a2vx = colBounds.getOffset(c, hAlign, mWidth); + int a2vy = rowBounds.getOffset(c, vAlign, mHeight); - dx = c2ax + a2vx + leftMargin; - dy = c2ay + a2vy + topMargin; + dx = c2ax + a2vx + leftMargin; + dy = c2ay + a2vy + topMargin; - cellWidth -= leftMargin + rightMargin; - cellHeight -= topMargin + bottomMargin; - } else { - // Alignment offsets: the location of the view relative to its alignment group. - int a2vx = colBounds.getOffset(c, hAlign, pWidth); - int a2vy = rowBounds.getOffset(c, vAlign, pHeight); - - dx = c2ax + a2vx; - dy = c2ay + a2vy; - } + cellWidth -= leftMargin + rightMargin; + cellHeight -= topMargin + bottomMargin; int type = PRF; int width = hAlign.getSizeInCell(c, pWidth, cellWidth, type); @@ -1366,10 +1353,9 @@ public class GridLayout extends ViewGroup { String axis = horizontal ? "horizontal" : "vertical"; int N = getCount() + 1; // The number of vertices is the number of columns/rows + 1. - boolean changed = false; // We take one extra pass over traditional Bellman-Ford (and omit their final step) for (int i = 0; i < N; i++) { - changed = false; + boolean changed = false; for (int j = 0, length = arcs.length; j < length; j++) { changed |= relax(locations, arcs[j]); } @@ -1420,7 +1406,7 @@ public class GridLayout extends ViewGroup { Spec spec = horizontal ? lp.columnSpec : lp.rowSpec; Interval span = spec.span; int index = leading ? span.min : span.max; - margins[index] = max(margins[index], getMargin(c, horizontal, leading)); + margins[index] = max(margins[index], getMargin1(c, horizontal, leading)); } } @@ -1446,34 +1432,8 @@ public class GridLayout extends ViewGroup { return trailingMargins; } - private void addMargins() { - int[] leadingMargins = getLeadingMargins(); - int[] trailingMargins = getTrailingMargins(); - - int delta = 0; - for (int i = 0, N = getCount(); i < N; i++) { - int margins = leadingMargins[i] + trailingMargins[i + 1]; - delta += margins; - locations[i + 1] += delta; - } - } - - private int getLocationIncludingMargin(boolean leading, int index) { - int location = locations[index]; - int margin; - if (mAlignmentMode != ALIGN_MARGINS) { - margin = (leading ? leadingMargins : trailingMargins)[index]; - } else { - margin = 0; - } - return leading ? (location + margin) : (location - margin); - } - private void computeLocations(int[] a) { solve1(getArcs(), a); - if (mAlignmentMode != ALIGN_MARGINS) { - addMargins(); - } } private int[] getLocations() { @@ -1495,12 +1455,6 @@ public class GridLayout extends ViewGroup { } private void setParentConstraints(int min, int max) { - if (mAlignmentMode != ALIGN_MARGINS) { - int margins = sum(getLeadingMargins()) + sum(getTrailingMargins()); - min -= margins; - max -= margins; - } - parentMin.value = min; parentMax.value = -max; locationsValid = false; @@ -1905,10 +1859,6 @@ public class GridLayout extends ViewGroup { this.values = compact(values, index); } - private K getKey(int i) { - return keys[index[i]]; - } - private V getValue(int i) { return values[index[i]]; } @@ -1958,8 +1908,6 @@ public class GridLayout extends ViewGroup { of the values for each View. */ private static class Bounds { - private static final Bounds GONE = new Bounds(); - public int before; public int after; public int flexibility; // we're flexible iff all included specs are flexible @@ -1995,8 +1943,8 @@ public class GridLayout extends ViewGroup { protected final void include(View c, Spec spec, GridLayout gridLayout, Axis axis) { this.flexibility &= spec.getFlexibility(); int size = gridLayout.getMeasurementIncludingMargin(c, axis.horizontal); - // todo test this works correctly when the returned value is UNDEFINED Alignment alignment = gridLayout.getAlignment(spec.alignment, axis.horizontal); + // todo test this works correctly when the returned value is UNDEFINED int before = alignment.getAlignmentValue(c, size); include(before, size - before); } @@ -2079,6 +2027,7 @@ public class GridLayout extends ViewGroup { if (max != interval.max) { return false; } + //noinspection RedundantIfStatement if (min != interval.min) { return false; } @@ -2113,57 +2062,33 @@ public class GridLayout extends ViewGroup { * For column groups, this specifies the horizontal alignment. */ public static class Spec { - private static final int UNDEFINED_FLEXIBILITY = UNDEFINED; - final Interval span; - final Alignment alignment; - /** - * The <em>flexibility</em> property tells GridLayout how to derive minimum and maximum size - * values for a component. Specifications are made with respect to a child's - * 'measured size'. A child's measured size is, in turn, controlled by its - * height and width layout parameters which either specify a size or, in - * the case of {@link LayoutParams#WRAP_CONTENT WRAP_CONTENT}, defer to - * the computed size of the component. - * <p> - * A cell group is flexible only if <em>all</em> of its components are flexible. - * <p> - * By default, flexibility is {@link #INFLEXIBLE} only when alignment/gravity is undefined. - */ - final int flexibility; - - private Spec(Interval span, Alignment alignment, int flexibility) { + private Spec(Interval span, Alignment alignment) { this.span = span; this.alignment = alignment; - this.flexibility = flexibility; } /* Copying constructor */ private Spec(Spec that) { - this(that.span, that.alignment, that.flexibility); + this(that.span, that.alignment); } private Spec(int start, int size, Alignment alignment) { - this(new Interval(start, start + size), alignment, UNDEFINED); + this(new Interval(start, start + size), alignment); } private Spec copyWriteSpan(Interval span) { - return new Spec(span, alignment, flexibility); + return new Spec(span, alignment); } private Spec copyWriteAlignment(Alignment alignment) { - return new Spec(span, alignment, flexibility); - } - - private static int defaultFlexibility(Alignment alignment) { - return (alignment == UNDEFINED_ALIGNMENT) ? INFLEXIBLE : CAN_STRETCH; + return new Spec(span, alignment); } int getFlexibility() { - return (flexibility != UNDEFINED_FLEXIBILITY) ? - flexibility : - defaultFlexibility(alignment); + return (alignment == UNDEFINED_ALIGNMENT) ? INFLEXIBLE : CAN_STRETCH; } /** @@ -2190,6 +2115,7 @@ public class GridLayout extends ViewGroup { if (!alignment.equals(spec.alignment)) { return false; } + //noinspection RedundantIfStatement if (!span.equals(spec.span)) { return false; } @@ -2447,15 +2373,5 @@ public class GridLayout extends ViewGroup { private static final int INFLEXIBLE = 0; - /** - * Indicates that a view's size should be greater than or equal to the size specified by - * its layout parameters. - * - * @deprecated Please use {@link #spec(int, int, Alignment)} instead, - * all spec's that define alignment (gravity) are assumed to able to stretch. - * - * @hide - */ - @Deprecated - public static final int CAN_STRETCH = 2; + private static final int CAN_STRETCH = 2; } |
