Add initialDelay to AnimationGenerator and add Animation class.

This patch allows for an initial delay before an animation begins and also adds an Animation class which encapsulates a value which is long-lived, can be explicitly set and also animated from its current value to another value.

BUG=
R=abarth@chromium.org

Review URL: https://codereview.chromium.org/994143002
This commit is contained in:
Rafael Weinstein 2015-03-10 12:22:15 -07:00
parent 42b7a2716d
commit f7cdfda454

View File

@ -6,39 +6,34 @@ const double _kBaseSettleDurationMS = 246.0;
const double _kMaxSettleDurationMS = 600.0; const double _kMaxSettleDurationMS = 600.0;
const Cubic _kAnimationCurve = easeOut; const Cubic _kAnimationCurve = easeOut;
class DrawerAnimation { class DrawerAnimation extends Animation {
Stream<double> get onPositionChanged => _controller.stream; Stream<double> get onPositionChanged => onValueChanged;
StreamController _controller; bool get _isMostlyClosed => value <= -_kWidth / 2;
AnimationGenerator _animation;
double _position;
bool get _isAnimating => _animation != null;
bool get _isMostlyClosed => _position <= -_kWidth / 2;
DrawerAnimation() { DrawerAnimation() {
_controller = new StreamController(sync: true); value = -_kWidth;
_setPosition(-_kWidth);
} }
void toggle(_) => _isMostlyClosed ? _open() : _close(); void toggle(_) => _isMostlyClosed ? _open() : _close();
void handleMaskTap(_) => _close(); void handleMaskTap(_) => _close();
void handlePointerDown(_) => _cancelAnimation(); void handlePointerDown(_) => stop();
void handlePointerMove(sky.PointerEvent event) { void handlePointerMove(sky.PointerEvent event) {
assert(_animation == null); assert(!isAnimating);
_setPosition(_position + event.dx); value = math.min(0.0, math.max(value + event.dx, -_kWidth));
} }
void handlePointerUp(_) { void handlePointerUp(_) {
if (!_isAnimating) if (!isAnimating)
_settle(); _settle();
} }
void handlePointerCancel(_) { void handlePointerCancel(_) {
if (!_isAnimating) if (!isAnimating)
_settle(); _settle();
} }
@ -48,35 +43,12 @@ class DrawerAnimation {
void _settle() => _isMostlyClosed ? _close() : _open(); void _settle() => _isMostlyClosed ? _close() : _open();
void _setPosition(double value) {
_position = math.min(0.0, math.max(value, -_kWidth));
_controller.add(_position);
}
void _cancelAnimation() {
if (_animation != null) {
_animation.cancel();
_animation = null;
}
}
void _animate(double duration, double begin, double end, Curve curve) {
_cancelAnimation();
_animation = new AnimationGenerator(duration, begin: begin, end: end,
curve: curve);
_animation.onTick.listen(_setPosition, onDone: () {
_animation = null;
});
}
void _animateToPosition(double targetPosition) { void _animateToPosition(double targetPosition) {
double distance = (targetPosition - _position).abs(); double distance = (targetPosition - value).abs();
if (distance != 0) { if (distance != 0) {
double targetDuration = distance / _kWidth * _kBaseSettleDurationMS; double targetDuration = distance / _kWidth * _kBaseSettleDurationMS;
double duration = math.min(targetDuration, _kMaxSettleDurationMS); double duration = math.min(targetDuration, _kMaxSettleDurationMS);
_animate(duration, _position, targetPosition, _kAnimationCurve); animateTo(targetPosition, duration, curve: _kAnimationCurve);
} }
} }
@ -87,10 +59,10 @@ class DrawerAnimation {
return; return;
double targetPosition = direction < 0.0 ? -_kWidth : 0.0; double targetPosition = direction < 0.0 ? -_kWidth : 0.0;
double distance = (targetPosition - _position).abs(); double distance = (targetPosition - value).abs();
double duration = distance / velocityX; double duration = distance / velocityX;
_animate(duration, _position, targetPosition, linear); animateTo(targetPosition, duration, curve: linear);
} }
} }