Upgrade to Pro — share decks privately, control downloads, hide ads and more …

ContraintLayout 2.0 - Introduction to MotionLayout

Avatar for Andrew Kelly Andrew Kelly
November 02, 2018

ContraintLayout 2.0 - Introduction to MotionLayout

Slides from my Mobile Era 2018 talk.

Avatar for Andrew Kelly

Andrew Kelly

November 02, 2018
Tweet

More Decks by Andrew Kelly

Other Decks in Technology

Transcript

  1. Constraint Layout 1.0 • Uses Cassowary algorithm, to place children

    relative to anchor points on other views or the parent layout so that constraints are satisfied. • API 9+ • Current version 1.1.3 • Included in the Support Library. • Android Studio 3.x - visual layout editor • Maintains a flat hierarchy which allows constraints to be easily modified • Constraints are embedded within the layout file.
  2. 2.0 Overview • ConstraintLayout 2.0 allows ConstraintSets to be externalised

    into a separate file from the layouts themselves. • ConstrainLayout 2.0 now includes a new tool for adding motion - MotionLayout. • API 14+ • MotionLayout extends ConstraintLayout so can be a drop in replacement if you want to get started slowly. • MotionLayout uses MotionScenes to manage the animation between different ConstraintSets. • MotionScenes also let you animate custom attributes. • MotionScenes allow you to interpolate the animations between states based on user input e.g. dragging.
  3. <android.support.constraint.motion.MotionLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent" app:layoutDescription="@xml/scene_keyframe" app:showPaths="true"> ... </android.support.constraint.motion.MotionLayout> If

    you’re using androidx the package names will be slightly different. <android.support.constraint.motion.MotionLayout app:layoutDescription="@xml/scene_keyframe" app:showPaths="true"> </android.support.constraint.motion.MotionLayout> layout/layout_keyframe.xml
  4. <MotionScene xmlns:android="http://schemas.android.com/apk/res/android" xmlns:motion="http://schemas.android.com/apk/res-auto"> <Transition motion:constraintSetStart="@+id/start" motion:constraintSetEnd="@+id/end" motion:interpolator="linear" motion:duration="1000"> <OnSwipe ...

    /> <OnClick ... /> </Transition> <ConstraintSet android:id="@+id/start"> <Constraint ... /> </ConstraintSet> <ConstraintSet android:id="@+id/end"> <Constraint ... /> </ConstraintSet> </MotionScene> xml/scene_keyframe.xml <MotionScene xmlns:android="http://schemas.android.com/apk/res/android" xmlns:motion="http://schemas.android.com/apk/res-auto"> <Transition motion:constraintSetStart="@+id/start" motion:constraintSetEnd="@+id/end" motion:interpolator="linear" motion:duration="1000"> <OnSwipe ... /> <OnClick ... /> </Transition> </MotionScene>
  5. <MotionScene xmlns:android="http://schemas.android.com/apk/res/android" xmlns:motion="http://schemas.android.com/apk/res-auto"> <Transition motion:constraintSetStart="@+id/start" motion:constraintSetEnd="@+id/end" motion:interpolator="linear" motion:duration="1000"> <OnSwipe ...

    /> <OnClick ... /> </Transition> <ConstraintSet android:id="@+id/start"> <Constraint ... /> </ConstraintSet> <ConstraintSet android:id="@+id/end"> <Constraint ... /> </ConstraintSet> </MotionScene> xml/scene_keyframe.xml <MotionScene xmlns:android="http://schemas.android.com/apk/res/android" xmlns:motion="http://schemas.android.com/apk/res-auto"> <ConstraintSet android:id="@+id/start"> <Constraint ... /> </ConstraintSet> <ConstraintSet android:id="@+id/end"> <Constraint ... /> </ConstraintSet> </MotionScene>
  6. <ConstraintSet android:id="@+id/start"> <Constraint android:id="@+id/text" motion:layout_constraintEnd_toEndOf="parent" motion:layout_constraintStart_toStartOf="parent" motion:layout_constraintTop_toTopOf="parent" /> </ConstraintSet> <ConstraintSet

    android:id="@+id/end"> <Constraint android:id="@id/text" motion:layout_constraintBottom_toBottomOf="parent" motion:layout_constraintEnd_toEndOf="parent" motion:layout_constraintStart_toStartOf="parent" /> </ConstraintSet>
  7. Transitions • MotionScene allows you to define handlers in xml

    for OnSwipe and OnClick • OnSwipe interacts with user touches. • OnClick responds to clicks • You can have OnSwipe and OnClick both defined in the MotionScene, but OnClick will no longer work if OnSwipe is defined.* • You can also trigger transitions programatically. * more news on this later.
  8. DragDirection • dragUp, dragDown, dragLeft, dragRight TouchAnchorSide • top, left,

    right, bottom Mode • toggle, transitionToEnd, transitionToStart, jumpToEnd, jumpToStart <OnSwipe motion:dragDirection="dragUp" motion:touchAnchorId="@+id/text" motion:touchAnchorSide="top" /> <OnClick motion:mode="toggle" motion:target="@+id/text" />
  9. <KeyPosition> • Keyframes allow you to define a transient state

    for a widget, whereas a ConstraintSet defines a “resting” state. • Keyframes are very lightweight compared to ConstraintSets • KeyPositions allow you to modify the path a widget will take during a transition.
  10. Coordinate Systems • You may have noticed in the previous

    examples that <KeyPosition> motion:percentY moves the path in what looks like the x axis. • The reason for this is because of the coordinate system being used - pathRelative • Keyframes can use different coordinate systems for different widgets.
  11. DeltaRelative - X <KeyPosition motion:framePosition="25" motion:percentX="0.75" motion:keyPositionType="deltaRelative" motion:target="@+id/text" /> <KeyPosition

    motion:framePosition="75" motion:percentX="0.25" motion:keyPositionType="deltaRelative" motion:target="@+id/text" /> x y Key 1 Key 2
  12. DeltaRelative - Y <KeyPosition motion:framePosition="25" motion:percentY="0.75" motion:keyPositionType="deltaRelative" motion:target="@+id/text" /> <KeyPosition

    motion:framePosition="75" motion:percentY="0.25" motion:keyPositionType="deltaRelative" motion:target="@+id/text" /> x y Key 1 Key 2
  13. DeltaRelative - X <KeyPosition motion:framePosition="25" motion:percentX="0.75" motion:keyPositionType="deltaRelative" motion:target="@+id/text" /> <KeyPosition

    motion:framePosition="75" motion:percentX="0.25" motion:keyPositionType="deltaRelative" motion:target="@+id/text" /> y Key 2 Key 1 x
  14. DeltaRelative - X <KeyPosition motion:framePosition="25" motion:percentX="0.75" motion:keyPositionType="deltaRelative" motion:target="@+id/text" /> <KeyPosition

    motion:framePosition="75" motion:percentX="0.25" motion:keyPositionType="deltaRelative" motion:target="@+id/text" /> y Key 2 Key 1 x
  15. <KeyAttribute> • Similar to KeyPosition, except rather than allowing you

    to add a keyframe for a position, it allows you to add a keyframe for an attribute. • visibility • alpha • elevation • rotation • rotationX/Y • scaleX/Y • translationX/Y/Z <KeyAttribute android:rotation="45" motion:framePosition="50" motion:target="@id/text" />
  16. <KeyAttribute> • Custom attributes are also supported, the attribute you

    want to modify needs to have a get/set method in the form get<AttributeName> e.g. getBackgroundColor • Values that can be altered • Color • Integer • Float • String • Dimension • Boolean <KeyAttribute motion:framePosition="50" motion:target="@id/text"> <CustomAttribute motion:attributeName="backgroundColor" motion:customColorValue="#0000FF"/> </KeyAttribute>
  17. <KeyAttribute app:framePosition="100" app:target="@id/backgroundDim"> <CustomAttribute app:attributeName="BackgroundColor" app:customColorValue="#424242" /> </KeyAttribute> <KeyAttribute app:framePosition="0"

    app:target="@id/backgroundDim"> <CustomAttribute app:attributeName="BackgroundColor" app:customColorValue="#00000000" /> </KeyAttribute>
  18. To synchronise the 2 MotionLayouts in the different fragments Arman

    uses a MotionLayout.TransitionListener videoMotionLayout.addTransitionListener(object : MotionLayout.TransitionListener { override fun onTransitionChange(motionLayout: MotionLayout?, startId: Int, endId: Int, progress: Float) { val mainActivity = activity as MainActivity mainActivity.mainMotionLayout.progress = Math.abs(progress) } override fun onTransitionCompleted(motionLayout: MotionLayout?, currentId: Int) { } })
  19. In Closing • ConstraintLayout v2.0 is still in alpha….don’t be

    scared! It builds upon the stable v1.1 • Alpha 2 contains breaking changes from Alpha 1, to avoid namespace clash with Navigation components. 
 Android Studio 3.4 should contain the new Keyframe editor demoed at Google I/O 2018 <KeyPosition motion:type=“pathRelative"/> <KeyPosition motion:keyPositionType="pathRelative"/>
  20. In Closing Transitions • The OnSwipe/OnClick issue mentioned earlier should

    be resolved in alpha3 • Alpha3 should arrive sometime soon after the 5th Nov.
  21. Resources ConstraintLayout 2.0 video from I/O 18 • https://www.youtube.com/watch?v=ytZteMo4ETk ConstraintLayout

    2.0 samples • https://github.com/googlesamples/android-ConstraintLayoutExamples Introduction to MotionLayout • https://medium.com/google-developers/introduction-to-motionlayout-part-i-29208674b10d TIVI • https://github.com/chrisbanes/tivi YouTube Demo • https://github.com/armcha/MotionLayout_youtube_animation
  22. Who to follow Nicolas Roard - https://twitter.com/camaelon John Hoford -

    https://twitter.com/johnhoford Mark Allison - https://blog.stylingandroid.com Chris Banes - https://twitter.com/chrisbanes Britt Barak - https://twitter.com/BrittBarak Huyen Tue Dao - https://twitter.com/queencodemonkey Rebecca Franks - https://twitter.com/riggaroo