diff options
author | Nicolas Roard <nicolasroard@google.com> | 2018-06-04 14:21:47 -0700 |
---|---|---|
committer | Nicolas Roard <nicolasroard@google.com> | 2018-06-04 14:23:36 -0700 |
commit | f2a27e62f206f6c2cf80fa2f7aa2b0c62766dfb1 (patch) | |
tree | 335ecb11a9621af60acf0de9a02a23a5af613901 | |
parent | 406e6406c502b4467775a417155e7a4b92e787f7 (diff) | |
download | sherpa-f2a27e62f206f6c2cf80fa2f7aa2b0c62766dfb1.tar.gz |
Handles weights == 0 when other weights > 0
Fixes: 80149154
Test: added check 202
added AdvancedChainTest.testChainWeights()
added AdvancedChainTest.testChain3Weights()
Change-Id: I42125edcf3d985bb75afd6fa99bda0ef01f45627
3 files changed, 93 insertions, 0 deletions
diff --git a/solver/src/main/java/android/support/constraint/solver/ArrayRow.java b/solver/src/main/java/android/support/constraint/solver/ArrayRow.java index 19a3b93..3647cad 100644 --- a/solver/src/main/java/android/support/constraint/solver/ArrayRow.java +++ b/solver/src/main/java/android/support/constraint/solver/ArrayRow.java @@ -24,6 +24,7 @@ public class ArrayRow implements LinearSystem.Row { SolverVariable variable = null; float constantValue = 0; boolean used = false; + private static final float epsilon = 0.001f; public final ArrayLinkedVariables variables; @@ -220,9 +221,17 @@ public class ArrayRow implements LinearSystem.Row { variables.put(variableEndB, 1); variables.put(variableStartB, -1); } else { + if (currentWeight == 0) { + currentWeight = epsilon; + } + if (nextWeight == 0) { + nextWeight = epsilon; + } + float cw = currentWeight / totalWeights; float nw = nextWeight / totalWeights; float w = cw / nw; + // endA - startA == w * (endB - startB) // 0 = startA - endA + w * (endB - startB) constantValue = 0; 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 b2e8c1e..e51fbaa 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 @@ -240,6 +240,7 @@ class Chain { // Now, let's apply the centering / spreading for matched constraints widgets if (numMatchConstraints > 0) { + // TODO: we should not try to apply the constraints for weights = 0 widget = firstMatchConstraintsWidget; while (widget != null) { next = widget.mListNextMatchConstraintsWidget[orientation]; diff --git a/solver/src/test/java/android/support/constraint/solver/AdvancedChainTest.java b/solver/src/test/java/android/support/constraint/solver/AdvancedChainTest.java index 20436bd..79df53c 100644 --- a/solver/src/test/java/android/support/constraint/solver/AdvancedChainTest.java +++ b/solver/src/test/java/android/support/constraint/solver/AdvancedChainTest.java @@ -30,6 +30,89 @@ import static org.testng.Assert.assertEquals; public class AdvancedChainTest { @Test + public void testChainWeights() { + ConstraintWidgetContainer root = new ConstraintWidgetContainer(0, 0, 800, 800); + ConstraintWidget A = new ConstraintWidget(100, 20); + ConstraintWidget B = new ConstraintWidget(100, 20); + + root.setDebugSolverName(root.getSystem(), "root"); + A.setDebugSolverName(root.getSystem(), "A"); + B.setDebugSolverName(root.getSystem(), "B"); + + A.connect(Type.LEFT, root, Type.LEFT, 0); + A.connect(Type.RIGHT, B, Type.LEFT, 0); + + B.connect(Type.LEFT, A, Type.RIGHT, 0); + B.connect(Type.RIGHT, root, Type.RIGHT, 0); + + root.add(A); + root.add(B); + + A.setHorizontalDimensionBehaviour(DimensionBehaviour.MATCH_CONSTRAINT); + B.setHorizontalDimensionBehaviour(DimensionBehaviour.MATCH_CONSTRAINT); + A.setHorizontalWeight(1); + B.setHorizontalWeight(0); + + root.setOptimizationLevel(Optimizer.OPTIMIZATION_NONE); + root.layout(); + + System.out.println("A: " + A); + System.out.println("B: " + B); + assertEquals(A.getWidth(), 800, 1); + assertEquals(B.getWidth(), 0, 1); + assertEquals(A.getLeft(), 0, 1); + assertEquals(B.getLeft(), 800, 1); + } + + @Test + public void testChain3Weights() { + ConstraintWidgetContainer root = new ConstraintWidgetContainer(0, 0, 800, 800); + ConstraintWidget A = new ConstraintWidget(100, 20); + ConstraintWidget B = new ConstraintWidget(100, 20); + ConstraintWidget C = new ConstraintWidget(100, 20); + + root.setDebugSolverName(root.getSystem(), "root"); + A.setDebugSolverName(root.getSystem(), "A"); + B.setDebugSolverName(root.getSystem(), "B"); + C.setDebugSolverName(root.getSystem(), "C"); + + A.connect(Type.LEFT, root, Type.LEFT, 0); + A.connect(Type.RIGHT, B, Type.LEFT, 0); + + B.connect(Type.LEFT, A, Type.RIGHT, 0); + B.connect(Type.RIGHT, C, Type.LEFT, 0); + + C.connect(Type.LEFT, B, Type.RIGHT, 0); + C.connect(Type.RIGHT, root, Type.RIGHT, 0); + + root.add(A); + root.add(B); + root.add(C); + + A.setHorizontalDimensionBehaviour(DimensionBehaviour.MATCH_CONSTRAINT); + B.setHorizontalDimensionBehaviour(DimensionBehaviour.MATCH_CONSTRAINT); + C.setHorizontalDimensionBehaviour(DimensionBehaviour.MATCH_CONSTRAINT); + + A.setHorizontalWeight(1); + B.setHorizontalWeight(0); + C.setHorizontalWeight(1); + + root.setOptimizationLevel(Optimizer.OPTIMIZATION_NONE); + root.layout(); + + System.out.println("A: " + A); + System.out.println("B: " + B); + System.out.println("C: " + C); + + assertEquals(A.getWidth(), 400); + assertEquals(B.getWidth(), 0); + assertEquals(C.getWidth(), 400); + assertEquals(A.getLeft(), 0); + assertEquals(B.getLeft(), 400); + assertEquals(C.getLeft(), 400); + } + + @Test public void testChainLastGone() { ConstraintWidgetContainer root = new ConstraintWidgetContainer(0, 0, 800, 800); ConstraintWidget A = new ConstraintWidget(100, 20); |