能滑動隱藏的懸浮按鈕
https://www.jianshu.com/p/18f6f6a532ec
Flutter 可隨意拖動按鈕
https://www.jianshu.com/p/167ddc5660dc
flutter 滾動隱藏懸浮按鈕

Untitled.gif
- 實現思路,當開始滾動的時候,執行動畫讓中間的懸浮按鈕向右移動。當滾動結束的時候復位動畫
監聽滾動的方法有兩種
第一種 NotificationListener 在widget樹中,子widget滾動時會向上發送notification,通過NotificationListener可以監控到該notification。NotificationListener也是一個widget,可以將被監控的widget放入其child內。
NotificationListener
const NotificationListener({ Key key, @required this.child, 被監控的子widget樹 this.onNotification, 監控到notification后的回調方法。 })
onNotification(ScrollNotification notification) , 此方法需要一個返回值,表示是否攔截住notification,如果是true,那么notifcation到此為止;如果是false,那么notification會繼續向更外層widget傳遞。參數ScrollNotification包含了監聽到的信息。
ScrollNotification
ScrollNotification({ @required this.metrics, 所有信息都在這里存儲 ScrollMetrics @required this.context, });
第二種是通過ScrollController來監聽
ScrollController 常用方法
- addListener 滑動監聽方法,在initState中監聽
- _scrollController.position.pixels 滑動距離
- _scrollController.offset 滾動的偏移量
- _scrollController.position.maxScrollExtent 最大可滑動距離,滑動組件內容長度
- -_scrollController.position.minScrollExtent 最小可滑動距離,0
- _scrollController.position.viewportDimension 滑動視圖所占長度
- _scrollController.dispose() 銷毀監聽,在dispose方法中調用
- _scrollController.jumpTo 控制滑動組件的滑動距離,無動畫
- _scrollController.animateTo(10); 控制滑動組件的滑動距離,有動畫
- _scrollController.position.jumpTo 同上
- _scrollController.position.animateTo 同上
controller.addListener((){
print(controller......)
});
下面我們開始實現我們的效果
第一步
我們使用Scaffold floatingActionButton 來添加我們widget ,配合 floatingActionButtonLocation 設置下位置,
Scaffold( appBar: PreferredSize( child: _getAppBar(), preferredSize: Size(double.infinity,44), ), backgroundColor: Colors.white, floatingActionButton: AnimationWidget(), floatingActionButtonLocation: FloatingActionButtonLocation.centerFloat, body: ..., );
創建懸浮按鈕 AnimationWidget
import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; //狀態管理 class NotifierAnimation extends ChangeNotifier{ //回調方法 ValueChanged stopValueChanged; void animationStartAndEnd(isStop){ stopValueChanged(isStop); notifyListeners(); } } class AnimationWidget extends StatefulWidget { @override _AnimationWidgetState createState() => _AnimationWidgetState(); } class _AnimationWidgetState extends State<AnimationWidget> with SingleTickerProviderStateMixin{ AnimationController _animationController; Animation<Offset> _animation; @override void initState() { super.initState(); //實例化動畫 _animationController = new AnimationController(vsync: this,duration: new Duration(milliseconds: 240)); _animation = Tween(begin: Offset(0,0), end: Offset(0.8, 0)).animate(_animationController); } @override void didChangeDependencies() { //Provider 狀態管理 得到回調如果true 那就是開始動畫 final counter = Provider.of<NotifierAnimation>(context); if (counter !=null) { Provider.of<NotifierAnimation>(context,listen: false).stopValueChanged=((v){ if(v){ //開始動畫 _animationController.forward(); }else{ //復位動畫 _animationController.reverse(); } }); } } @override Widget build(BuildContext context) { return Align( alignment: Alignment.centerRight, child: Column( mainAxisAlignment: MainAxisAlignment.center, children: <Widget>[ SizedBox(height: 100), SlideTransition( child: Container( width: 50, height: 50, decoration: BoxDecoration( color: Colors.red ), ),position: _animation,), ],