import 'package:flutter/material.dart'; import 'package:flutter/scheduler.dart'; import 'dart:async'; void main() => runApp(MyApp()); class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { return MaterialApp(home: Scaffold(body: App())); } } class App extends StatefulWidget { @override AppState createState() => AppState(); } class AppState extends State with SingleTickerProviderStateMixin { AnimationController _controller; String param; double tm; @override void initState() { super.initState(); param = "beginning"; _controller = AnimationController( duration: Duration(seconds: 3), vsync: this, )..addListener(() => contrVal()); } double timeM(double scene) { int time = 10; return scene / time; } @override void dispose() { _controller?.dispose(); super.dispose(); } Future _startAnim() async { try { await _controller.forward().orCancel; await _controller.reverse().orCancel; } on TickerCanceled { print('welp we fucked'); } } contrVal() { setState(() { tm = _controller.value; if (_controller.value >= 0.2) param = 'two seconds'; if (_controller.value >= 0.5) param = "five seconds"; if (_controller.value >= 1) param = "ten seconds"; }); } @override Widget build(BuildContext context) { return Material( child: Stack( fit: StackFit.expand, children: [ // Image.asset( // 'assets/scrns/scrn1.png', // fit: BoxFit.cover, // ), ColorFiltered( colorFilter: ColorFilter.mode(Colors.black.withOpacity(0.8), BlendMode.srcOut), // This one will create the magic child: GestureDetector( onTap: () { _startAnim(); }, child: Stack( fit: StackFit.expand, children: [ Container( decoration: BoxDecoration( color: Colors.black, backgroundBlendMode: BlendMode .dstOut), // This one will handle background + difference out ), // Align( // alignment: Alignment.topCenter, // child: Container( // margin: const EdgeInsets.only(top: 30), // height: 200, // width: 200, // decoration: BoxDecoration( // color: Colors.red, // // borderRadius: BorderRadius.circular(100), // ), // ), // ), GestureDetector( onTap: () { _startAnim(); }, child: MovHoleScrn1( controller: _controller, ), // Center( // child: Text( // 'Hello World', // style: TextStyle(fontSize: 65, fontWeight: FontWeight.w600), // ), ) ], ), ), ) ], ), ); } } class MovHoleScrn1 extends StatelessWidget { MovHoleScrn1({Key key, this.controller}) : width1 = Tween(begin: 10.0, end: 300.0).animate(CurvedAnimation( parent: controller, curve: Interval(0.1, 0.5, curve: Curves.fastOutSlowIn))), height1 = Tween(begin: 10.0, end: 200.0).animate( CurvedAnimation( parent: controller, curve: Interval(0.1, 0.5, curve: Curves.fastOutSlowIn))), movement1 = EdgeInsetsTween( begin: EdgeInsets.only(bottom: 1, left: 1), end: EdgeInsets.only(bottom: 300.0, left: 1.0)) .animate(CurvedAnimation( parent: controller, curve: Interval(0.1, 0.5, curve: Curves.fastOutSlowIn))), width2 = Tween(begin: 300.0, end: 300.0).animate( CurvedAnimation( parent: controller, curve: Interval(0.5, 1, curve: Curves.fastOutSlowIn))), height2 = Tween(begin: 200.0, end: 200.0).animate( CurvedAnimation( parent: controller, curve: Interval(0.5, 1, curve: Curves.fastOutSlowIn))), movement2 = EdgeInsetsTween( begin: EdgeInsets.only(bottom: 1, left: 1), end: EdgeInsets.only(bottom: 100.0, left: 1.0)) .animate(CurvedAnimation( parent: controller, curve: Interval(0.5, 1, curve: Curves.fastOutSlowIn))), super(key: key); final Animation width1; final Animation height1; final Animation movement1; final Animation width2; final Animation height2; final Animation movement2; final Animation controller; final Color color = Colors.black; Widget build(BuildContext context) { return AnimatedBuilder( animation: controller, builder: (BuildContext context, Widget child) { return movement1.isCompleted ? Container( padding: movement1.value, alignment: Alignment.center, child: Container( width: width1.value, height: height1.value, color: color, )) : Container( padding: movement2.value, alignment: Alignment.center, child: Container( width: width2.value, height: height2.value, color: color, )); }); } }