| // Copyright 2015 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| import "dart:math" as math; |
| import "dart:sky" as sky; |
| |
| abstract class AnimationDelegate { |
| void updateAnimation(double t); |
| } |
| |
| class AnimationTimer { |
| final AnimationDelegate _delegate; |
| double _startTime = 0.0; |
| double _duration = 0.0; |
| int _animationId = 0; |
| |
| AnimationTimer(this._delegate); |
| |
| void start(double duration) { |
| if (_animationId != 0) |
| stop(); |
| _duration = duration; |
| _scheduleTick(); |
| } |
| |
| void stop() { |
| sky.window.cancelAnimationFrame(_animationId); |
| _startTime = 0.0; |
| _duration = 0.0; |
| _animationId = 0; |
| } |
| |
| void _scheduleTick() { |
| assert(_animationId == 0); |
| _animationId = sky.window.requestAnimationFrame(_tick); |
| } |
| |
| void _tick(double timeStamp) { |
| _animationId = 0; |
| if (_startTime == 0.0) |
| _startTime = timeStamp; |
| double elapsedTime = timeStamp - _startTime; |
| double t = math.max(0.0, math.min(1.0, elapsedTime / _duration)); |
| if (t < 1.0) |
| _scheduleTick(); |
| else |
| stop(); |
| _delegate.updateAnimation(t); |
| } |
| } |