Weitere ähnliche Inhalte Ähnlich wie Constraint-ly motion - making your app dance - John Hoford, Google (20) Mehr von DroidConTLV (20) Kürzlich hochgeladen (20) Constraint-ly motion - making your app dance - John Hoford, Google2. { droidcon Tel Aviv}
ConstraintLayout 2.0 alpha2
★ Layout
★ Helpers
★ Rendering
★ Live Resize
★ MotionLayout
★ APIs
3. { droidcon Tel Aviv}
ConstraintLayout 2.0 alpha2
★ Layout
★ Helpers
★ Rendering
★ Live Resize
★ MotionLayout
★ APIs
5. { droidcon Tel Aviv}
Why add Animation?
★Provide Context
★Convey Meaning
★Delight
★Distract
6. { droidcon Tel Aviv}
Why add Animation
★Provide Context
Where did the UI come from?
Where did it go?
7. { droidcon Tel Aviv}
Why add Animation
★Convey Meaning
Use motion to inform the user
(Normally animated content)
8. { droidcon Tel Aviv}
Why add Animation
★Delight
Visually interesting animations
✴ Make your app memorable
✴ Indicates app is high quality
9. { droidcon Tel Aviv}
Why add Animation
★Distract
•Only when necessary
•Startup screen
•Performing work
10. { droidcon Tel Aviv}
Animation Types
Animated content
Transition Layouts
Motion
Property Animation
11. { droidcon Tel Aviv}
Animation Types
Animated content
Transition Layouts
Motion
Lottie, Animated Vector Drawable, GIFs, etc.
TransitionManager
CoordinatorLayout
Property Animation Property animation framework (code)
12. { droidcon Tel Aviv}
MotionLayout
Animated content Lottie, Animated Vector Drawable, GIFs, etc.
TransitionManager
CoordinatorLayout
Property animation framework (code)
Transition Layouts
Motion
Property Animation
14. { droidcon Tel Aviv}
MotionLayout basics
★ Sub class of ConstraintLayout
★ Extends CL2.0s LayoutDescription to have full animations capabilities
★ Provides a division between views and layout & animation
class MotionLayout extends ConstraintLayout
app:layoutDescription=“@xml/motion_scene”
layout/
motion.xml
View
Views
xml/
motion_scene.xml
View
Constraints
View
KeyFrames
15. { droidcon Tel Aviv}
MotionLayout goals
★ Lower cost of maintain programatic animations
★ Richly Declarative (can support tooling)
★ A platform for us to deliver more capability over time
17. { droidcon Tel Aviv}
Declarative Approach
★ Rich easier model
★ We can build tooling
20. { droidcon Tel Aviv}
Convert To MotionLayout
•Rename ConstrintLayout to :
android.support.constraint.motion.MotionLayout
•Add attribute:
app:layoutDescription="@xml/motion_scene"
•Creat res/xml/motion_scene.xml
•In motion scene…
21. <?xml version="1.0" encoding="utf-8"?>
<MotionScene …>
<Transition
motion:constraintSetStart="@+id/start"
motion:constraintSetEnd="@+id/end">
</Transition>
<ConstraintSet android:id="@+id/start">
<Constraint
android:id=“@+id/control”…/>
</ConstraintSet>
<ConstraintSet android:id="@+id/end">
<Constraint
android:id=“@+id/control" …/>
</ConstraintSet>
</MotionScene>
22. <?xml version="1.0" encoding="utf-8"?>
<MotionScene …>
<Transition
motion:constraintSetStart="@+id/start"
motion:constraintSetEnd="@+id/end">
</Transition>
<ConstraintSet android:id="@+id/start">
<Constraint
android:id=“@+id/control”…/>
</ConstraintSet>
<ConstraintSet android:id="@+id/end">
<Constraint
android:id=“@+id/control" …/>
</ConstraintSet>
</MotionScene>
<ConstraintSet android:id="@+id/start">
<Constraint
android:id=“@+id/control"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
motion:layout_constraintBottom_toBottomOf=“parent"
motion:layout_constraintEnd_toStartOf="@+id/imageButton2"
motion:layout_constraintStart_toStartOf="parent"
/>
</ConstraintSet>
23. <?xml version="1.0" encoding="utf-8"?>
<MotionScene …>
<Transition
motion:constraintSetStart="@+id/start"
motion:constraintSetEnd="@+id/end">
</Transition>
<ConstraintSet android:id="@+id/start">
<Constraint
android:id=“@+id/control”…/>
</ConstraintSet>
<ConstraintSet android:id="@+id/end">
<Constraint
android:id=“@+id/control" …/>
</ConstraintSet>
</MotionScene>
<ConstraintSet android:id="@+id/start">
<Constraint
android:id=“@+id/control"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
motion:layout_constraintTop_toTopOf=“parent”
motion:layout_constraintEnd_toStartOf="@+id/imageButton2"
motion:layout_constraintStart_toStartOf="parent"
/>
</ConstraintSet>
24. { droidcon Tel Aviv}
3 ways to trigger
Animation
• Programatic
• Built in OnTouch or OnSwipe
• Nested - MotionLayout containing MotionLayout
25. { droidcon Tel Aviv}
Advantages
• All you views are in one layout.
•The animation effects & layout are unified.
•You can have matching layouts for landscape, screen size, etc.
•You can view this from the IDE
27. { droidcon Tel Aviv}
xml/motion_scene.xml
MotionScene
ConstraintSet
ConstraintSet
Major components
layout/motion.xml
MotionLayout
View
Helpers
View
Constraints
Transition
Transition
KeyFrameSet
ViewKeyPosition
ViewKeyAttributes
View
KeyCycle
View
Helpers
app:layoutDescription =
28. { droidcon Tel Aviv}
xml/motion_scene.xml
MotionScene
ConstraintSet
ConstraintSet
MotionLayout
layout/motion.xml
MotionLayout
View
Helpers
View
Constraints
Transition
Transition
KeyFrameSet
ViewKeyPosition
ViewKeyAttributes
View
KeyCycle
View
Helpers
app:layoutDescription =
29. { droidcon Tel Aviv}
MotionLayout XML attributes
★ app:layoutDescription =”reference”
★ app:applyMotionScene =”boolean” [ default = true ]
★ app:showPaths =”boolean” [ default = false]
★ app:progress =”float”
★ app:currentState =”reference”
30. { droidcon Tel Aviv}
Transition API
★ transitionToEnd()
★ transitionToStart()
★ transitionToState(int state)
★ setProgress(float value) [0 .. 1]
31. { droidcon Tel Aviv}
xml/motion_scene.xml
MotionScene
ConstraintSet
ConstraintSet
ConstraintSet
layout/motion.xml
MotionLayout
View
Helpers
View
Constraints
Transition
Transition
KeyFrameSet
ViewKeyPosition
ViewKeyAttributes
View
KeyCycle
View
Helpers
app:layoutDescription =
32. { droidcon Tel Aviv}
ConstraintSet
★ Encapsulate all the rules for a layout
★ Apply ConstraintSet to an existing layout
★ Switch between multiple ConstraintSets
★ Basic animation capabilities using TransitionManager
33. { droidcon Tel Aviv}
Start End
Seekable Transition
Start
ConstraintSet
End
ConstraintSet
Interpolation
34. { droidcon Tel Aviv}
Interpolated Attributes
★ Position, Dimensions
★ Visibility & Alpha
★ Translation, Rotation, Scale, Elevation
★ Custom attributes
35. { droidcon Tel Aviv}
Custom Attributes
★ Extension to ConstraintSet
★ Define values for any attribute
★Specify the type
★Specify the setter name
string
color
integer
float
dimension
boolean
37. { droidcon Tel Aviv}
xml/motion_scene.xml
MotionScene
ConstraintSet
ConstraintSet
Transition
layout/motion.xml
MotionLayout
View
Helpers
View
Constraints
Transition
Transition
KeyFrameSet
ViewKeyPosition
ViewKeyAttributes
View
KeyCycle
View
Helpers
app:layoutDescription =
38. { droidcon Tel Aviv}
Transition XML attributes
★ motion:constraintSetStart =”reference”
★ motion:constraintSetEnd =”reference”
★ motion:duration =”int” [ milliseconds ]
★ motion:interpolator = ”linear” (easeInOut, easeOut, …
43. <?xml version="1.0" encoding="utf-8"?>
<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:duration="1000">
</Transition>
<ConstraintSet android:id="@+id/start">
<Constraint
android:id="@+id/button"
android:layout_width="64dp"
android:layout_height="64dp"
android:layout_marginStart="8dp"
motion:layout_constraintBottom_toBottomOf="parent"
motion:layout_constraintStart_toStartOf="parent"
motion:layout_constraintTop_toTopOf="parent" />
44. <?xml version="1.0" encoding="utf-8"?>
<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:duration="1000">
</Transition>
<ConstraintSet android:id="@+id/start">
<Constraint
android:id="@+id/button"
android:layout_width="64dp"
android:layout_height="64dp"
android:layout_marginStart="8dp"
motion:layout_constraintBottom_toBottomOf="parent"
motion:layout_constraintStart_toStartOf="parent"
motion:layout_constraintTop_toTopOf="parent" />
50. class BasicTransitionActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.motion)
run.setOnClickListener {
motionLayout.transitionToEnd()
}
}
}
52. <?xml version="1.0" encoding="utf-8"?>
<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:duration="1000">
</Transition>
<ConstraintSet android:id="@+id/start">
<Constraint
android:id="@+id/button"
android:layout_width="64dp"
android:layout_height="64dp"
android:layout_marginStart="8dp"
motion:layout_constraintBottom_toBottomOf="parent"
motion:layout_constraintStart_toStartOf="parent"
motion:layout_constraintTop_toTopOf="parent" />
53. <?xml version="1.0" encoding="utf-8"?>
<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:duration="1000">
</Transition>
<ConstraintSet android:id="@+id/start">
<Constraint
android:id="@+id/button"
android:layout_width="64dp"
android:layout_height="64dp"
android:layout_marginStart="8dp"
motion:layout_constraintBottom_toBottomOf="parent"
54. <?xml version="1.0" encoding="utf-8"?>
<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:duration="1000">
</Transition>
<ConstraintSet android:id="@+id/start">
<Constraint
android:id="@+id/button"
android:layout_width="64dp"
android:layout_height="64dp"
android:layout_marginStart="8dp"
motion:layout_constraintBottom_toBottomOf="parent"
<OnClick
motion:target=“@id/run"/>
58. { droidcon Tel Aviv}
Utilities
★ MockView
★ ImageFilterView : Contrast, Saturation, Warmth, crossfade
68. { droidcon Tel Aviv}
Events
★ TransitionListener
★ OnClick
★ OnSwipe
70. public interface TransitionListener {
void onTransitionChange(MotionLayout motionLayout,
int startId, int endId,
float progress);
void onTransitionCompleted(MotionLayout motionLayout,
int currentId);
}
79. Touch Up / Release
Takes in account velocity
Choose a continuous velocity curve to reach the endpoints
with a velocity of zero
82. { droidcon Tel Aviv}
xml/motion_scene.xml
MotionScene
ConstraintSet
ConstraintSet
Major components
layout/motion.xml
MotionLayout
View
Helpers
View
Constraints
Transition
Transition
KeyFrameSet
ViewKeyPosition
ViewKeyAttributes
View
KeyCycle
View
Helpers
app:layoutDescription =
85. { droidcon Tel Aviv}
Keyframes
★ Position
★ Attributes
★ Cycles
★ …and more
102. { droidcon Tel Aviv}
oscillation of
post layout attributes
Cycles
109. { droidcon Tel Aviv}
Integration
★ CoordinatorLayout
★ DrawerLayout
★ ViewPager
★ MotionLayout
111. { droidcon Tel Aviv}
CoordinatorLayout
Collapsible
Toolbar
From GitHub
118. { droidcon Tel Aviv}
Whats Next…
★ ConstraintLayout 2.0 alpha3
★ KeyTimeCycles
★ Arc mode
★ Multi-state swipe
★ Helpers
★ Alpha MotionEditor
119. { droidcon Tel Aviv}
Documentation
★ Online Documentation: https://developer.android.com/reference/android/
support/constraint/motion/package-summary
★ Medium Articles:
★ Introduction to MotionLayout - Part I, II, III, IV :
http://bit.ly/2O4AmIz
★ GitHub
https://github.com/googlesamples/android-ConstraintLayoutExamples