美文网首页Flutter
flutter-心形轨迹动画

flutter-心形轨迹动画

作者: 浮华_du | 来源:发表于2021-03-31 14:10 被阅读0次

右边半个心❤边缘轨迹

class PainterDotWidget extends StatefulWidget {
  final double width;
  final double height;
  PainterDotWidget({@required this.width, @required this.height, Key key})
      : super(key: key);

  @override
  _PainterDotWidgetState createState() => _PainterDotWidgetState();
}

class _PainterDotWidgetState extends State<PainterDotWidget>
    with SingleTickerProviderStateMixin {
  AnimationController _controller; // 动画 controller
  Animation<double> _animation; // 动画
  double left; // 小圆点的left(动态计算)
  double top; // 小远点的right(动态计算)

  @override
  void initState() {
    super.initState();
    _controller = AnimationController(
        duration: Duration(milliseconds: 2000), vsync: this);
    _animation = Tween(begin: 0.0, end: 1.0).animate(_controller)
      ..addListener(() {
        if (_animation.status == AnimationStatus.completed) {}
      });

    // 三阶贝塞尔曲线用值
    ///p0 = width / 2, height / 4
    ///p1 = (width * 6) / 7, height / 9)
    ///p2 = (width * 13) / 13, (height * 2) / 5)
    ///p3 = width / 2, (height * 7) / 12
    var x0 = widget.width / 2;
    var y0 = widget.height / 4;

    var x1 = (widget.width * 6) / 7;
    var y1 = widget.height / 9;

    var x2 = (widget.width * 13) / 13;
    var y2 = (widget.height * 2) / 5;

    var x3 = widget.width / 2;
    var y3 = widget.height * 7 / 12;

    _animation.addListener(() {
      // t 动态变化的值
      var t = _animation.value;
      if (mounted)
        setState(() {
// B3(t) = (1-t)^3*P0+3t(1-t)^2*P1+3t^2(1-t)*P2+t^3*P3,  t属于 [0,1]
          left = pow(1 - t, 3) * x0 +
              3 * t * pow(1 - t, 2) * x1 +
              3 * pow(t, 2) * (1 - t) * x2 +
              pow(t, 3) * x3;

          top = pow(1 - t, 3) * y0 +
              3 * t * pow(1 - t, 2) * y1 +
              3 * pow(t, 2) * (1 - t) * y2 +
              pow(t, 3) * y3;
        });
    });

    // 初始化小圆点的位置
    left = x0;
    top = y0;

    // 显示小圆点的时候动画就开始
    _controller.forward();
  }

  @override
  Widget build(BuildContext context) {
    return Stack(
      children: <Widget>[
        Positioned(
          left: left - 7,
          top: top - 7,
          child: ClipOval(
            child: Container(
              width: 14,
              height: 14,
              color: Colors.blue,
            ),
          ),
        ),
      ],
    );
  }
}

相关文章

  • flutter-心形轨迹动画

    右边半个心❤边缘轨迹

  • flutter-动画

    动画与打包 [TOC] 动画 AnimationController Ticker 动画状态监听:在forword...

  • flutter-动画

    flutter动画 1.动画原理:在一段时间内快速的多次改变UI外观,由于人眼会产生视觉暂留所以最终看到的就是一个...

  • iOS 直播心形动画

    一、动画效果图: 二、实现的代码简单,只需要准备几张心形图片,并在控制器中调用-(void)animationIn...

  • Flutter-现有iOS工程引入Flutter

    Flutter-现有iOS工程引入Flutter Flutter-现有iOS工程引入Flutter

  • 飘动心形的简单动画

    今天做了一个点击按钮飘动心形的简单动画,效果如下: 每点击一下按钮,就生成一个心形,并执行飘动的动画。封装hear...

  • Android 红包雨效果自定义控件

    思路:利用Path绘制动画轨迹,再使用PathMeasure获取轨迹中的坐标位置实时改变view的坐标完成红包动画...

  • xpresso -常规-轨迹

    给立方体1 k一个动画,调出时间函数,赋予给轨迹节点 当动画进行时,轨迹的结果并未发生变化,需要给轨迹加入时间节点...

  • React Native Easing怎么用

    轨迹可视地址 具体动画轨迹参考 https://easings.net/# Ease.out 和 Ease.in ...

  • python 心形动画表白(turtle)

    python画图库turtle

网友评论

    本文标题:flutter-心形轨迹动画

    本文链接:https://www.haomeiwen.com/subject/oswohltx.html