Skip to content
This repository was archived by the owner on Dec 27, 2024. It is now read-only.

Commit c262a32

Browse files
authored
Fixes apr20 (#212)
* fix includes and derivedConstraints with ConstraintOverride * simplify the resolution of constraint sets
1 parent 65039bb commit c262a32

File tree

7 files changed

+196
-16
lines changed

7 files changed

+196
-16
lines changed

constraintlayout/constraintlayout/src/main/java/androidx/constraintlayout/motion/widget/MotionScene.java

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,7 @@ public class MotionScene {
9393
private static final String ONSWIPE_TAG = "OnSwipe";
9494
private static final String ONCLICK_TAG = "OnClick";
9595
private static final String STATESET_TAG = "StateSet";
96+
private static final String INCLUDE_TAG_UC = "Include";
9697
private static final String INCLUDE_TAG = "include";
9798
private static final String KEYFRAMESET_TAG = "KeyFrameSet";
9899
private static final String CONSTRAINTSET_TAG = "ConstraintSet";
@@ -1089,6 +1090,7 @@ private void load(Context context, int resourceId) {
10891090
parseConstraintSet(context, parser);
10901091
break;
10911092
case INCLUDE_TAG:
1093+
case INCLUDE_TAG_UC:
10921094
parseInclude(context, parser);
10931095
break;
10941096
case KEYFRAMESET_TAG:
@@ -1717,7 +1719,6 @@ boolean getMoveWhenScrollAtTop() {
17171719
* read the constraints from the inflation of the ConstraintLayout
17181720
* If the constraintset does not contain information about a view this information is used
17191721
* as a "fallback" position.
1720-
*
17211722
* @param motionLayout
17221723
*/
17231724
void readFallback(MotionLayout motionLayout) {
@@ -1728,11 +1729,7 @@ void readFallback(MotionLayout motionLayout) {
17281729
Log.e(TAG, "Cannot be derived from yourself");
17291730
return;
17301731
}
1731-
readConstraintChain(key);
1732-
}
1733-
for (int i = 0; i < mConstraintSetMap.size(); i++) {
1734-
ConstraintSet cs = mConstraintSetMap.valueAt(i);
1735-
cs.readFallback(motionLayout);
1732+
readConstraintChain(key,motionLayout);
17361733
}
17371734
}
17381735

@@ -1758,22 +1755,27 @@ private boolean hasCycleDependency(int key) {
17581755
}
17591756

17601757
/**
1758+
* Recursive decent of the deriveConstraintsFrom tree reading the motionLayout if
1759+
* needed.
1760+
*
17611761
* @param key
17621762
*/
1763-
private void readConstraintChain(int key) {
1763+
private void readConstraintChain(int key, MotionLayout motionLayout) {
1764+
ConstraintSet cs = mConstraintSetMap.get(key);
17641765
int derivedFromId = mDeriveMap.get(key);
17651766
if (derivedFromId > 0) {
1766-
readConstraintChain(mDeriveMap.get(key));
1767-
ConstraintSet cs = mConstraintSetMap.get(key);
1767+
readConstraintChain(derivedFromId, motionLayout);
17681768
ConstraintSet derivedFrom = mConstraintSetMap.get(derivedFromId);
17691769
if (derivedFrom == null) {
17701770
Log.e(TAG, "ERROR! invalid deriveConstraintsFrom: @id/" +
17711771
Debug.getName(mMotionLayout.getContext(), derivedFromId));
17721772
return;
17731773
}
17741774
cs.readFallback(derivedFrom);
1775-
mDeriveMap.put(key, -1);
1775+
} else {
1776+
cs.readFallback(motionLayout);
17761777
}
1778+
cs.applyDeltaFrom(cs);
17771779
}
17781780

17791781
public static String stripID(String id) {

constraintlayout/constraintlayout/src/main/java/androidx/constraintlayout/widget/ConstraintSet.java

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -577,7 +577,6 @@ public void readFallback(ConstraintSet set) {
577577
if (constraint == null) {
578578
continue;
579579
}
580-
constraint.mDelta = parent.mDelta;
581580
if (!constraint.layout.mApply) {
582581
constraint.layout.copyFrom(parent.layout);
583582
}
@@ -668,14 +667,17 @@ public void readFallback(ConstraintLayout constraintLayout) {
668667
}
669668
}
670669

671-
for (Constraint constraint : mConstraints.values()) {
672-
if (constraint.mDelta != null) {
673-
constraint.mDelta.applyDelta(constraint);
670+
}
671+
672+
public void applyDeltaFrom(ConstraintSet cs) {
673+
for (Constraint from : cs.mConstraints.values()) {
674+
if (from.mDelta != null) {
675+
Constraint constraint = getConstraint(from.mViewId);
676+
from.mDelta.applyDelta(constraint);
674677
}
675678
}
676679
}
677680

678-
679681
/**
680682
* Parse the constraint dimension attribute
681683
*

projects/MotionLayoutVerification/app/src/main/java/android/support/constraint/app/VerificationActivity.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,7 @@ public class VerificationActivity extends AppCompatActivity implements View.OnCl
9797

9898
private static boolean REVERSE = false;
9999

100-
private final String RUN_FIRST = "verification_501";
100+
private final String RUN_FIRST = "verification_098";
101101
private final String LAYOUTS_MATCHES = "v.*_.*";
102102

103103
private static String SHOW_FIRST = "";
Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<androidx.constraintlayout.motion.widget.MotionLayout xmlns:android="http://schemas.android.com/apk/res/android"
3+
xmlns:app="http://schemas.android.com/apk/res-auto"
4+
xmlns:tools="http://schemas.android.com/tools"
5+
android:layout_width="match_parent"
6+
android:layout_height="match_parent"
7+
app:layoutDescription="@xml/verification_scene_098"
8+
app:layout_optimizationLevel="none"
9+
app:motionDebug="SHOW_PROGRESS"
10+
tools:context=".VerificationActivity">
11+
12+
<Button
13+
android:id="@+id/button"
14+
android:layout_width="wrap_content"
15+
android:layout_height="wrap_content"
16+
android:text="Button"
17+
app:layout_constraintBottom_toBottomOf="parent"
18+
app:layout_constraintEnd_toEndOf="parent"
19+
20+
app:layout_constraintStart_toStartOf="parent"
21+
app:layout_constraintTop_toTopOf="parent" />
22+
23+
<TextView
24+
android:id="@+id/textView8"
25+
android:layout_width="wrap_content"
26+
android:layout_height="wrap_content"
27+
android:layout_marginStart="24dp"
28+
android:layout_marginLeft="24dp"
29+
android:layout_marginTop="24dp"
30+
android:text="state A"
31+
app:layout_constraintStart_toStartOf="parent"
32+
app:layout_constraintTop_toTopOf="parent" />
33+
34+
<TextView
35+
android:id="@+id/textView9"
36+
android:layout_width="wrap_content"
37+
android:layout_height="wrap_content"
38+
android:layout_marginTop="24dp"
39+
android:layout_marginEnd="24dp"
40+
android:layout_marginRight="24dp"
41+
android:text="state B"
42+
app:layout_constraintEnd_toEndOf="parent"
43+
app:layout_constraintTop_toTopOf="parent" />
44+
45+
<TextView
46+
android:id="@+id/textView10"
47+
android:layout_width="wrap_content"
48+
android:layout_height="wrap_content"
49+
android:layout_marginStart="24dp"
50+
android:layout_marginLeft="24dp"
51+
android:layout_marginBottom="24dp"
52+
android:text="state C"
53+
app:layout_constraintBottom_toBottomOf="parent"
54+
app:layout_constraintStart_toStartOf="parent" />
55+
56+
<TextView
57+
android:id="@+id/textView11"
58+
android:layout_width="wrap_content"
59+
android:layout_height="wrap_content"
60+
android:layout_marginEnd="24dp"
61+
android:layout_marginRight="24dp"
62+
android:layout_marginBottom="24dp"
63+
android:text="state D"
64+
app:layout_constraintBottom_toBottomOf="parent"
65+
app:layout_constraintEnd_toEndOf="parent" />
66+
67+
<TextView
68+
android:id="@+id/textView14"
69+
android:layout_width="wrap_content"
70+
android:layout_height="wrap_content"
71+
android:text="Test of Includes"
72+
app:layout_constraintBottom_toBottomOf="parent"
73+
app:layout_constraintEnd_toEndOf="parent"
74+
app:layout_constraintHorizontal_bias="0.5"
75+
app:layout_constraintStart_toStartOf="parent" />
76+
77+
78+
</androidx.constraintlayout.motion.widget.MotionLayout>
Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<MotionScene
3+
xmlns:android="http://schemas.android.com/apk/res/android"
4+
xmlns:motion="http://schemas.android.com/apk/res-auto">
5+
6+
<Include motion:constraintSet="@xml/verification_scene_098l"/>
7+
<!-- <ConstraintSet android:id="@+id/left" >-->
8+
9+
10+
<!-- </ConstraintSet>-->
11+
<Include motion:constraintSet="@xml/verification_scene_098r"/>
12+
13+
<Transition
14+
motion:constraintSetEnd="@+id/b"
15+
motion:constraintSetStart="@id/a"
16+
motion:duration="1000">
17+
<OnClick motion:clickAction="transitionToEnd"/>
18+
</Transition>
19+
<Transition
20+
motion:constraintSetEnd="@+id/c"
21+
motion:constraintSetStart="@id/b"
22+
motion:duration="1000">
23+
<OnClick motion:clickAction="transitionToEnd"/>
24+
</Transition>
25+
26+
<Transition
27+
motion:constraintSetEnd="@+id/d"
28+
motion:constraintSetStart="@id/c"
29+
motion:duration="1000">
30+
<OnClick motion:clickAction="transitionToEnd"/>
31+
</Transition>
32+
33+
<Transition
34+
motion:constraintSetEnd="@+id/a"
35+
motion:constraintSetStart="@id/d"
36+
motion:duration="1000">
37+
<OnClick motion:clickAction="transitionToEnd"/>
38+
</Transition>
39+
40+
<ConstraintSet android:id="@+id/start"></ConstraintSet>
41+
42+
<ConstraintSet android:id="@+id/end">
43+
</ConstraintSet>
44+
45+
<ConstraintSet android:id="@+id/a" motion:deriveConstraintsFrom="@+id/left">
46+
<ConstraintOverride android:id="@+id/button" motion:layout_constraintVertical_bias="0.1" />
47+
48+
</ConstraintSet>
49+
50+
<ConstraintSet android:id="@+id/b" motion:deriveConstraintsFrom="@+id/right">
51+
<ConstraintOverride android:id="@+id/button" motion:layout_constraintHorizontal_bias="0.8" motion:layout_constraintVertical_bias="0.0" />
52+
</ConstraintSet>
53+
54+
<ConstraintSet android:id="@+id/c" motion:deriveConstraintsFrom="@+id/left">
55+
<ConstraintOverride android:id="@+id/button" motion:layout_constraintVertical_bias="0.9" />
56+
57+
</ConstraintSet>
58+
<ConstraintSet android:id="@+id/d" motion:deriveConstraintsFrom="@+id/right">
59+
<ConstraintOverride android:id="@+id/button" motion:layout_constraintVertical_bias="0.8" />
60+
61+
</ConstraintSet>
62+
</MotionScene>
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<ConstraintSet android:id="@+id/left"
3+
xmlns:android="http://schemas.android.com/apk/res/android"
4+
xmlns:motion="http://schemas.android.com/apk/res-auto">
5+
6+
<!-- <Constraint android:id="@+id/button"-->
7+
<!-- android:layout_width="wrap_content"-->
8+
<!-- android:layout_height="wrap_content"-->
9+
<!-- motion:layout_constraintHorizontal_bias="0.2"-->
10+
<!-- motion:layout_constraintBottom_toBottomOf="parent"-->
11+
<!-- motion:layout_constraintEnd_toEndOf="parent"-->
12+
13+
<!-- motion:layout_constraintStart_toStartOf="parent"-->
14+
<!-- motion:layout_constraintTop_toTopOf="parent" />-->
15+
<ConstraintOverride android:id="@+id/button" motion:layout_constraintHorizontal_bias="0.1" />
16+
17+
18+
</ConstraintSet>
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<ConstraintSet android:id="@+id/right"
3+
xmlns:android="http://schemas.android.com/apk/res/android"
4+
xmlns:motion="http://schemas.android.com/apk/res-auto">
5+
6+
<!-- <Constraint android:id="@+id/button"-->
7+
<!-- android:layout_width="wrap_content"-->
8+
<!-- android:layout_height="wrap_content"-->
9+
<!-- motion:layout_constraintHorizontal_bias="1.0"-->
10+
<!-- motion:layout_constraintBottom_toBottomOf="parent"-->
11+
<!-- motion:layout_constraintEnd_toEndOf="parent"-->
12+
13+
<!-- motion:layout_constraintStart_toStartOf="parent"-->
14+
<!-- motion:layout_constraintTop_toTopOf="parent" />-->
15+
<ConstraintOverride android:id="@+id/button" motion:layout_constraintHorizontal_bias="1.0" />
16+
17+
18+
</ConstraintSet>

0 commit comments

Comments
 (0)