| <!-- |
| // 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 src="sky-element.sky" /> |
| |
| <sky-element> |
| <template> |
| <style> |
| :host { |
| position: absolute; |
| pointer-events: none; |
| overflow: hidden; |
| top: 0; |
| left: 0; |
| bottom: 0; |
| right: 0; |
| } |
| |
| #splash { |
| position: absolute; |
| background-color: rgba(0, 0, 0, 0.4); |
| border-radius: 0; |
| top: 0; |
| left: 0; |
| height: 0; |
| width: 0; |
| } |
| </style> |
| <div id="splash" /> |
| </template> |
| <script> |
| import "../animation/controller.dart"; |
| import "../animation/curves.dart"; |
| import "../animation/timer.dart"; |
| import "dart:math" as math; |
| import "dart:sky"; |
| import "dart:async"; |
| |
| const double _kSplashSize = 400.0; |
| const double _kSplashDuration = 500.0; |
| |
| @Tagname('sky-ink-splash') |
| class SkyInkSplash extends SkyElement implements AnimationDelegate { |
| AnimationController _animation; |
| Element _splash; |
| double _offsetX; |
| double _offsetY; |
| Completer<SkyInkSplash> _completer = new Completer(); |
| |
| SkyInkSplash() { |
| _animation = new AnimationController(this); |
| } |
| |
| void shadowRootReady() { |
| _splash = shadowRoot.getElementById('splash'); |
| } |
| |
| Future start(double x, double y, ClientRect rect) { |
| _offsetX = x - rect.left; |
| _offsetY = y - rect.top; |
| _animation.start( |
| begin: 0.0, |
| end: _kSplashSize, |
| duration: _kSplashDuration, |
| curve: easeOut); |
| return _completer.future; |
| } |
| |
| void _done() { |
| remove(); |
| _completer.complete(this); |
| } |
| |
| void cancel() { |
| // TODO(eseidel): Should fade away instead of stopping immediately. |
| _animation.stop(); |
| _done(); |
| } |
| |
| void updateAnimation(double p) { |
| if (p == _kSplashSize) { |
| _done(); |
| return; |
| } |
| _splash.style['top'] = '${_offsetY - p/2}px'; |
| _splash.style['left'] = '${_offsetX - p/2}px'; |
| _splash.style['width'] = '${p}px'; |
| _splash.style['height'] = '${p}px'; |
| _splash.style['border-radius'] = '${p}px'; |
| _splash.style['opacity'] = '${1.0 - (p / _kSplashSize)}'; |
| } |
| } |
| |
| _init(script) => register(script, SkyInkSplash); |
| </script> |
| </sky-element> |