ConstraintLayout & MotionLayout in
Compose
John Hoford


Google


@johnhoford
Nicolas Roard


Rivian


@camaelon
Overview
ConstraintLayout 1.0
ConstraintLayout
Core


(Solver Engine)
ViewGroup
XML Parsing
ConstraintSet
ConstraintLayout 1.0
• Flexible Layout Manager

• Positions relatively, in percentage, as a set (chain)

• Dimensions : ratio, percentage, weight…

• Guideline, Barriers…

• ConstraintSet : build your layout rules on the
fl
y, swap them

• Layout Editor
ConstraintLayout
ConstraintLayout 1.0
Core


(Solver Engine)
ViewGroup
XML Parsing
ConstraintSet
ConstraintLayout 2.0
ConstraintLayout
Core


(Solver Engine)
ViewGroup
XML Parsing
ConstraintSet
MotionLayout
Core


Interpolator “physics” engines
ViewGroup
XML Parsing

Touch Handling
ConstraintSet
Transitions
KeyFrames
Helpers
OnSwipe
ConstraintLayout 2.0
• Virtual Layouts

• Helpers & Decorators

• Programming APIs

• MotionLayout
• Motion Editor
ConstraintLayout 2.0
ConstraintLayout
Core


(Solver Engine)
ViewGroup
XML Parsing
ConstraintSet
MotionLayout
Core


Interpolator “physics” engines
ViewGroup
XML Parsing

Touch Handling
ConstraintSet
Transitions
KeyFrames
Helpers
OnSwipe
ConstraintLayout 2.1
ConstraintLayout
Core


(Solver Engine)
ViewGroup
XML Parsing
ConstraintSet
MotionLayout
Core


Interpolator “physics” engines
ViewGroup
XML Parsing

Touch Handling
ConstraintSet
Transitions
KeyFrames
ViewTransitions
Helpers
ConstraintProperties
Helpers
OnSwipe
ConstraintLayout 2.1
ConstraintLayout

• CircularFlow

• ReactiveGuide

• supports negative margins for constraints

• supports baseline to top and baseline to bottom constraints

• supports baseline margin constraints
Foldable Support
• https://developer.android.com/training/constraint-layout/foldables
C
A
B
Negative


Margins
Baseline to


Top or Bottom


+/- margin
ConstraintLayout 2.1
MotionLayout

• Rotation: Polar motions, Device Rotation, Rotation swipes

• ViewTransitions

• OnSwipe Spring

• Interpolators - Overshoot, quantized motion

• Animated Text 

• Motion Helpers: MotionE
ff
ect & Carousel

• Scalability: <include> <ConstraintOverride>
• Support Complex Rotational Animation
Polar mode
Device Rotation
<ViewTransitions>
• “noState” Run asynchronous 

<ViewTransitio
n

android:id="@+id/spin
"

motion:motionTarget="button.*
"

motion:viewTransitionMode="noState
"

motion:onStateTransition="actionDownUp
"

motion:upDuration = "700
"

motion:duration="200"
>

<KeyFrameSet
>

<KeyAttribute motion:framePosition="30"
>

<CustomAttribut
e

motion:attributeName="roundPercent
"

motion:customFloatValue=".3" /
>

<CustomAttribut
e

motion:attributeName="background
"

motion:customColorDrawableValue="#AE7088" /
>

</KeyAttribute
>

</KeyFrameSet
>

</ViewTransition
>
Springs!
<OnSwip
e

motion:dragDirection ="dragUp
"

motion:touchAnchorId ="@id/bar
"

motion:springStiffness ="3300
"

motion:springDamping ="50
"

motion:springMass ="2
"

motion:autoCompleteMode="spring
"

motion:springBoundary ="bounceStart
"

motion:onTouchUp="neverCompleteToEnd"
Quantized Motion
<Constraint android:id="@id/image1"
>

<Motio
n

motion:quantizeMotionSteps="12
"

motion:quantizeMotionInterpolator="bounce
"

/>
</Constraint>
Animated Text
MotionLabel
<androidx.constraintlayout.helper.widget.MotionEffec
t

android:id="@+id/fade
"

app:motionEffect_start="40
"

app:motionEffect_alpha="0
"

app:motionEffect_end="60
"

app:motionEffect_move="west
"

app:motionEffect_strict="false
"

android:layout_width="wrap_content
"

android:layout_height="wrap_content
"

app:constraint_referenced_ids="t1,t2,t3,t4,t5,t6,t7,t8,t9
"

/
>

<androidx.constraintlayout.helper.widget.MotionEffec
t

android:id="@+id/fade
"

android:layout_width="wrap_content
"

android:layout_height="wrap_content
"

app:motionEffect_viewTransition="@+id/foo
"

app:motionEffect_translationY="-40dp
"

app:constraint_referenced_ids="t1,tf1,t2,tf2,t3,tf3,t4,tf4,t5,tf5
"

/
>

MotionHelper: MotionE
ff
ect
<ViewTransition android:id="@+id/foo"
>

<KeyFrameSet
>

<KeyAttribute motion:framePosition="20" android:alpha="0.5" android:rotationX="80" android:scaleY="0.5" android:scaleX="0.5"/
>

<KeyAttribute motion:framePosition="50" android:alpha=“0.0" android:rotationX="80" android:scaleY="0.5" android:scaleX="0.5"/
>

<KeyAttribute motion:framePosition="80" android:alpha="0.5" android:rotationX="80" android:scaleY="0.5" android:scaleX="0.5"/
>

</KeyFrameSet
>

</ViewTransition
>
Carousel
h
tt
ps://developer.android.com/training/constraint-layout/motionlayout/carousel
ConstraintLayout 2.1
ConstraintLayout
Core


(Solver Engine)
ViewGroup
XML Parsing
ConstraintSet
MotionLayout
Core


Interpolator “physics” engines
ViewGroup
XML Parsing

Touch Handling
ConstraintSet
Transitions
KeyFrames
ViewTransitions
Helpers
ConstraintProperties
Helpers
OnSwipe
ConstraintLayout Compose 1.0
ConstraintLayout
Core


(Solver Engine)
ConstraintSet
MotionLayout
Core


Interpolator “physics” engines
ConstraintSet
Transitions
KeyFrames
OnSwipe
Compose


Adaptor
Compose


Adaptor
ConstraintLayout / Compose
• Common Core with existing implementation

• Kotlin DSL to express constraints

• JSON syntax to express constraints

• Work in Progress : we want your feedback!
Why?


ConstraintLayout in Compose
• Migration path

• Relative positioning

• Separation of concerns
ConstraintSet using DSL
ConstraintSet using JSON5
Animate by Changing
ConstraintSet!
Animate by Changing
ConstraintSet!
Animate by Changing
ConstraintSet!
Animate by Changing
ConstraintSet!
Animate by Changing
ConstraintSet!
Animate by Changing
ConstraintSet!
MotionLayout / Compose
• JSON5 (http://www.json5.org)

• Limited subset for now

• Check examples 

• https://github.com/androidx/constraintlayout/tree/main/
projects/ComposeConstraintLayout
MotionLayout / Compose


JSON5
• Header

• ConstraintSet

• Generate

• Variables

• Transitions

• KeyFrames

• KeyPosition

• KeyAttributes

• KeyCycle
• Header

• ConstraintSet

• Generate

• Variables

• Transitions

• KeyFrames

• KeyPosition

• KeyAttributes

• KeyCycle
MotionLayout / Compose


JSON5
• Header

• ConstraintSet

• Generate

• Variables

• Transitions

• KeyFrames

• KeyPosition

• KeyAttributes

• KeyCycle
MotionLayout / Compose


JSON5
• Header

• ConstraintSet

• Generate

• Variables

• Transitions

• KeyFrames

• KeyPosition

• KeyAttributes

• KeyCycle
MotionLayout / Compose


JSON5
• KeyCycle
MotionLayout / Compose


JSON5
MotionLayout / Compose


Examples
http://www.github.com/androidx/consraintlayout/projects
JSON5
• Disadvantages

• New Syntax to learn

• Parse → constants 

vs.

execute → constraints
• Advantages

• Compact

• Enable novel functionality

• Cross platform

• Live Literal → fast update

• Separation of Concerns

• Link…
Variables: {
angle: { from: 0, step: 10 },
rotation: { from: 'startRotation', step: 10 },
distance: 100,
mylist: { tag: 'box' }
},
Generate: {
mylist: {
width: 200,
height: 40,
circular: ['parent', 'angle', 'distance'],
pivotX: 0.1,
pivotY: 0.1,
translationX: 225,
rotationZ: 'rotation'
}
}
Link
https://github.com/androidx/constraintlayout/wiki/How-to-use-Link
Swing Application
Link
App
ConstraintLayout


MotionLayout
Json5
Json5
LinkServer
ADB
https://github.com/androidx/constraintlayout/tree/main/constraintlayout/tools
•Run your app


•Linking LinkServer.kt


•adb forward tcp:9999 tcp:9999


•run desktop app:


ConstraintLayoutLink
List all exported json5 scripts
JSON5 pulled


From device
Visual Inspector
Timeline Attributes
Graphical Editing
Create
Simulate Phone sizes
Where are we now
Constraint Layout 2.1.1
dependencies
{

  implementation ‘androidx.constraintlayout:constraintlayout:2.1.1
’

}

h
tt
ps://github.com/AndroidX/constraintlayout
ConstraintLayout Compose


1.0.0-rc01
dependencies
{

  implementation ‘androidx.constraintlayout:constraintlayout-compose:1.0.0-rc01
’

}

h
tt
ps://github.com/AndroidX/constraintlayout
Give us feedback!
https://github.com/androidx/constraintlayout/issues
Thanks!
John Hoford


Google


@johnhoford
Nicolas Roard


Rivian


@camaelon

ConstraintLayout Compose 2021 Chicago Roboto