mirror of
https://github.com/flutter/flutter.git
synced 2025-06-03 00:51:18 +00:00
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:
parent
42b7a2716d
commit
f7cdfda454
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user