OLD | NEW |
(Empty) | |
| 1 part of angular.animate; |
| 2 |
| 3 /** |
| 4 * A [LoopedAnimation] is used with the [AnimationLoop] to drive window |
| 5 * animation frame animations. This provides hooks for dom reads and updates so |
| 6 * that they can be batched together to prevent excessive dom recalculations |
| 7 * when running multiple animations. |
| 8 */ |
| 9 abstract class LoopedAnimation implements Animation { |
| 10 |
| 11 /** |
| 12 * This is used to batch dom read operations to prevent excessive |
| 13 * recalculations when dom is modified. |
| 14 * |
| 15 * [timeInMs] is the time since the last animation frame. |
| 16 */ |
| 17 void read(num timeInMs) { } |
| 18 |
| 19 /** |
| 20 * Occurs every animation frame. Return false to stop receiving animation |
| 21 * frame updates. Detach will be called after [update] returns false. |
| 22 * |
| 23 * [timeInMs] is the time since the last animation frame. |
| 24 */ |
| 25 bool update(num timeInMs) { return false; } |
| 26 } |
| 27 |
| 28 /** |
| 29 * This is a proxy class for dealing with a set of elements where the 'same' |
| 30 * or similar animations are being run on them and it's more convenient to have |
| 31 * a merged animation to control and listen to a set of animations. |
| 32 */ |
| 33 class AnimationList extends Animation { |
| 34 final List<Animation> _animations; |
| 35 Future<AnimationResult> _onCompleted; |
| 36 |
| 37 /** |
| 38 * [OnCompleted] executes once all the OnCompleted futures for each of the |
| 39 * animations completes. |
| 40 * |
| 41 * if every animation returns [AnimationResult.COMPLETED], |
| 42 * [AnimationResult.COMPLETED] will be returned. |
| 43 * if any animation was [AnimationResult.COMPLETED_IGNORED] instead, even if |
| 44 * some animations were completed, [AnimationResult.COMPLETED_IGNORED] will |
| 45 * be returned. |
| 46 * if any animation was [AnimationResult.CANCELED], the result will be |
| 47 * [AnimationResult.CANCELED]. |
| 48 */ |
| 49 Future<AnimationResult> get onCompleted { |
| 50 if (_onCompleted == null) { |
| 51 _onCompleted = Future.wait(_animations.map((x) => x.onCompleted)) |
| 52 .then((results) { |
| 53 var rtrn = AnimationResult.COMPLETED; |
| 54 for (var result in results) { |
| 55 if (result == AnimationResult.CANCELED) |
| 56 return AnimationResult.CANCELED; |
| 57 if (result == AnimationResult.COMPLETED_IGNORED) |
| 58 rtrn = result; |
| 59 } |
| 60 return rtrn; |
| 61 }); |
| 62 } |
| 63 |
| 64 return _onCompleted; |
| 65 } |
| 66 |
| 67 /// track and create a new [Animation] that acts as a proxy to a list of |
| 68 /// existing [Animation]s. |
| 69 AnimationList(this._animations); |
| 70 |
| 71 /// For each of the tracked [Animation]s, call complete(). |
| 72 void complete() { |
| 73 for (var animation in _animations) { |
| 74 animation.complete(); |
| 75 } |
| 76 } |
| 77 |
| 78 /// For each of the tracked [Animation]s, call cancel(). |
| 79 void cancel() { |
| 80 for (var animation in _animations) { |
| 81 animation.cancel(); |
| 82 } |
| 83 } |
| 84 } |
| 85 |
| 86 Animation _animationFromList(Iterable<Animation> animations) { |
| 87 if (animations == null) { |
| 88 return new NoOpAnimation(); |
| 89 } |
| 90 |
| 91 List<Animation> list = animations.toList(); |
| 92 |
| 93 if (list.length == 0) { |
| 94 return new NoOpAnimation(); |
| 95 } |
| 96 if (list.length == 1) { |
| 97 return list.first; |
| 98 } |
| 99 return new AnimationList(list); |
| 100 } |
OLD | NEW |