Material Motion Exploring solutions that will empower creators with the tools needed to describe and implement rich, interactive motion on any platform. Edit this page · History

December 15-21, 2016

Want to contribute? Check out our Android and iOS milestones, many of which are ready for someone to take ownership of. Also check out our newbie-friendly tasks.

This weekly update captures what changed in a given week across the Material Motion ecosystem.

Check out current focus to see what we’re working on next.

Check out stability to learn about the current state of each feature.


Continued refinement of our reactive motion architecture. Starting to wind down for year-end vacations.

View all of our contributors


📝 Significant consolidation and cleanup of starmap content.

View all changes since last week

Android platform

🎉 Streams MVP completed.

Includes gesture and spring stream sources.

Apple platforms

📝 Prototyping interruptible bi-directional transitions with new reactive architecture.

📝 Modal dialog built with new reactive transitions architecture.

📝 Exploring concept of an “Interaction” as a unit of reusable motion.

📝 Prototype of a reactive interaction.

In this example, we update the card’s rotation in reaction to changes to its center position.

let rotationStream =
  .offset(by: -view.bounds.width / 2)
  .normalized(by: view.bounds.width)
  .scaled(by: CGFloat(radians))
  .bounded(amin: -radians / 2, amax: radians / 2)
aggregator.write(rotationStream, to: propertyOf(card).rotation)

📝 Prototyping introspection of an interaction. The following diagram shows a rendered version of the complete interaction shown above:

📝 chuga from the Remixer team prototyped a combination of Remixer and Material Motion. An example of using Remixer to modify material motion spring configurations in real time:

🎉 POP springs, Core Animation springs, Core Animation tweens, and gestures all landed as sources in the new reactive architecture.

The following demo shows a Core Animation-backed spring animation that’s reactively-interruptible:

The code for the above video uses two “Interactions”: TossableAndAttachWithSpring and Tap. These units of interaction are reusable pieces of motion. Over time we’ll provide implementations of these interactions on all platforms in the form of a consistent library of motion.

let tossable = TossableAndAttachWithSpring(position: propertyOf(square).center,
                                           to: propertyOf(circle).center,
                                           containerView: view,
                                           springSource: popSpringSource)
let tap = Tap(sets: tossable.destination, containerView: view)

[tossable, tap].forEach { interaction in interaction.connect(with: runtime) }

Web frameworks

🎉 Added continuous integration. See the badge on our repo README.

🎉 scrollSource completed.

📝 Streams MVP nearing completion.


🎉 tofuness, one of our newest contributors, has helped get our JavaScript testing environment up and running!


Android platform support

Library Build status Coverage Version Issues
catalog-android {+passing+} {+0%+}   0 open
conventions-android       0 open
expression-android       2 open
family-direct-manipulation-android passing 100% v1.2.0 2 open
family-rebound-android passing 100% v1.1.0 3 open
family-tween-android passing 100% v2.1.0 2 open
gestures-android passing [-95%-]{+91%+} v1.0.0 [-3-]{+4+} open
indefinite-observable-android [-failing-]{+passing+} [-95%-]{+100%+} v2.0.0 [-1-]{+0+} open
runtime-android passing 95% v6.0.1 12 open
streams-android passing [-100%-]{+81%+} v1.0.0 [-3-]{+6+} open
transitions-android       9 open

Apple platform support

Library Build status Coverage Version Platforms Docs Issues
catalog-swift passing         10 open
conventions-objc           0 open
coreanimation-swift passing 61% v2.0.0 ios   6 open
coreanimation-transitions-swift passing 84% v1.0.0 ios -1% 0 open
direct-manipulation-swift passing 84% v1.1.0 ios   5 open
indefinite-observable-swift passing 100% v3.1.0 ios / osx 54% 0 open
pop-swift passing 42% v2.1.0 -ios- 21% 6 open
pop-transitions-swift passing 71% v1.0.0 ios   0 open
runtime-objc passing 91% v6.0.1 ios 100% 16 open
streams-swift passing [-51%-]{+20%+}       [-5-]{+0+} open
transitions-objc passing 48% v1.1.0 ios 90% 5 open

Web platform support

Library Build status Coverage Version Issues
indefinite-observable-js passing 100% v0.3.0 4 open
material-motion-js {+passing+}     [-54-]{+57+} open
streams-experiment-js       1 open

Misc libraries

Library Build status Coverage Version Issues
apidiff passing 86% v1.0.0 11 open
chrome-inspector       4 open
direct-web       0 open
hubot       0 open
material-motion       16 open
milemarker       18 open
sprints       32 open
starmap       [-43-]{+45+} open
sublime       [-1-]{+4+} open
tools       [-96-]{+97+} open

Learn more

Join us on Discord!