Flutter Duration详细概述

在码农的世界里,优美的应用体验,来源于程序员对细节的处理以及自我要求的境界,年轻人也是忙忙碌碌的码农中一员,每天、每周,都会留下一些脚印,就是这些创作的内容,有一种执着,就是不知为什么,如果你迷茫,不妨来瞅瞅码农的轨迹。


1 Duration 是什么 ?

Duration 表示 持续时间,如1天,1小时,1分钟,1秒,100毫秒,100纳秒等。

2 Duration 用在哪 Duration 怎么用 ?

直接通过构造函数来创建,参数均为可选参数,说明如下:

  const Duration(
      {int days = 0,//天
      int hours = 0,//小时
      int minutes = 0,//分钟
      int seconds = 0,//秒
      int milliseconds = 0,//毫秒
      int microseconds = 0})//纳秒
2.1 Duration 常与 计时器 Timer 结合使用

如创建一个延时2秒的计时器

    //通过毫秒定义 
    Duration duration = new Duration(milliseconds: 2000);
    //通过秒定义
    Duration duration2 = new Duration(seconds: 2);
    
    //创建计时器
    Timer timer = Timer(duration, (){
      //延时回调
    });
2.2 Duration 也可与Future 结合使用

如创建一个延时2秒的计时器


    //通过秒定义
    Duration duration = new Duration(seconds: 2);

    Future.delayed(duration,(){
      //延时回调
    });
2.3 Duration 也可以与 AnimatedXXX系列组件结合使用

如透明度在1200毫秒中动态切换

  double _opacity = 1.0;
  Widget buildControllerWidget() {
    //动画过渡透明度组件
    return AnimatedOpacity(
      //过渡时间
      duration: Duration(milliseconds: 1200),
      opacity: _opacity,
      child:... ,
      );
 }
2.4 Duration 用在动画系列中

如在动画控制器中定义时间周期

class _TestState extends State
    with TickerProviderStateMixin {
  //动画控制器
  AnimationController _ationController;
    //页面初始化方法
  @override
  void initState() {
    super.initState();
    //初始化 回弹执行时间为 400毫秒
    _ationController = AnimationController(
      vsync: this,
      duration: Duration(milliseconds: 400),
    );

}
2.5 Duration 也会用在自定义路由中
  ///从下向上打开页面
  ///[isReplace]是否替换当前
  ///[opaque]是否是以背景透明方式打开新的页面
  ///[dismissCallBack]关闭页面的回调
  static void openPageFromBottom(BuildContext context, Widget page,
      {bool isReplace = false,
      bool opaque = true,
      Function(dynamic value) dismissCallBack}) {
    //自定义路由
    PageRouteBuilder pageRouteBuilder = new PageRouteBuilder(
        opaque: opaque,
        //页面构建
        pageBuilder: (BuildContext context, Animation<double> animation,
            Animation<double> secondaryAnimation) {
          //目标页面
          return page;
        },
        //打开页面过渡时间
        transitionDuration: Duration(milliseconds: 600),
        //关闭页面过渡时间
        reverseTransitionDuration: Duration(milliseconds: 400),
        //过渡动画
        transitionsBuilder: (
          BuildContext context,
          Animation<double> animation,
          Animation<double> secondaryAnimation,
          Widget child,
        ) {
          //平移过渡动画
          return SlideTransition(
            // 从位置(-1.0, 0.0) 平移到 (0.0, 0.0)
            position: Tween(
              begin: Offset(0.0, 1.0),
              end: Offset(0.0, 0.0),
            ).animate(
              CurvedAnimation(
                parent: animation,
                curve: Curves.easeInOut,
              ),
            ),
            child: child,
          );
        });
    if (isReplace) {
      Navigator.of(context).pushReplacement(pageRouteBuilder);
    } else {
      Navigator.of(context).push(pageRouteBuilder).then((value) {
        if (dismissCallBack != null) {
          dismissCallBack(value);
        }
      });
    }
  }
### 如何在 Flutter 中实现跟随鼠标的背景动画特效 在 Flutter 中实现跟随鼠标的背景动画特效可以通过监听鼠标事件并动态更新 UI 来完成。以下是具体方法以及示例代码。 #### 方法概述 为了实现实时响应鼠标移动的效果,可以利用 `Listener` 组件来捕获鼠标位置的变化,并通过状态管理机制(如 `StatefulWidget` 或其他状态管理库)实时更新界面中的动画效果[^1]。通常情况下,这种效果会涉及粒子动画、涟漪效果或其他视觉反馈形式。 --- #### 示例代码:简单的跟随鼠标粒子效果 下面是一个基于 `CustomPaint` 和 `AnimationController` 的简单例子,展示如何创建跟随鼠标的粒子动画: ```dart import 'package:flutter/material.dart'; void main() { runApp(const MouseFollowerApp()); } class MouseFollowerApp extends StatelessWidget { const MouseFollowerApp({Key? key}) : super(key: key); @override Widget build(BuildContext context) { return MaterialApp( home: Scaffold( body: MouseFollower(), ), ); } } class MouseFollower extends StatefulWidget { @override _MouseFollowerState createState() => _MouseFollowerState(); } class _MouseFollowerState extends State<MouseFollower> with TickerProviderStateMixin { Offset mousePosition = Offset.zero; late AnimationController controller; @override void initState() { super.initState(); controller = AnimationController(vsync: this, duration: Duration(milliseconds: 50)); } @override void dispose() { controller.dispose(); super.dispose(); } @override Widget build(BuildContext context) { return Listener( onPointerMove: (event) { setState(() { mousePosition = event.localPosition; // 更新鼠标位置 }); controller.forward(from: 0); // 触发动画重置 }, child: CustomPaint( painter: ParticlePainter(mousePosition), size: Size.infinite, ), ); } } class ParticlePainter extends CustomPainter { final Offset position; ParticlePainter(this.position); @override void paint(Canvas canvas, Size size) { Paint particlePaint = Paint() ..color = Colors.blue.withOpacity(0.7) ..strokeWidth = 2.0 ..style = PaintingStyle.fill; double radius = 30.0; for (int i = 0; i < 50; i++) { // 创建多个随机分布的粒子 Offset offset = Offset( position.dx + ((i % 2 == 0 ? -radius : radius)), position.dy + ((i % 2 != 0 ? -radius : radius)), ); canvas.drawCircle(offset, radius / (i + 1), particlePaint); } } @override bool shouldRepaint(CustomPainter oldDelegate) { return true; } } ``` 上述代码展示了如何使用 `Listener` 捕捉鼠标的位置变化,并通过自定义绘制 (`CustomPaint`) 实现跟随鼠标的粒子动画效果。 --- #### 关键点解析 1. **捕捉鼠标事件** 使用 `Listener` 的 `onPointerMove` 属性获取当前鼠标的坐标,并将其存储到组件的状态中以便后续渲染使用。 2. **动态更新 UI** 当检测到鼠标位置发生变化时,调用 `setState()` 方法触发重新构建,从而刷新屏幕上的动画效果。 3. **优化性能** 如果需要处理大量粒子或复杂图形,则建议引入缓存策略或者减少不必要的计算开销。例如,在 `shouldRepaint` 方法中返回合理的布尔值以控制是否重新绘制整个画布。 4. **扩展功能** 可进一步增强此基础版本的功能,比如添加颜色渐变、透明度过渡等更复杂的视觉表现形式;也可以尝试集成第三方物理引擎模拟真实的运动轨迹。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

早起的年轻人

创作源于分享

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值