返回

中秋浪漫,用 Flutter 点亮月亮阴晴圆缺

IOS

中秋创意投稿大赛:用Flutter绘制月亮阴晴圆缺

在这秋高气爽、月色迷人的中秋佳节,让我们用 Flutter 来点亮月亮的阴晴圆缺,共同感受月相变化的浪漫与美妙。

1. 月相知识小科普

在开始之前,让我们先来了解一些关于月相的知识。月相是指月亮在绕地球运行过程中,反射太阳光而呈现的明暗形状,其变化是由月球相对于太阳和地球的位置决定的。

月相一般可分为朔月、新月、上弦月、满月、下弦月等。朔月时,月亮位于太阳和地球之间,背对地球,因此看不到月亮;新月时,月亮位于地球和太阳之间,正面朝向地球,但由于太阳光直接照射到月球背向地球的一面,因此也看不到月亮;上弦月时,月亮位于地球和太阳之间,右半部分被太阳光照亮,因此可以看到月亮的右边;满月时,月亮位于地球和太阳相对的位置,正面朝向地球,因此可以看到整个月亮;下弦月时,月亮位于地球和太阳之间,左半部分被太阳光照亮,因此可以看到月亮的左边。

2. 用 Flutter 绘制月亮动画

现在,我们已经对月相有了一定的了解,接下来让我们用 Flutter 来绘制一个月亮动画,展示月相的变化过程。

import 'package:flutter/material.dart';
import 'dart:math';

class Moon extends StatefulWidget {
  @override
  _MoonState createState() => _MoonState();
}

class _MoonState extends State<Moon> with SingleTickerProviderStateMixin {
  AnimationController _controller;
  Animation<double> _animation;

  @override
  void initState() {
    super.initState();
    _controller = AnimationController(
        duration: const Duration(seconds: 10), vsync: this);
    _animation = Tween(begin: 0.0, end: 2 * pi).animate(_controller)
      ..addListener(() {
        setState(() {});
      });
    _controller.repeat();
  }

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

  @override
  Widget build(BuildContext context) {
    return CustomPaint(
      painter: MoonPainter(
          radius: 100,
          moonPhase: _animation.value,
          backgroundColor: Colors.black,
          moonColor: Colors.white),
    );
  }
}

class MoonPainter extends CustomPainter {
  final double radius;
  final double moonPhase;
  final Color backgroundColor;
  final Color moonColor;

  MoonPainter(
      {this.radius,
      this.moonPhase,
      this.backgroundColor,
      this.moonColor});

  @override
  void paint(Canvas canvas, Size size) {
    Paint paint = Paint()
      ..color = backgroundColor
      ..style = PaintingStyle.fill;
    canvas.drawRect(Rect.fromLTWH(0, 0, size.width, size.height), paint);

    paint.color = moonColor;
    Path path = Path();
    path.addArc(
        Rect.fromCircle(
            center: Offset(size.width / 2, size.height / 2), radius: radius),
        -pi / 2 + moonPhase,
        pi - moonPhase * 2);
    path.close();
    canvas.drawPath(path, paint);
  }

  @override
  bool shouldRepaint(MoonPainter oldDelegate) {
    return oldDelegate.moonPhase != moonPhase;
  }
}

在上面的代码中,我们首先定义了一个 Moon 类,这是一个有状态的 Widget,用于管理动画状态。然后,我们在 initState 方法中创建了 AnimationControllerAnimation 对象,并设置了动画的持续时间和值范围。接下来,我们在 build 方法中使用 CustomPaint 绘制了月亮动画,并指定了月亮的半径、月相、背景颜色和月亮颜色。最后,我们在 MoonPainter 类中实现了 paint 方法,该方法用于绘制月亮动画。

3. 感受月相变化的浪漫与美妙

现在,运行 Flutter 程序,你将看到一个月亮动画,展示了月相变化的过程。你可以通过调整 moonPhase 值来控制月亮动画的当前状态,以欣赏不同月相的美丽。

在这个中秋佳节,让我们用 Flutter 点亮月亮的阴晴圆缺,共同感受月相变化的浪漫与美妙。也祝大家中秋节快乐,阖家团圆!

中秋创意投稿大赛,火热进行中!

中秋佳节,用技术绘出一幅中秋月夜图!快来参加中秋创意投稿大赛,赢取丰厚奖品!

大赛详情请看:中秋创意投稿大赛