Androids messengerアプリで見られるように、拡張サイズと通常サイズの間でアニメーション化するフローティングアクションボタンを実装したいと思います。 https://blog.usejournal.com/expand-collapse-fab-on-scrolling-like- googles-message-app-484df2d9d246
どうすればこれを達成できますか?現在、AnimatedSwitcher、FloatingActionButton.extended、およびFloatingActionButtonウィジェットの使用を検討しています。
FAB.extendedと通常のFABを切り替えるだけです。viseversaではなく、通常のFABから拡張FABに切り替えるときにアニメーションが表示されます。
isextend
? FloatingActionButton.extended(
onPressed: _switchActionBar,
label: Text("Text"))
: FloatingActionButton(
onPressed: _switchActionBar,
child: Icon(Icons.add),
)
これは、
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')));
}
}
これは、2つのFABに対して同じ
Hero
タグを保持することによる私の実装です。
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')));
}
}
どちらも異なる結果になります。好きなように異なるアニメーションカーブを試してください。子のサイズを変更するか、Shapeの境界線を設定するか、mini:
をtrueに設定して、より見栄えの良い結果を取得します。
これが私がやったことです
_(your widget should be Stateful for this to work)
_
最初にブール値isExtended
をウィジェットに追加します
_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()
を呼び出すと、フローティングアクションボタンが拡張と通常の間でアニメーションします。