Add "form" parameter to AnimationController forward and reverse

Fixes #2324
diff --git a/packages/flutter/lib/src/animation/animation_controller.dart b/packages/flutter/lib/src/animation/animation_controller.dart
index e4c0b20..205ecd4 100644
--- a/packages/flutter/lib/src/animation/animation_controller.dart
+++ b/packages/flutter/lib/src/animation/animation_controller.dart
@@ -125,13 +125,17 @@
   }
 
   /// Starts running this animation forwards (towards the end).
-  Future forward() {
+  Future forward({ double from }) {
+    if (from != null)
+      value = from;
     _direction = _AnimationDirection.forward;
     return animateTo(upperBound);
   }
 
   /// Starts running this animation in reverse (towards the beginning).
-  Future reverse() {
+  Future reverse({ double from }) {
+    if (from != null)
+      value = from;
     _direction = _AnimationDirection.reverse;
     return animateTo(lowerBound);
   }
diff --git a/packages/flutter/test/animation/animation_controller_test.dart b/packages/flutter/test/animation/animation_controller_test.dart
index f7f1903..b561bff 100644
--- a/packages/flutter/test/animation/animation_controller_test.dart
+++ b/packages/flutter/test/animation/animation_controller_test.dart
@@ -102,4 +102,32 @@
 
     controller.stop();
   });
+
+  test("Forward and reverse from values", () {
+    WidgetFlutterBinding.ensureInitialized();
+    AnimationController controller = new AnimationController(
+      duration: const Duration(milliseconds: 100)
+    );
+    List<double> valueLog = <double>[];
+    List<AnimationStatus> statusLog = <AnimationStatus>[];
+    controller
+      ..addStatusListener((AnimationStatus status) {
+        statusLog.add(status);
+      })
+      ..addListener(() {
+        valueLog.add(controller.value);
+      });
+
+    controller.reverse(from: 0.2);
+    expect(statusLog, equals([ AnimationStatus.reverse ]));
+    expect(valueLog, equals([ 0.2 ]));
+    expect(controller.value, equals(0.2));
+    statusLog.clear();
+    valueLog.clear();
+
+    controller.forward(from: 0.0);
+    expect(statusLog, equals([ AnimationStatus.dismissed, AnimationStatus.forward ]));
+    expect(valueLog, equals([ 0.0 ]));
+    expect(controller.value, equals(0.0));
+  });
 }