A simple & beautiful customizable Flutter animation to use as a Splash Screen !
####Github : https://github.com/MedRedha
#Enjoy 🎉
A simple & beautiful customizable Flutter animation to use as a Splash Screen !
####Github : https://github.com/MedRedha
#Enjoy 🎉
import 'dart:async'; | |
import 'package:flutter/material.dart'; | |
void main() => runApp(SplashScreen()); | |
class SplashScreen extends StatefulWidget { | |
@override | |
State<StatefulWidget> createState() => AnimatedSplash(); | |
} | |
class AnimatedSplash extends State<SplashScreen> | |
with SingleTickerProviderStateMixin { | |
bool _visible = true; | |
double _scale; | |
AnimationController _controller; | |
FlutterLogoStyle _logoStyle = FlutterLogoStyle.markOnly; | |
@override | |
void initState() { | |
_controller = AnimationController( | |
vsync: this, | |
duration: Duration( | |
milliseconds: 200, | |
), | |
lowerBound: 0.0, | |
upperBound: 0.1, | |
)..addListener(() { | |
setState(() {}); | |
}); | |
super.initState(); | |
} | |
AnimatedSplash() { | |
Timer(const Duration(seconds: 2), () { | |
setState(() { | |
_logoStyle = FlutterLogoStyle.horizontal; | |
}); | |
}); | |
} | |
@override | |
void dispose() { | |
super.dispose(); | |
_controller.dispose(); | |
} | |
@override | |
Widget build(BuildContext context) { | |
_scale = 1 - _controller.value; | |
return MaterialApp( | |
debugShowCheckedModeBanner: false, | |
home: Scaffold( | |
appBar: AppBar( | |
centerTitle: true, | |
title: RichText( | |
textAlign: TextAlign.center, | |
text: TextSpan( | |
text: 'Animated Splash by ', | |
style: TextStyle(color: Colors.white, fontSize: 20), | |
children: <TextSpan>[ | |
TextSpan( | |
text: 'Med Redha', | |
style: new TextStyle(fontWeight: FontWeight.bold), | |
), | |
], | |
), | |
), | |
flexibleSpace: Container( | |
decoration: BoxDecoration( | |
gradient: LinearGradient( | |
begin: Alignment.topLeft, | |
end: Alignment.bottomRight, | |
colors: <Color>[Colors.red, Colors.blue])), | |
), | |
backgroundColor: Colors.transparent, | |
elevation: 0.0, | |
), | |
body: Center( | |
child: Column( | |
mainAxisAlignment: MainAxisAlignment.center, | |
children: <Widget>[ | |
Container( | |
margin: new EdgeInsets.only(bottom: 15.0), | |
child: AnimatedOpacity( | |
opacity: _visible ? 1.0 : 0.0, | |
duration: Duration(milliseconds: 500), | |
child: Container( | |
child: new FlutterLogo( | |
size: 300.0, | |
style: _logoStyle, | |
), | |
), | |
), | |
), | |
SizedBox( | |
height: 10.0, | |
), | |
Container( | |
child: GestureDetector( | |
onTapDown: _onTapDown, | |
onTapUp: _onTapUp, | |
child: Transform.scale( | |
scale: _scale, | |
child: _animatedButtonUI, | |
), | |
), | |
), | |
], | |
), | |
), | |
), | |
); | |
} | |
Widget get _animatedButtonUI => Container( | |
margin: new EdgeInsets.only(top: 15.0), | |
height: 50, | |
width: 200, | |
decoration: BoxDecoration( | |
borderRadius: BorderRadius.circular(100.0), | |
color: Colors.blue, | |
boxShadow: [ | |
BoxShadow( | |
color: Color(0x80000000), | |
blurRadius: 30.0, | |
offset: Offset(0.0, 5.0), | |
), | |
], | |
), | |
child: Center( | |
child: Text( | |
'Hide/Show', | |
style: TextStyle(fontSize: 15.0, color: Colors.white), | |
), | |
), | |
); | |
void _onTapDown(TapDownDetails details) { | |
_controller.forward(); | |
setState(() { | |
_visible = !_visible; | |
}); | |
} | |
void _onTapUp(TapUpDetails details) { | |
_controller.reverse(); | |
} | |
} |