Flutter實戰(zhàn)技巧之-自定義Dialog動畫

先來看看效果圖:


GIF Dialog Show.gif

直接上代碼吧

import 'package:flutter/material.dart';
import 'package:flutter_demo/common/custom_dialog.dart';

class DialogAnimationPage extends StatefulWidget {
  @override
  State<StatefulWidget> createState() {
    return DialogAnimationState();
  }
}

class DialogAnimationState extends State<DialogAnimationPage> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Dialog動畫'),
      ),
      body: Column(
        children: <Widget>[
          RaisedButton(
            onPressed: () {
              _showDialog(TransitionType.inFromLeft);
            },
            child: Text('show dialog inFromLeft'),
          ),
          RaisedButton(
            onPressed: () {
              _showDialog(TransitionType.inFromRight);
            },
            child: Text('show dialog inFromRight'),
          ),
          RaisedButton(
            onPressed: () {
              _showDialog(TransitionType.inFromTop);
            },
            child: Text('show dialog inFromTop'),
          ),
          RaisedButton(
            onPressed: () {
              _showDialog(TransitionType.inFromBottom);
            },
            child: Text('show dialog inFromBottom'),
          ),
          RaisedButton(
            onPressed: () {
              _showDialog(TransitionType.scale);
            },
            child: Text('show dialog scale'),
          ),
          RaisedButton(
            onPressed: () {
              _showDialog(TransitionType.rotation);
            },
            child: Text('show dialog rotation'),
          ),
        ],
      ),
    );
  }

  void _showDialog(TransitionType type) {
    showAnimationDialog(
        context: context,
        transitionType: type,
        builder: (context) {
          return AlertDialog(
            title: Text('Dialog Show'),
            content: Text('this is a dialog'),
            actions: <Widget>[
              InkWell(
                child: Text('confirm'),
                onTap: () {
                  Navigator.pop(context);
                },
              ),
              InkWell(
                child: Text('cancel'),
                onTap: () {
                  Navigator.pop(context);
                },
              ),
            ],
          );
        });
  }
}
import 'package:flutter/material.dart';

enum TransitionType {
  inFromLeft,
  inFromRight,
  inFromTop,
  inFromBottom,
  scale,
  fade,
  rotation,
  size,
}

Future<T> showAnimationDialog<T>({
  @required BuildContext context,
  bool barrierDismissible = true,
  @Deprecated('') Widget child,
  WidgetBuilder builder,
  bool useRootNavigator = true,
  RouteSettings routeSettings,
  TransitionType transitionType,
}) {
  assert(child == null || builder == null);
  assert(useRootNavigator != null);
  assert(debugCheckHasMaterialLocalizations(context));

  final ThemeData theme = Theme.of(context, shadowThemeOnly: true);
  return showGeneralDialog(
    context: context,
    pageBuilder: (BuildContext buildContext, Animation<double> animation, Animation<double> secondaryAnimation) {
      final Widget pageChild = child ?? Builder(builder: builder);
      return SafeArea(
        child: Builder(builder: (BuildContext context) {
          return theme != null ? Theme(data: theme, child: pageChild) : pageChild;
        }),
      );
    },
    barrierDismissible: barrierDismissible,
    barrierLabel: MaterialLocalizations.of(context).modalBarrierDismissLabel,
    barrierColor: Colors.black54,
    transitionDuration: const Duration(milliseconds: 200),
    transitionBuilder: (context, animation1, animation2, child) {
      return _buildDialogTransitions(context, animation1, animation2, child, transitionType);
    },
    useRootNavigator: useRootNavigator,
    routeSettings: routeSettings,
  );
}

Widget _buildDialogTransitions(
    BuildContext context, Animation<double> animaton1, Animation<double> secondaryAnimation, Widget child, TransitionType type) {
  if (type == TransitionType.fade) {
    // 漸變效果
    return FadeTransition(
      // 從0開始到1
      opacity: Tween(begin: 0.0, end: 1.0).animate(CurvedAnimation(
        // 傳入設置的動畫
        parent: animaton1,
        // 設置效果,快進漫出   這里有很多內置的效果
        curve: Curves.fastOutSlowIn,
      )),
      child: child,
    );
  } else if (type == TransitionType.scale) {
    return ScaleTransition(
      scale: Tween(begin: 0.0, end: 1.0).animate(CurvedAnimation(parent: animaton1, curve: Curves.fastOutSlowIn)),
      child: child,
    );
  } else if (type == TransitionType.rotation) {
    // 旋轉加縮放動畫效果
    return RotationTransition(
      turns: Tween(begin: 0.0, end: 1.0).animate(CurvedAnimation(
        parent: animaton1,
        curve: Curves.fastOutSlowIn,
      )),
      child: ScaleTransition(
        scale: Tween(begin: 0.0, end: 1.0).animate(CurvedAnimation(parent: animaton1, curve: Curves.fastOutSlowIn)),
        child: child,
      ),
    );
  } else if (type == TransitionType.inFromLeft) {
    // 左右滑動動畫效果
    return SlideTransition(
      position: Tween<Offset>(begin: Offset(-1.0, 0.0), end: Offset(0.0, 0.0))
          .animate(CurvedAnimation(parent: animaton1, curve: Curves.fastOutSlowIn)),
      child: child,
    );
  } else if (type == TransitionType.inFromRight) {
    return SlideTransition(
      position: Tween<Offset>(begin: Offset(1.0, 0.0), end: Offset(0.0, 0.0))
          .animate(CurvedAnimation(parent: animaton1, curve: Curves.fastOutSlowIn)),
      child: child,
    );
  } else if (type == TransitionType.inFromTop) {
    return SlideTransition(
      position: Tween<Offset>(begin: Offset(0.0, -1.0), end: Offset(0.0, 0.0))
          .animate(CurvedAnimation(parent: animaton1, curve: Curves.fastOutSlowIn)),
      child: child,
    );
  } else if (type == TransitionType.inFromBottom) {
    return SlideTransition(
      position: Tween<Offset>(begin: Offset(0.0, 1.0), end: Offset(0.0, 0.0))
          .animate(CurvedAnimation(parent: animaton1, curve: Curves.fastOutSlowIn)),
      child: child,
    );
  } else if (type == TransitionType.size) {
    return SizeTransition(
      child: child,
      sizeFactor: Tween<double>(begin: 0.1, end: 1.0).animate(CurvedAnimation(parent: animaton1, curve: Curves.linear)),
    );
  } else {
    return child;
  }
}

如果本文內容對您有用,記得點個贊吧!

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內容