Skip to content

Commit

Permalink
Merge pull request flutter#597 from mpcomplete/value.animation
Browse files Browse the repository at this point in the history
Add a ValueAnimation helper class for AnimationPerfomance.
  • Loading branch information
mpcomplete committed Aug 14, 2015
2 parents ed7b8d3 + e58a2bd commit 5bad614
Show file tree
Hide file tree
Showing 4 changed files with 30 additions and 17 deletions.
4 changes: 2 additions & 2 deletions examples/widgets/ensure_visible.dart
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ class EnsureVisibleApp extends App {
List<CardModel> cardModels;
BlockViewportLayoutState layoutState = new BlockViewportLayoutState();
ScrollListener scrollListener;
AnimationPerformance scrollAnimation;
ValueAnimation<double> scrollAnimation;

void initState() {
List<double> cardHeights = <double>[
Expand All @@ -51,7 +51,7 @@ class EnsureVisibleApp extends App {
return new CardModel(i, cardHeights[i], color);
});

scrollAnimation = new AnimationPerformance()
scrollAnimation = new ValueAnimation<double>()
..duration = const Duration(milliseconds: 200)
..variable = new AnimatedValue<double>(0.0, curve: ease);

Expand Down
19 changes: 17 additions & 2 deletions sky/packages/sky/lib/animation/animation_performance.dart
Original file line number Diff line number Diff line change
Expand Up @@ -26,13 +26,17 @@ enum AnimationStatus {
// manipulating |progress|, or |fling| the timeline causing a physics-based
// simulation to take over the progression.
class AnimationPerformance {
AnimationPerformance({this.variable, this.duration}) {
AnimationPerformance({AnimatedVariable variable, this.duration}) :
_variable = variable {
_timeline = new Timeline(_tick);
}

AnimatedVariable variable;
AnimatedVariable _variable;
Duration duration;

AnimatedVariable get variable => _variable;
void set variable(AnimatedVariable v) { _variable = v; }

// Advances from 0 to 1. On each tick, we'll update our variable's values.
Timeline _timeline;
Timeline get timeline => _timeline;
Expand Down Expand Up @@ -179,3 +183,14 @@ class AnimationPerformance {
_checkStatusChanged();
}
}

// Simple helper class for an animation with a single value.
class ValueAnimation<T> extends AnimationPerformance {
ValueAnimation({AnimatedValue<T> variable, Duration duration}) :
super(variable: variable, duration: duration);

AnimatedValue<T> get variable => _variable as AnimatedValue<T>;
void set variable(AnimatedValue<T> v) { _variable = v; }

T get value => variable.value;
}
14 changes: 6 additions & 8 deletions sky/packages/sky/lib/widgets/scrollable.dart
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@ import 'dart:sky' as sky;

import 'package:newton/newton.dart';
import 'package:sky/animation/animated_simulation.dart';
import 'package:sky/animation/animated_value.dart';
import 'package:sky/animation/animation_performance.dart';
import 'package:sky/animation/scroll_behavior.dart';
import 'package:sky/rendering/box.dart';
Expand Down Expand Up @@ -44,7 +43,7 @@ abstract class Scrollable extends StatefulComponent {
ScrollDirection scrollDirection;

AnimatedSimulation _toEndAnimation; // See _startToEndAnimation()
AnimationPerformance _toOffsetAnimation; // Started by scrollTo()
ValueAnimation<double> _toOffsetAnimation; // Started by scrollTo()

void initState() {
_toEndAnimation = new AnimatedSimulation(_tickScrollOffset);
Expand Down Expand Up @@ -86,11 +85,11 @@ abstract class Scrollable extends StatefulComponent {
);
}

void _startToOffsetAnimation(double newScrollOffset, AnimationPerformance animation) {
void _startToOffsetAnimation(double newScrollOffset, ValueAnimation<double> animation) {
_stopToEndAnimation();
_stopToOffsetAnimation();

(animation.variable as AnimatedValue<double>)
animation.variable
..begin = scrollOffset
..end = newScrollOffset;

Expand All @@ -102,8 +101,7 @@ abstract class Scrollable extends StatefulComponent {
}

void _updateToOffsetAnimation() {
AnimatedValue<double> offset = _toOffsetAnimation.variable;
scrollTo(offset.value);
scrollTo(_toOffsetAnimation.value);
}

void _updateToOffsetAnimationStatus(AnimationStatus status) {
Expand Down Expand Up @@ -139,7 +137,7 @@ abstract class Scrollable extends StatefulComponent {
super.didUnmount();
}

bool scrollTo(double newScrollOffset, { AnimationPerformance animation }) {
bool scrollTo(double newScrollOffset, { ValueAnimation<double> animation }) {
if (newScrollOffset == _scrollOffset)
return false;

Expand Down Expand Up @@ -233,7 +231,7 @@ Scrollable findScrollableAncestor({ Widget target }) {
return ancestor;
}

bool ensureWidgetIsVisible(Widget target, { AnimationPerformance animation }) {
bool ensureWidgetIsVisible(Widget target, { ValueAnimation<double> animation }) {
assert(target.mounted);
assert(target.root is RenderBox);

Expand Down
10 changes: 5 additions & 5 deletions sky/packages/sky/lib/widgets/tabs.dart
Original file line number Diff line number Diff line change
Expand Up @@ -406,15 +406,15 @@ class TabBar extends Scrollable {

Size _tabBarSize;
List<double> _tabWidths;
AnimationPerformance _indicatorAnimation;
AnimationPerformance _scrollAnimation;
ValueAnimation<Rect> _indicatorAnimation;
ValueAnimation<double> _scrollAnimation;

void initState() {
super.initState();
_indicatorAnimation = new AnimationPerformance()
_indicatorAnimation = new ValueAnimation<Rect>()
..duration = _kTabBarScroll
..variable = new AnimatedRect(null, curve: ease);
_scrollAnimation = new AnimationPerformance()
_scrollAnimation = new ValueAnimation<double>()
..duration = _kTabBarScroll
..variable = new AnimatedValue<double>(0.0, curve: ease);
}
Expand All @@ -430,7 +430,7 @@ class TabBar extends Scrollable {
scrollBehavior.isScrollable = source.isScrollable;
}

AnimatedRect get _indicatorRect => _indicatorAnimation.variable as AnimatedRect;
AnimatedRect get _indicatorRect => _indicatorAnimation.variable;

void _startIndicatorAnimation(int fromTabIndex, int toTabIndex) {
_indicatorRect
Expand Down

0 comments on commit 5bad614

Please sign in to comment.