Introduce new builder pattern and create DynamicSpringSource for MaterialSpring.

Authored by markwei on May 1 2017, 4:34 PM.

Description

Introduce new builder pattern and create DynamicSpringSource for MaterialSpring.

Summary:
This is similar to the coreanimation pattern in material-motion-swift.
This is a useful pattern for animation systems that require the target object and property to be provided up-front.
For example, off-thread animation systems require this.

A new build channel is added to MotionObservable.
An interaction that uses an off-thread animation system would use the build channel rather than the next channel.

This build channel passes along:

  1. a MotionBuilder<T> object
  2. a T[] of config values

The MotionBuilder<T> can take a T[] of config values to create some type of motion, and is created by the interaction.
The T[] is transformed by constraint operators as it is passed down the build channel.
Only specific T->T operators can transform this T[].

If a stream given to MotionRuntime.write(stream, property) has an active build channel,
the MotionBuilder<T> will be given the transformed T[] and the property.

The new DynamicSpringSource and DynamicSpringBuilder uses this builder pattern.
DynamicSpringBuilder supports writing T values to Property<T> by using a TypeVectorizer to break a T value into multiple Float values.
Each float value is animated by a separate SpringAnimation.

Part of https://github.com/material-motion/material-motion-android/issues/64

Reviewers: O2 Material Motion, O6 Material Android platform reviewers, Material Motion, featherless

Reviewed By: O2 Material Motion, Material Motion, featherless

Subscribers: featherless

Tags: Material Motion

Differential Revision: http://codereview.cc/D3150