Last active
October 27, 2020 10:38
-
-
Save agungsb/2e7b00ac6bfc31c5a4fe9df084d61008 to your computer and use it in GitHub Desktop.
Create A Simple Animated FloatingActionButton in Flutter
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import 'package:flutter/material.dart'; | |
class FancyFab extends StatefulWidget { | |
final Function() onPressed; | |
final String tooltip; | |
final IconData icon; | |
FancyFab({this.onPressed, this.tooltip, this.icon}); | |
@override | |
_FancyFabState createState() => _FancyFabState(); | |
} | |
class _FancyFabState extends State<FancyFab> | |
with SingleTickerProviderStateMixin { | |
bool isOpened = false; | |
AnimationController _animationController; | |
Animation<Color> _buttonColor; | |
Animation<double> _animateIcon; | |
Animation<double> _translateButton; | |
Curve _curve = Curves.easeOut; | |
double _fabHeight = 56.0; | |
@override | |
initState() { | |
_animationController = | |
AnimationController(vsync: this, duration: Duration(milliseconds: 500)) | |
..addListener(() { | |
setState(() {}); | |
}); | |
_animateIcon = | |
Tween<double>(begin: 0.0, end: 1.0).animate(_animationController); | |
_buttonColor = ColorTween( | |
begin: Colors.blue, | |
end: Colors.red, | |
).animate(CurvedAnimation( | |
parent: _animationController, | |
curve: Interval( | |
0.00, | |
1.00, | |
curve: Curves.linear, | |
), | |
)); | |
_translateButton = Tween<double>( | |
begin: _fabHeight, | |
end: -14.0, | |
).animate(CurvedAnimation( | |
parent: _animationController, | |
curve: Interval( | |
0.0, | |
0.75, | |
curve: _curve, | |
), | |
)); | |
super.initState(); | |
} | |
@override | |
dispose() { | |
_animationController.dispose(); | |
super.dispose(); | |
} | |
animate() { | |
if (!isOpened) { | |
_animationController.forward(); | |
} else { | |
_animationController.reverse(); | |
} | |
isOpened = !isOpened; | |
} | |
Widget add() { | |
return Container( | |
child: FloatingActionButton( | |
onPressed: null, | |
tooltip: 'Add', | |
child: Icon(Icons.add), | |
), | |
); | |
} | |
Widget image() { | |
return Container( | |
child: FloatingActionButton( | |
onPressed: null, | |
tooltip: 'Image', | |
child: Icon(Icons.image), | |
), | |
); | |
} | |
Widget inbox() { | |
return Container( | |
child: FloatingActionButton( | |
onPressed: null, | |
tooltip: 'Inbox', | |
child: Icon(Icons.inbox), | |
), | |
); | |
} | |
Widget toggle() { | |
return Container( | |
child: FloatingActionButton( | |
backgroundColor: _buttonColor.value, | |
onPressed: animate, | |
tooltip: 'Toggle', | |
child: AnimatedIcon( | |
icon: AnimatedIcons.menu_close, | |
progress: _animateIcon, | |
), | |
), | |
); | |
} | |
@override | |
Widget build(BuildContext context) { | |
return Column( | |
mainAxisAlignment: MainAxisAlignment.end, | |
children: <Widget>[ | |
Transform( | |
transform: Matrix4.translationValues( | |
0.0, | |
_translateButton.value * 3.0, | |
0.0, | |
), | |
child: add(), | |
), | |
Transform( | |
transform: Matrix4.translationValues( | |
0.0, | |
_translateButton.value * 2.0, | |
0.0, | |
), | |
child: image(), | |
), | |
Transform( | |
transform: Matrix4.translationValues( | |
0.0, | |
_translateButton.value, | |
0.0, | |
), | |
child: inbox(), | |
), | |
toggle(), | |
], | |
); | |
} | |
} |
Hi there,
I want to wrap this expandable menu in side a container with rounded corners.
Can you suggest and the edits?
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
#broo, kalau supaya children icon" nya turunnya ke bawah bkn ke atas gimana ya ??
terimakasih