📜  墨水池半径颤动 - Dart (1)

📅  最后修改于: 2023-12-03 15:23:41.813000             🧑  作者: Mango

墨水池半径颤动 - Dart

在这篇文章中,我们将讨论一个用Dart编写的程序,用于模拟墨水池的半径颤动。

程序功能

这个程序模拟了一个墨水池的半径颤动,展示了一个圆形的墨水池,墨水池的半径会随着时间的推移而发生颤动。程序的主要功能如下:

  1. 显示一个圆形墨水池
  2. 墨水池的半径会随时间变化而变化
  3. 墨水池的颜色会变化,以反映半径的变化
技术实现

这个程序主要使用了Dart的Flutter框架来实现。Flutter是一个支持跨平台开发的框架,可以用单一的Dart代码库构建iOS、Android、Web和桌面应用程序。

在这个程序中,我们使用Flutter的CustomPainter类来绘制墨水池,它允许我们以自定义方式绘制一个小部件。我们还使用了Flutter的动画API来实现墨水池半径的颤动效果。

以下是程序的核心代码片段:

class CustomPainter extends CustomPainter {
  CustomPainter({
    required this.radius,
    required this.color,
  });
  final double radius;
  final Color color;
  @override
  void paint(Canvas canvas, Size size) {
    canvas.drawCircle(
        Offset(size.width / 2, size.height / 2), radius, Paint()..color = color);
  }
  @override
  bool shouldRepaint(CustomPainter oldDelegate) => true;
}

class InkWell extends StatefulWidget {
  @override
  _InkWellState createState() => _InkWellState();
}

class _InkWellState extends State<InkWell> with TickerProviderStateMixin {
  late AnimationController _controller;
  late Animation<double> _animation;
  double _radius = 50.0;
  Color _color = Colors.blue;
  @override
  void initState() {
    super.initState();
    _controller = AnimationController(
      duration: const Duration(seconds: 2),
      vsync: this,
    )..repeat(reverse: true);
    _animation = Tween(begin: 0.0, end: 1.0).animate(_controller)
      ..addListener(() {
        setState(() {
          if (_radius < 50) {
            _color = Colors.blue;
          } else if (_radius >= 50 && _radius < 100) {
            _color = Colors.green;
          } else if (_radius >= 100 && _radius < 150) {
            _color = Colors.red;
          } else {
            _color = Colors.yellow;
          }
          _radius = 50.0 + sin(_animation.value * pi * 2) * 50.0;
        });
      });
  }
  @override
  void dispose() {
    _controller.dispose();
    super.dispose();
  }
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(
        child: GestureDetector(
          onTap: () {
            _controller.forward(from: 0.0);
          },
          child: CustomPaint(
            size: Size(200, 200),
            painter: CustomPainter(
              color: _color,
              radius: _radius,
            ),
          ),
        ),
      ),
    );
  }
}
展示效果

程序的运行效果如下:

InkWell效果

参考资料