flutter开发实战-Canvas绘图之Path路径动画

这篇具有很好参考价值的文章主要介绍了flutter开发实战-Canvas绘图之Path路径动画。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

flutter开发实战-Canvas绘图之Path路径动画

flutter提供一块2D画布Canvas,Canvas内部封装了一些基本绘制的API,开发者可以通过Canvas绘制各种自定义图形。canvas上绘图,有多种不同的方式,常用的就是使用 Path。这里是flutter实现Path路径动画。

实现小球根据Path来做动画效果。

一、效果图

运行后效果图如下

flutter开发实战-Canvas绘图之Path路径动画,flutter开发实战,flutter,移动开发,flutter,Canvas,Path,动画

二、代码实现

实现小球根据Path来做动画效果。
代码使用的是Stack+position进行,通过动画计算Position的top、left更改位置。

Path.computeMetrics
computeMetrics是路径中一个非常实用的操作,可以更具这个方法获得很多有价值的信息。比如路径上某点在路径上的位置、角度、路径长度等。

获取路径某个位置Position

  Offset calculate(value, path) {
    PathMetrics pathMetrics = path.computeMetrics();
    PathMetric pathMetric = pathMetrics.elementAt(0);
    value = pathMetric.length * value;
    Tangent pos = pathMetric.getTangentForOffset(value)!;
    return pos.position;
  }

创建Stack上的小球代码

class _MyHomePageState extends State<MyHomePage> {
  // 弹珠的widgets
  List<BallAnimation> _marbleWidgets = [];

  
  void initState() {
    // TODO: implement initState
    super.initState();
  }

  
  void dispose() {
    // TODO: implement dispose
    super.dispose();
  }


  
  Widget build(BuildContext context) {
    // This method is rerun every time setState is called, for instance as done
    // by the _incrementCounter method above.
    //
    // The Flutter framework has been optimized to make rerunning build methods
    // fast, so that you can just rebuild anything that needs updating rather
    // than having to individually change instances of widgets.
    Size size = MediaQuery.of(context).size;
    return Scaffold(
      appBar: AppBar(
        // Here we take the value from the MyHomePage object that was created by
        // the App.build method, and use it to set our appbar title.
        title: Text(widget.title),
      ),
      body: Container(
        width: size.width,
        height: size.height,
        alignment: Alignment.center,
        child: Stack(
          alignment: Alignment.center,
          children: [
            buildMarbleAnimation(context),
          ],
        ),
      ),
    );
  }

  Widget buildMarbleAnimation(BuildContext context) {
    Size size = MediaQuery.of(context).size;
    return Container(
      width: size.width,
      height: size.height,
      alignment: Alignment.center,
      child: Stack(
        alignment: Alignment.center,
        children: buildWidgets(context),
      ),
    );
  }

  List<BallAnimation> buildWidgets(BuildContext context) {
    Size size = MediaQuery.of(context).size;
    _marbleWidgets.clear();
    for(int index = 0; index < 10; index++) {
      BallAnimation ballAnimation = BallAnimation(screenSize: size);
      _marbleWidgets.add(ballAnimation);
    }
    return _marbleWidgets;
  }
}

实现根据Path更改Position的top与left代码

class BallAnimation extends StatefulWidget {
  const BallAnimation({super.key, required this.screenSize,});

  final Size screenSize;

  
  State<BallAnimation> createState() => _BallAnimationState();
}

class _BallAnimationState extends State<BallAnimation>
    with TickerProviderStateMixin {
  late AnimationController _animateController;
  late Animation<double> _animation;

  // 球的X
  late Offset _ballOffset = Offset(0, 0);

  // 球的X,Y
  late double _ballX = 0;
  late double _ballY = 0;
  Path path = Path();

  
  void initState() {
    // TODO: implement initState]
    super.initState();
    startRunAnimation();
  }

  void startRunAnimation() {
    runAnimation();
  }

  void runAnimation() {
    double randomXPos1 = (Random().nextInt(100)/100)*widget.screenSize.width;
    double randomYPos1 = (Random().nextInt(100)/100)*widget.screenSize.height;
    
    // path的moveTo方法
    path.moveTo(randomXPos1, randomYPos1);

    for(int index = 0; index < 10; index++) {
      double randomXPos = (Random().nextInt(100)/100)*widget.screenSize.width;
      double randomYPos = (Random().nextInt(100)/100)*widget.screenSize.height;

      // path的lineTo方法
      path.lineTo(randomXPos, randomYPos);
    }

    Duration duration = Duration(seconds: 20);
    Curve curve = Curves.linear;

    _animateController = AnimationController(vsync: this, duration: duration);

    //使用弹性曲线
    _animation = CurvedAnimation(parent: _animateController, curve: curve);
    _animation = Tween(begin: 0.0, end: 1.0).animate(_animation);

    _animateController.addListener(() {
      if (mounted) {
        setState(() {
          _ballX = calculate(_animation.value, path).dx;
          _ballY = calculate(_animation.value, path).dy;
          _ballOffset = Offset(_ballX, _ballY);
        });
      }
    });

    _animateController.addStatusListener((status) {
      if (status == AnimationStatus.completed) {
        _animateController.reset();
        _animateController.forward();
      }
    });

    _animateController.forward();
  }

  
  void dispose() {
    // TODO: implement dispose
    _animateController.dispose();

    super.dispose();
  }

  
  Widget build(BuildContext context) {
    return Positioned(
      top: _ballY,
      left: _ballX,
      child: Container(
        width: 80,
        height: 80,
        decoration: BoxDecoration(
            color: Colors.teal,
            borderRadius: BorderRadius.all(Radius.circular(40))
        ),
      ),
    );
  }

  Offset calculate(value, path) {
    PathMetrics pathMetrics = path.computeMetrics();
    PathMetric pathMetric = pathMetrics.elementAt(0);
    value = pathMetric.length * value;
    Tangent pos = pathMetric.getTangentForOffset(value)!;
    return pos.position;
  }
}

三、小结

flutter开发实战-Canvas绘图之Path路径动画

flutter提供一块2D画布Canvas,Canvas内部封装了一些基本绘制的API,开发者可以通过Canvas绘制各种自定义图形。canvas上绘图,有多种不同的方式,常用的就是使用 Path。这里是flutter实现Path路径动画。

学习记录,每天不停进步。文章来源地址https://www.toymoban.com/news/detail-577701.html

到了这里,关于flutter开发实战-Canvas绘图之Path路径动画的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Flutter Flar动画实战

    在Flare动面出现之前,Flare动画大体可以分为使用AnimationController控制的基础动画以及使用Hero的转场动画,如果遇到一些复杂的场景,使用这些动画方案实现起来还是有难度的。不过,随着Flutter开始支持Flare矢量动面,Flutter的动画开发也变得越来越简单。事实上,Flare动画是一

    2024年02月14日
    浏览(27)
  • Flutter开发进阶之动画

    在Flutter中,动画是至关重要的一个部分,它能够为应用程序提供更加丰富和生动的用户体验,Flutter中的动画系统是UI框架的核心功能之一,也是开发者学习Flutter框架的重要部分,由于动画原理在所有程序中都是相同的,即视觉暂留,因此理解这一原理对于更好地使用Flutter的

    2024年01月21日
    浏览(27)
  • HarmonyOS鸿蒙开发指南:基于ArkTS的声明式开发范式 声明式UI开发实例 绘图与动画

    目录 绘制图形 绘制基本几何图形 绘制自定义几何图形 animateTo实现闪屏动画 页面转场动画 绘制能力主要是通过框架提供的绘制组件来支撑,支持svg标准绘制命令。 本节主要学习如何使用绘制组件,绘制详情页食物成分标签(基本几何图形)和应用Logo(自定义图形)。

    2024年01月17日
    浏览(46)
  • 1、Flutter移动端App实战教程【环境配置、模拟器配置】

    Flutter是Google用以帮助开发者在IOS和Android 两个平台开发高质量原生UI的移动SDK,一份代码可以同时生成IOS和Android两个高性能、高保真的应用程序。 之所以说Flutter能够达到可以媲美甚至超越原生的体验,主要在于其拥有高性能的图形渲染能力,首先对比下Flutter和原生Android及其

    2024年02月09日
    浏览(27)
  • 【Flutter 面试题】Flutter 是什么?它与其他移动开发框架有什么不同?

    👏🏻 正在学 Flutter 的同学,你好! 😊 本专栏是解决 Flutter 面试过程中可能出现的问题,而进行汇总整理的。一个问题一篇文章,尽可能详细解答,满足面试需求。 🔍 想解决开发中的零散问题?碎片化教程 👉 Flutter Tips 。 🔍 想深入学习 Flutter?系统化教程 👉 Flutter 从

    2024年01月24日
    浏览(36)
  • Flutter:跨平台移动应用开发的未来

    Flutter的背景和概述 Flutter是由Google开发的一个开源UI工具包,用于构建漂亮、快速且高度可定制的移动应用程序。它于2017年首次发布,并迅速引起了开发者们的关注。Flutter采用了一种全新的方法来构建用户界面,通过使用自绘UI技术,可以实现高性能的跨平台应用开发。 Fl

    2024年01月22日
    浏览(73)
  • 微信小游戏开发之unity-精灵的创建动画和操作移动

    我们的目标是通过unity开发微信小游戏! 这是第一篇正式实战开发文章,将会很详细介绍每一个步骤和代码。 废话不多说直接操作! 由于目标开发游戏是2D小游戏,我们选择2D核心模板. 我们的目标是开发微信小游戏所以我们需要修改setting,选择运行平台选择转换 WebGL ,刚开

    2024年01月16日
    浏览(56)
  • Flutter移动应用开发 - 01 Flutter初次安装、模拟器配置教程(手把手版)

    首先先安装一个编辑器,这边选用的是Android Studio(Android Studio)。Android Studio的下载和项目创建平平无奇,唯一可能有问题的就是gradle文件的下载,如果没翻墙的话需要手动下载和配置,在此不多介绍。 接下来文件的配置。 官网下载并解压Flutter SDK 版本列表 - Flutter 中文文档

    2023年04月25日
    浏览(30)
  • JavaScript场景应用:Canvas实战开发一个二维折线图插件

    🏆作者简介,黑夜开发者,全栈领域新星创作者✌,阿里云社区专家博主,2023年6月csdn上海赛道top4。 🏆数年电商行业从业经验,历任核心研发工程师,项目技术负责人。 🏆本文已收录于专栏:100个JavaScript的小应用。 🎉欢迎 👍点赞✍评论⭐收藏 折线图是一种常见的数据

    2024年02月14日
    浏览(31)
  • Flutter与Android开发:构建跨平台移动应用的新选择

    本文内容提纲如下: 介绍Flutter技术:Flutter是一种由Google推出的开源UI工具包,用于构建高性能、跨平台的移动应用。文章将介绍Flutter的基本概念、特点和优势,包括其快速的开发速度、一致的用户界面和丰富的UI组件库等。 Flutter与Android开发的对比:文章将对比Flutter与传统

    2023年04月21日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包