在扩展类型和普通类型之间颤动动画 FAB
flutter animate FAB between extended and normal type
我想实现一个浮动操作按钮,它在扩展尺寸和正常尺寸之间进行动画处理,如在 Android Messenger 应用程序中所见:https://blog.usejournal.com/expand-collapse-fab-on-scrolling-like-googles-message-app-484df2d9d246
我怎样才能做到这一点?我目前正在研究使用 AnimatedSwitcher、FloatingActionButton.extended 和 FloatingActionButton 小部件。
This is my implementation using AnimatedSwitcher
.
import 'package:flutter/material.dart';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
debugShowCheckedModeBanner: false,
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: MyHomePage(),
);
}
}
class MyHomePage extends StatefulWidget {
@override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
bool isIcon = false;
Widget _myWidget = FloatingActionButton(
key: UniqueKey(),
onPressed: () {},
child: Icon(Icons.message),
);
void _d() {
setState(() {
_myWidget = isIcon
? FloatingActionButton(
mini: true,
key: UniqueKey(),
onPressed: () {},
child: Icon(Icons.messsage),
)
: FloatingActionButton.extended(
key: UniqueKey(),
onPressed: () {},
icon: Icon(Icons.message),
label: Text("Start chat"),
);
isIcon = !isIcon;
});
}
Widget build(context) {
return Scaffold(
floatingActionButton: isIcon
? AnimatedSwitcher(
duration: Duration(
milliseconds: 100,
),
transitionBuilder: (Widget child, Animation<double> animation) {
return FadeTransition(
child: child,
opacity:
animation.drive(CurveTween(curve: Curves.elasticOut)),
);
},
child: _myWidget,
)
: AnimatedSwitcher(
duration: Duration(
milliseconds: 100,
),
transitionBuilder: (Widget child, Animation<double> animation) {
return FadeTransition(
child: child,
opacity:
animation.drive(CurveTween(curve: Curves.easeOutQuint)),
);
},
child: _myWidget,
),
appBar: AppBar(),
body: FlatButton(
onPressed: () {
_d();
},
child: Text('Press here to change FAB')));
}
}
This is my implementation by keeping the same Hero
tag for the two FABs.
import 'package:flutter/material.dart';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
debugShowCheckedModeBanner: false,
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: MyHomePage(),
);
}
}
class MyHomePage extends StatefulWidget {
@override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
bool isIcon = false;
Widget _myWidget = FloatingActionButton(
heroTag: 'd',
key: UniqueKey(),
onPressed: () {},
child: Icon(Icons.message),
);
void _d() {
setState(() {
_myWidget = isIcon
? FloatingActionButton(
heroTag: 'b',
key: UniqueKey(),
onPressed: () {},
child: Icon(Icons.message),
)
: FloatingActionButton.extended(
heroTag: 'b',
key: UniqueKey(),
onPressed: () {},
icon: Icon(Icons.mesage),
label: Text("Start chat"),
);
isIcon = !isIcon;
});
}
Widget build(context) {
return Scaffold(
floatingActionButton: _myWidget,
appBar: AppBar(),
body: FlatButton(
onPressed: () {
_d();
},
child: Text('Press here to change FAB')));
}
}
两者给出的结果不同,请根据需要尝试使用不同的动画曲线。改变 child 的大小,设置 Shape 边框,或将 mini:
设置为 true 以获得更好看的结果。
这是我做的
(your widget should be Stateful for this to work)
首先添加一个布尔值isExtended
到你的Widget
bool isExtended = false;
然后添加一个新函数来切换你的isExtended
值
的状态
void _switchActionBar() {
setState(
() {
isExtended = !isExtended;
},
);
}
最后像那样初始化 FloatingActionButon
FloatingActionButton.extended(
isExtended: isExtended,
onPressed: (){},
label: isExtended
? Row(
children: <Widget>[
Padding(
padding: const EdgeInsets.only(right: 8.0),
child: Icon(Icons.add),
),
Text("Start Editing"),
],
)
: Icon(Icons.add),
);
就是这样,每当您调用 _switchActionBar()
时,您的浮动操作按钮将在扩展和正常之间进行动画处理。
只需在 FAB.extended 和普通 FAB 之间切换
从普通FAB切换到扩展FAB时有动画,反之没有。
isextend
? FloatingActionButton.extended(
onPressed: _switchActionBar,
label: Text("Text"))
: FloatingActionButton(
onPressed: _switchActionBar,
child: Icon(Icons.add),
)
我能够使用带有 SizeTransition
和 FadeTransition
的 AnimatedSwitcher
让它工作。请看下面的代码。
floatingActionButton:
FloatingActionButton.extended(
onPressed: _onFabPress,
label: AnimatedSwitcher(
duration: Duration(seconds: 1),
transitionBuilder: (Widget child, Animation<double> animation) =>
FadeTransition(
opacity: animation,
child: SizeTransition(child:
child,
sizeFactor: animation,
axis: Axis.horizontal,
),
) ,
child: isExtended?
Icon(Icons.arrow_forward):
Row(
children: [
Padding(
padding: const EdgeInsets.only(right: 4.0),
child: Icon(Icons.add),
),
Text("Add To Order")
],
),
)
)
只有图标的视图不是完全圆形的,但我相信可以通过调整填充来解决这个问题。
有一个包可以实现您期望的行为。这是https://pub.dev/packages/flutter_scrolling_fab_animated
我想实现一个浮动操作按钮,它在扩展尺寸和正常尺寸之间进行动画处理,如在 Android Messenger 应用程序中所见:https://blog.usejournal.com/expand-collapse-fab-on-scrolling-like-googles-message-app-484df2d9d246
我怎样才能做到这一点?我目前正在研究使用 AnimatedSwitcher、FloatingActionButton.extended 和 FloatingActionButton 小部件。
This is my implementation using
AnimatedSwitcher
.
import 'package:flutter/material.dart';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
debugShowCheckedModeBanner: false,
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: MyHomePage(),
);
}
}
class MyHomePage extends StatefulWidget {
@override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
bool isIcon = false;
Widget _myWidget = FloatingActionButton(
key: UniqueKey(),
onPressed: () {},
child: Icon(Icons.message),
);
void _d() {
setState(() {
_myWidget = isIcon
? FloatingActionButton(
mini: true,
key: UniqueKey(),
onPressed: () {},
child: Icon(Icons.messsage),
)
: FloatingActionButton.extended(
key: UniqueKey(),
onPressed: () {},
icon: Icon(Icons.message),
label: Text("Start chat"),
);
isIcon = !isIcon;
});
}
Widget build(context) {
return Scaffold(
floatingActionButton: isIcon
? AnimatedSwitcher(
duration: Duration(
milliseconds: 100,
),
transitionBuilder: (Widget child, Animation<double> animation) {
return FadeTransition(
child: child,
opacity:
animation.drive(CurveTween(curve: Curves.elasticOut)),
);
},
child: _myWidget,
)
: AnimatedSwitcher(
duration: Duration(
milliseconds: 100,
),
transitionBuilder: (Widget child, Animation<double> animation) {
return FadeTransition(
child: child,
opacity:
animation.drive(CurveTween(curve: Curves.easeOutQuint)),
);
},
child: _myWidget,
),
appBar: AppBar(),
body: FlatButton(
onPressed: () {
_d();
},
child: Text('Press here to change FAB')));
}
}
This is my implementation by keeping the same
Hero
tag for the two FABs.
import 'package:flutter/material.dart';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
debugShowCheckedModeBanner: false,
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: MyHomePage(),
);
}
}
class MyHomePage extends StatefulWidget {
@override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
bool isIcon = false;
Widget _myWidget = FloatingActionButton(
heroTag: 'd',
key: UniqueKey(),
onPressed: () {},
child: Icon(Icons.message),
);
void _d() {
setState(() {
_myWidget = isIcon
? FloatingActionButton(
heroTag: 'b',
key: UniqueKey(),
onPressed: () {},
child: Icon(Icons.message),
)
: FloatingActionButton.extended(
heroTag: 'b',
key: UniqueKey(),
onPressed: () {},
icon: Icon(Icons.mesage),
label: Text("Start chat"),
);
isIcon = !isIcon;
});
}
Widget build(context) {
return Scaffold(
floatingActionButton: _myWidget,
appBar: AppBar(),
body: FlatButton(
onPressed: () {
_d();
},
child: Text('Press here to change FAB')));
}
}
两者给出的结果不同,请根据需要尝试使用不同的动画曲线。改变 child 的大小,设置 Shape 边框,或将 mini:
设置为 true 以获得更好看的结果。
这是我做的
(your widget should be Stateful for this to work)
首先添加一个布尔值isExtended
到你的Widget
bool isExtended = false;
然后添加一个新函数来切换你的isExtended
值
void _switchActionBar() {
setState(
() {
isExtended = !isExtended;
},
);
}
最后像那样初始化 FloatingActionButon
FloatingActionButton.extended(
isExtended: isExtended,
onPressed: (){},
label: isExtended
? Row(
children: <Widget>[
Padding(
padding: const EdgeInsets.only(right: 8.0),
child: Icon(Icons.add),
),
Text("Start Editing"),
],
)
: Icon(Icons.add),
);
就是这样,每当您调用 _switchActionBar()
时,您的浮动操作按钮将在扩展和正常之间进行动画处理。
只需在 FAB.extended 和普通 FAB 之间切换 从普通FAB切换到扩展FAB时有动画,反之没有。
isextend
? FloatingActionButton.extended(
onPressed: _switchActionBar,
label: Text("Text"))
: FloatingActionButton(
onPressed: _switchActionBar,
child: Icon(Icons.add),
)
我能够使用带有 SizeTransition
和 FadeTransition
的 AnimatedSwitcher
让它工作。请看下面的代码。
floatingActionButton:
FloatingActionButton.extended(
onPressed: _onFabPress,
label: AnimatedSwitcher(
duration: Duration(seconds: 1),
transitionBuilder: (Widget child, Animation<double> animation) =>
FadeTransition(
opacity: animation,
child: SizeTransition(child:
child,
sizeFactor: animation,
axis: Axis.horizontal,
),
) ,
child: isExtended?
Icon(Icons.arrow_forward):
Row(
children: [
Padding(
padding: const EdgeInsets.only(right: 4.0),
child: Icon(Icons.add),
),
Text("Add To Order")
],
),
)
)
只有图标的视图不是完全圆形的,但我相信可以通过调整填充来解决这个问题。
有一个包可以实现您期望的行为。这是https://pub.dev/packages/flutter_scrolling_fab_animated