| // 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 'package:flutter/animation.dart'; |
| import 'package:flutter/material.dart'; |
| import 'package:flutter/rendering.dart'; |
| |
| final List<Map<int, Color>> _kColors = <Map<int, Color>>[ |
| Colors.amber, |
| Colors.yellow, |
| Colors.blue, |
| Colors.purple, |
| Colors.indigo, |
| Colors.deepOrange, |
| ]; |
| |
| class SmoothBlock extends StatefulComponent { |
| SmoothBlock({ this.color }); |
| |
| final Map<int, Color> color; |
| |
| SmoothBlockState createState() => new SmoothBlockState(); |
| } |
| |
| class CardTransition extends StatelessComponent { |
| CardTransition({ |
| this.child, |
| this.performance, |
| this.x, |
| this.opacity, |
| this.scale |
| }); |
| |
| final Widget child; |
| final Performance performance; |
| final AnimatedValue<double> x; |
| final AnimatedValue<double> opacity; |
| final AnimatedValue<double> scale; |
| |
| Widget build(BuildContext context) { |
| |
| return new BuilderTransition( |
| performance: performance, |
| variables: <AnimatedValue<double>>[x, opacity, scale], |
| builder: (BuildContext context) { |
| Matrix4 transform = new Matrix4.identity() |
| ..translate(x.value) |
| ..scale(scale.value, scale.value); |
| return new Opacity( |
| opacity: opacity.value, |
| child: new Transform( |
| transform: transform, |
| child: child |
| ) |
| ); |
| } |
| ); |
| } |
| } |
| |
| class SmoothBlockState extends State<SmoothBlock> { |
| |
| double _height = 100.0; |
| |
| Widget _handleEnter(PerformanceView performance, Widget child) { |
| return new CardTransition( |
| x: new AnimatedValue<double>(-200.0, end: 0.0, curve: Curves.ease), |
| opacity: new AnimatedValue<double>(0.0, end: 1.0, curve: Curves.ease), |
| scale: new AnimatedValue<double>(0.8, end: 1.0, curve: Curves.ease), |
| performance: performance, |
| child: child |
| ); |
| } |
| |
| Widget _handleExit(PerformanceView performance, Widget child) { |
| return new CardTransition( |
| x: new AnimatedValue<double>(0.0, end: 200.0, curve: Curves.ease), |
| opacity: new AnimatedValue<double>(1.0, end: 0.0, curve: Curves.ease), |
| scale: new AnimatedValue<double>(1.0, end: 0.8, curve: Curves.ease), |
| performance: performance, |
| child: child |
| ); |
| } |
| |
| Widget build(BuildContext context) { |
| return new GestureDetector( |
| onTap: () { |
| setState(() { |
| _height = _height == 100.0 ? 200.0 : 100.0; |
| }); |
| }, |
| child: new EnterExitTransition( |
| duration: const Duration(milliseconds: 1500), |
| onEnter: _handleEnter, |
| onExit: _handleExit, |
| child: new Container( |
| key: new ValueKey(_height), |
| height: _height, |
| decoration: new BoxDecoration(backgroundColor: config.color[_height.floor() * 4]) |
| ) |
| ) |
| ); |
| } |
| } |
| |
| class SmoothResizeDemo extends StatelessComponent { |
| Widget build(BuildContext context) { |
| return new Block(_kColors.map((Map<int, Color> color) => new SmoothBlock(color: color)).toList()); |
| } |
| } |
| |
| void main() { |
| runApp(new SmoothResizeDemo()); |
| } |