diff options
author | Nicolas Roard <nicolasroard@google.com> | 2018-03-19 20:28:39 -0700 |
---|---|---|
committer | Nicolas Roard <nicolasroard@google.com> | 2018-03-20 04:31:24 +0000 |
commit | 947c83efa6acb38519b71070134d79b7e5a0a447 (patch) | |
tree | c26add342e603a66870ac74c01cd9a6a8d41797c | |
parent | ec94fde36dee1c7586ef91812c61c92415797619 (diff) | |
download | sherpa-947c83efa6acb38519b71070134d79b7e5a0a447.tar.gz |
Change Chains margins behavior. Margins are now not part of the "spread" space.
They are still additive.
Test: added in ChainTest, plus added check163 in sherpa and updated checks in sherpa.
Fixes: 73521836, 74537416, 74130324
-rw-r--r-- | solver/src/main/java/android/support/constraint/solver/widgets/Chain.java | 28 | ||||
-rw-r--r-- | solver/src/test/java/android/support/constraint/solver/ChainTest.java | 34 |
2 files changed, 53 insertions, 9 deletions
diff --git a/solver/src/main/java/android/support/constraint/solver/widgets/Chain.java b/solver/src/main/java/android/support/constraint/solver/widgets/Chain.java index 777ae64..3ec6fca 100644 --- a/solver/src/main/java/android/support/constraint/solver/widgets/Chain.java +++ b/solver/src/main/java/android/support/constraint/solver/widgets/Chain.java @@ -317,13 +317,12 @@ class Chain { SolverVariable beginNext = null; SolverVariable beginNextTarget = null; int beginMargin = beginAnchor.getMargin(); - int nextMargin = 0; + int nextMargin = widget.mListAnchors[offset + 1].getMargin(); if (next != null) { beginNextAnchor = next.mListAnchors[offset]; beginNext = beginNextAnchor.mSolverVariable; beginNextTarget = beginNextAnchor.mTarget != null ? beginNextAnchor.mTarget.mSolverVariable : null; - nextMargin = beginNextAnchor.getMargin(); } else { beginNextAnchor = last.mListAnchors[offset + 1].mTarget; if (beginNextAnchor != null) { @@ -332,12 +331,18 @@ class Chain { beginNextTarget = widget.mListAnchors[offset + 1].mSolverVariable; } + if (beginNextAnchor != null) { + nextMargin += beginNextAnchor.getMargin(); + } + if (previousVisibleWidget != null) { + beginMargin += previousVisibleWidget.mListAnchors[offset + 1].getMargin(); + } if (begin != null && beginTarget != null && beginNext != null && beginNextTarget != null) { - int margin1 = 0; + int margin1 = beginMargin; if (widget == firstVisibleWidget) { margin1 = firstVisibleWidget.mListAnchors[offset].getMargin(); } - int margin2 = 0; + int margin2 = nextMargin; if (widget == lastVisibleWidget) { margin2 = lastVisibleWidget.mListAnchors[offset + 1].getMargin(); } @@ -355,7 +360,7 @@ class Chain { ConstraintWidget previousVisibleWidget = firstVisibleWidget; while (widget != null) { next = widget.mListNextVisibleWidget[orientation]; - if (widget != firstVisibleWidget && next != null) { + if (widget != firstVisibleWidget && widget != lastVisibleWidget && next != null) { if (next == lastVisibleWidget) { next = null; } @@ -367,13 +372,12 @@ class Chain { SolverVariable beginNext = null; SolverVariable beginNextTarget = null; int beginMargin = beginAnchor.getMargin(); - int nextMargin = 0; + int nextMargin = widget.mListAnchors[offset + 1].getMargin(); if (next != null) { beginNextAnchor = next.mListAnchors[offset]; beginNext = beginNextAnchor.mSolverVariable; beginNextTarget = beginNextAnchor.mTarget != null ? beginNextAnchor.mTarget.mSolverVariable : null; - nextMargin = beginNextAnchor.getMargin(); } else { beginNextAnchor = widget.mListAnchors[offset + 1].mTarget; if (beginNextAnchor != null) { @@ -382,9 +386,15 @@ class Chain { beginNextTarget = widget.mListAnchors[offset + 1].mSolverVariable; } + if (beginNextAnchor != null) { + nextMargin += beginNextAnchor.getMargin(); + } + if (previousVisibleWidget != null) { + beginMargin += previousVisibleWidget.mListAnchors[offset + 1].getMargin(); + } if (begin != null && beginTarget != null && beginNext != null && beginNextTarget != null) { - system.addCentering(begin, beginTarget, 0, 0.5f, - beginNext, beginNextTarget, 0, + system.addCentering(begin, beginTarget, beginMargin, 0.5f, + beginNext, beginNextTarget, nextMargin, SolverVariable.STRENGTH_HIGHEST); } } diff --git a/solver/src/test/java/android/support/constraint/solver/ChainTest.java b/solver/src/test/java/android/support/constraint/solver/ChainTest.java index 53c7c90..8fc02d4 100644 --- a/solver/src/test/java/android/support/constraint/solver/ChainTest.java +++ b/solver/src/test/java/android/support/constraint/solver/ChainTest.java @@ -28,6 +28,40 @@ import static org.testng.Assert.assertEquals; public class ChainTest { @Test + public void testSpreadInsideChain2() { + ConstraintWidgetContainer root = new ConstraintWidgetContainer(0, 0, 600, 600); + ConstraintWidget A = new ConstraintWidget(100, 20); + ConstraintWidget B = new ConstraintWidget(100, 20); + ConstraintWidget C = new ConstraintWidget(100, 20); + root.setDebugName("root"); + A.setDebugName("A"); + B.setDebugName("B"); + C.setDebugName("C"); + root.add(A); + root.add(B); + root.add(C); + + A.connect(ConstraintAnchor.Type.LEFT, root, ConstraintAnchor.Type.LEFT); + A.connect(ConstraintAnchor.Type.RIGHT, B, ConstraintAnchor.Type.LEFT); + B.connect(ConstraintAnchor.Type.LEFT, A, ConstraintAnchor.Type.RIGHT); + B.connect(ConstraintAnchor.Type.RIGHT, C, ConstraintAnchor.Type.LEFT); + C.connect(ConstraintAnchor.Type.LEFT, B, ConstraintAnchor.Type.RIGHT, 25); + C.connect(ConstraintAnchor.Type.RIGHT, root, ConstraintAnchor.Type.RIGHT); + + A.setHorizontalChainStyle(ConstraintWidget.CHAIN_SPREAD_INSIDE); + B.setHorizontalDimensionBehaviour(ConstraintWidget.DimensionBehaviour.MATCH_CONSTRAINT); + + root.layout(); + System.out.println("A: " + A + " B: " + B + " C: " + C); + assertEquals(A.getLeft(), 0); + assertEquals(A.getRight(), 100); + assertEquals(B.getLeft(), 100); + assertEquals(B.getRight(), 475); + assertEquals(C.getLeft(), 500); + assertEquals(C.getRight(), 600); + } + + @Test public void testPackChain() { ConstraintWidgetContainer root = new ConstraintWidgetContainer(0, 0, 600, 600); ConstraintWidget A = new ConstraintWidget(100, 20); |