flutter 是否可以从点击屏幕的位置开始显示带有动画的AlertDialog?

3qpi33ja  于 2023-08-07  发布在  Flutter
关注(0)|答案(1)|浏览(110)

是否可以从点击屏幕的位置开始显示AlertDialog,类似于animations包中的Container transform?在这种情况下,容器最初不显示,应该通过从空白区域接收onTapGestureDetector来触发。然后,我想显示如上所述的动画对话框。

nom7f22z

nom7f22z1#

我的客人,Flutter的动画包没有一个内置的容器变换一样,在材料运动。但是,您可以创建自定义动画对话框,该对话框从点击屏幕的位置开始。
要实现这一点,您可以遵循以下常规步骤:
1.用GestureDetector包裹您的主要内容,以检测在空白区域上的点击。
1.检测到敲击时,记录敲击的位置(即Offset)。
1.在记录的位置显示隐藏的或空的容器,并使用动画(例如,AnimatedContainer)以所需的动画显示对话框的内容。
1.您可以使用动画库,如animations或Flutter的内置AnimationControllerAnimationBuilder来控制动画。
下面是一个简化的示例,说明如何做到这一点:

import 'package:flutter/material.dart';

class AnimatedDialogExample extends StatefulWidget {
  @override
  _AnimatedDialogExampleState createState() => _AnimatedDialogExampleState();
}

class _AnimatedDialogExampleState extends State<AnimatedDialogExample>
    with SingleTickerProviderStateMixin {
  AnimationController _animationController;
  Offset _tapPosition;

  @override
  void initState() {
    super.initState();
    _animationController = AnimationController(
      vsync: this,
      duration: Duration(milliseconds: 500),
    );
  }

  @override
  void dispose() {
    _animationController.dispose();
    super.dispose();
  }

  void _onTap(BuildContext context, TapDownDetails details) {
    setState(() {
      _tapPosition = details.globalPosition;
    });
    _animationController.forward(from: 0.0);
  }

  @override
  Widget build(BuildContext context) {
    return GestureDetector(
      onTapDown: (details) => _onTap(context, details),
      child: Scaffold(
        appBar: AppBar(
          title: Text('Animated Dialog Example'),
        ),
        body: Center(
          child: Text('Tap on an empty area to trigger the dialog.'),
        ),
        floatingActionButton: _buildAnimatedDialog(),
        floatingActionButtonLocation: FloatingActionButtonLocation.centerFloat,
      ),
    );
  }

  Widget _buildAnimatedDialog() {
    return AnimatedBuilder(
      animation: _animationController,
      builder: (context, child) {
        final animationValue = _animationController.value;
        final dialogOpacity = Curves.easeInOut.transform(animationValue);
        final dialogScale = Tween<double>(begin: 0.0, end: 1.0)
            .transform(animationValue);

        final screenHeight = MediaQuery.of(context).size.height;
        final screenWidth = MediaQuery.of(context).size.width;
        final dialogSize = 200.0; // Adjust this size as per your requirement

        return Positioned(
          top: _tapPosition.dy - (dialogSize / 2) + (dialogSize / 2) * dialogScale,
          left: _tapPosition.dx - (dialogSize / 2) + (dialogSize / 2) * dialogScale,
          child: Opacity(
            opacity: dialogOpacity,
            child: Transform.scale(
              scale: dialogScale,
              child: Container(
                width: dialogSize,
                height: dialogSize,
                color: Colors.blue,
                child: Center(
                  child: Text('Your Dialog Content'),
                ),
              ),
            ),
          ),
        );
      },
    );
  }
}

void main() {
  runApp(MaterialApp(
    home: AnimatedDialogExample(),
  ));
}

字符串
在这个例子中,当用户点击空白区域时,_onTap方法被触发。_tapPosition存储点击的位置,然后_animationController用于动画对话框的不透明度和缩放。对话框将出现并从轻击位置增长,从而创建由轻击手势触发的对话框的效果。

相关问题