// 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:async'; import 'dart:sky' as sky; import 'dart:sky' show Point, Offset, Color, Paint; import 'package:sky/animation/animated_value.dart'; import 'package:sky/animation/animation_performance.dart'; import 'package:sky/animation/curves.dart'; const Duration _kShowDuration = const Duration(milliseconds: 300); const Duration _kHideDuration = const Duration(milliseconds: 200); const Color _kOuterColor = const Color(0xFFFFFFFF); const Color _kInnerColor = const Color(0xFFFFFFFF); const double _kMaxOpacity = 0.2; int _roundOpacity(double opacity) { return (255 * opacity).round(); } class RadialReaction { RadialReaction({ this.center, this.radius, Point startPosition }) { _outerOpacity = new AnimatedValue<double>(0.0, end: _kMaxOpacity, curve: easeOut); _innerCenter = new AnimatedValue<Point>(startPosition, end: center, curve: easeOut); _innerRadius = new AnimatedValue<double>(0.0, end: radius, curve: easeOut); _showPerformance = new AnimationPerformance() ..addVariable(_outerOpacity) ..addVariable(_innerCenter) ..addVariable(_innerRadius) ..duration = _kShowDuration; _fade = new AnimatedValue(1.0, end: 0.0, curve: easeIn); _hidePerformance = new AnimationPerformance() ..addVariable(_fade) ..duration =_kHideDuration; } final Point center; final double radius; AnimationPerformance _showPerformance; AnimatedValue<double> _outerOpacity; AnimatedValue<Point> _innerCenter; AnimatedValue<double> _innerRadius; Future _showComplete; AnimationPerformance _hidePerformance; AnimatedValue<double> _fade; void show() { _showComplete = _showPerformance.forward(); } Future hide() async { await _showComplete; await _hidePerformance.forward(); } void addListener(Function listener) { _showPerformance.addListener(listener); _hidePerformance.addListener(listener); } final Paint _outerPaint = new Paint(); final Paint _innerPaint = new Paint(); void paint(sky.Canvas canvas, Offset offset) { _outerPaint.color = _kOuterColor.withAlpha(_roundOpacity(_outerOpacity.value * _fade.value)); canvas.drawCircle(center + offset, radius, _outerPaint); _innerPaint.color = _kInnerColor.withAlpha(_roundOpacity(_kMaxOpacity * _fade.value)); canvas.drawCircle(_innerCenter.value + offset, _innerRadius.value, _innerPaint); } }