Flutter - DragBox 反馈动画到原始位置

2024-02-05

我想在 DropTarget 不接受时显示可拖动的反馈动画。Flutter 不显示反馈。我们有什么办法可以展示或控制它吗?就像这个例子,我想达到这样的效果。我以某种方式实现了这种效果,但它不能正确准确地返回到原始偏移量。它正在向原来的位置移动。

我想要的动画效果。

这是我的代码,当我将其提升到某个位置并将其从那里离开时,我有一个拖动框,它应该以动画方式返回到原始位置,但它会返回到像这样的其他偏移量。

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

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: Scaffold(body: DragBox()),
    );
  }
}

class DragBox extends StatefulWidget {
  DragBox({
    Key key,
  }) : super(key: key);

  @override
  State<StatefulWidget> createState() {
    return new _MyDragBox();
  }
}

class _MyDragBox extends State<DragBox> with TickerProviderStateMixin {
  GlobalKey _globalKey = new GlobalKey();
  AnimationController _controller;
  Offset begin;
  Offset cancelledOffset;
  Offset _offsetOfWidget;
  @override
  void initState() {
    WidgetsBinding.instance.addPostFrameCallback((s) {
      _afeteLayout();
    });
    super.initState();
    _controller = AnimationController(
      vsync: this,
      duration: Duration(milliseconds: 1000),
    );
  }

  void _afeteLayout() {
    final RenderBox box = _globalKey.currentContext.findRenderObject();
    Offset offset = -box.globalToLocal(Offset(0.0, 0.0));
    _offsetOfWidget = offset;
  }

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

  @override
  Widget build(BuildContext context) {
    return Stack(
      children: <Widget>[
        Center(
          child: Draggable(
            key: _globalKey,
            onDraggableCanceled: (v, o) {
              setState(() {
                cancelledOffset = o;
              });
              _controller.forward();
            },
            feedback: Container(
              color: Colors.red,
              height: 50,
              width: 50,
            ),
            child: Container(
              color: Colors.red,
              height: 50,
              width: 50,
            ),
          ),
        ),
        _controller.isAnimating
            ? SlideTransition(
                position: Tween<Offset>(
                        begin: cancelledOffset * 0.01,
                        end: _offsetOfWidget * 0.01)
                    .animate(_controller)
                      ..addStatusListener((status) {
                        if (status == AnimationStatus.completed) {
                          _controller.stop();
                        } else {
                          _controller.reverse();
                        }
                      }),
                child: Container(
                  color: Colors.red,
                  height: 50,
                  width: 50,
                ),
              )
            : Container(
                child: Text('data'),
              )
      ],
    );
  }
}

解决此问题的一个简单方法是创建一个覆盖 Draggable 的小部件,并使其成为 AnimatedPositioned 的子项。这是示例:

import 'package:flutter/material.dart';

class XDraggable extends StatefulWidget {
  const XDraggable(
      {Key? key,
      required this.child,
      required this.original_x,
      required this.original_y,
      this.animation_speed = 200})
      : super(key: key);
  final Widget child;
  final double original_x;
  final double original_y;
  final double animation_speed;

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

class _XDraggableState extends State<XDraggable> {
  double x = 200;
  double y = 200;

  int animation_speed = 0;

  @override
  void initState() {
    x = widget.original_x;
    y = widget.original_y;

    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    return AnimatedPositioned(
      left: x,
      top: y,
      duration: Duration(milliseconds: animation_speed),
      child: Draggable(
        onDragUpdate: (details) => {
          setState(() {
            animation_speed = 0;
            x = x + details.delta.dx;
            y = y + details.delta.dy;
          }),
        },
        onDragEnd: (details) {
          setState(() {
            animation_speed = 200;
            x = widget.original_x;
            y = widget.original_y;
          });
        },
        child: widget.child,
        feedback: SizedBox(),
      ),
    );
  }
}

然后,只需使用该小部件作为 Stack 子项即可:

...
child: Stack(
            fit: StackFit.expand,
            children: [
              XDraggable(
                original_x: 20,
                original_y: 20,
                child: Container(
                  height: 50.0,
                  width: 50.0,
                  color: Colors.green,
                ),
              )
            ],
          ),
...
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Flutter - DragBox 反馈动画到原始位置 的相关文章

随机推荐

  • Rails 3.1 资产管道供应商/资产文件夹组织

    我正在使用jQuery 工具 http flowplayer org tools 我的 Rails 3 1 站点中的可滚动库 各种资源放置在供应商 资产文件夹中 效果很好 我的问题是关于组织供应商 资产下的各种文件的最佳方式 组织供应商 资
  • 为什么我的 PHP 电子邮件表单会吸引垃圾邮件?

    我建立了一个网站 我想在网页上有一个电子邮件联系表 以便有人可以向我发送消息 我正在使用该网站的代码 http www w3schools com php php secure mail asp http www w3schools com
  • 如何使 Google Drive Java SDK 读取/写入“我的云端硬盘”而不是其他地方?

    我正在使用最新的 Google Drive Java SDK 1 9 0 rev 155 并且我已经成功地使其能够上传文件 列出文件 创建目录 这非常困难 以及其他各种操作 但是我上传的内容在Web界面中是不可见的 同样Web界面中的内容对
  • 函数存储在变量中? JavaScript

    有人可以解释一下 JavaScript 中的这个表示法吗 函数 d 在做什么 在这个程序中 x 似乎是由以下调用的 但我不知道这意味着什么 提前致谢 x function d return d x width mx later x x 9
  • 查看网站是否已关闭的代码? [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我正在尝试复制类似的网站http w
  • JNA鼠标钩子的工作示例

    谁能给我提供一个 JNA 鼠标钩子的工作示例 它能够在我的 Java Swing 应用程序之外跟踪鼠标移动 单击 提前致谢 是的 这是代码 public class CWMouseHook public final User32 USER3
  • React 16.7 Hooks:`react.useState` 不是一个函数

    我正在尝试带有react 16 7的钩子的功能组件 出现错误 src 组件 页脚 index js function Footer const selectedTab setSelectedTab useState redTab const
  • Pandas:索引更新和更改按位置访问的值

    我有两个关于 Python Pandas 数据框的索引相关问题 import pandas as pd import numpy as np df pd DataFrame id range 1 9 B one one two three
  • 使用-jsonArray时mongoimport的速度非常慢

    我有一个 15GB 文件 包含超过 2500 万行 采用以下 json 格式 mongodb 接受该格式导入 id 1 value u041c id 2 value u041d 当我尝试使用以下命令将其导入 mongodb 时 我得到的速度
  • 使用镜片的优点和缺点是什么?

    Lenses http hackage haskell org package lenses与标准 Haskell 相比 它似乎没有任何缺点 同时具有显着的优点 有什么理由我不应该尽可能使用镜头吗 有性能方面的考虑吗 此外 模板 Haske
  • Heroku 上的 WebSocket ERR_CONNECTION_REFUSED

    我正在尝试使用 Heroku 在 Heroku 上运行 Node js 应用程序WebSockets 但是 我无法解决此错误 如 Chrome 浏览器的控制台所示 与 wss myappname herokuapp com 27225 的
  • 语音识别Python代码不起作用

    我在安装了 pyAudio 的 Python 2 7 中运行以下代码 import speech recognition as sr r sr Recognizer with sr Microphone as source use the
  • Python - 正则表达式获取括号之间的数字

    我需要帮助创建正则表达式来获取括号之间的数字 当我的值在单词 PIC 和 之间时 我得到了这些记录并且需要能够提取 之间的值 PIC S9 02 V9 05 I need this result 02 05 PIC S9 04 I need
  • 命名 mysql 列适用哪些规则?

    在 MySQL 表中 命名列 我可以使用 spaces 大写字母 UTF8字符 我还应该遵守哪些其他规则 MySQL5 是的 是的 是的 我喜欢字段名称之间使用下划线并且不使用大写字母 但我不想引发一场激烈的战争 不在列名称中使用特殊字符的
  • 向 squarespace 添加静态页面(开发人员)

    我目前有一个 Squarespace 网站 它有点旧 但仍然有效 我还需要一段时间才能为其创建新网站 但是 我想向 Squarespace 网站添加一个新页面 该页面是一个静态 HTML 页面 充当新网站的迷你预览 我现在已经制作了一个单独
  • 为什么在重写 getItemViewType() 后,带有 ItemTouchHelper 的 RecyclerView 仅在一项之后停止拖动?

    我有一个简单的 RecyclerView 它使用 ItemTouchHelper 来滑动和拖动项目 一切工作正常 直到我需要以不同的方式设置第一个和最后一个项目的样式 因此我需要重写适配器中的 getItemViewType int p 函
  • Android,以编程方式布局按钮视图?

    我正在尝试以编程方式定义我的程序布局并在某个位置添加一个按钮 我没有使用布局 xml 作为内容视图 RelativeLayout mainLayout mainLayout new RelativeLayout this mainLayou
  • 如何从 Google App Engine 使用 Google Drive API?

    我在 GAE Python 2 7 中有一个应用程序 现在需要访问 Google Drive 来显示文件夹和文档的 共享 列表 搜索通常会产生指向 DrEdit 的指针 包括App Engine 和 Google Drive API htt
  • 如何在python中计算某种颜色的像素数?

    我有一张黑色和红色两种颜色的图片 我需要能够计算图片中有多少像素是红色的 有多少像素是黑色的 我更正了 0xd3 中的代码以使其实际工作 from PIL import Image im Image open black jpg black
  • Flutter - DragBox 反馈动画到原始位置

    我想在 DropTarget 不接受时显示可拖动的反馈动画 Flutter 不显示反馈 我们有什么办法可以展示或控制它吗 就像这个例子 我想达到这样的效果 我以某种方式实现了这种效果 但它不能正确准确地返回到原始偏移量 它正在向原来的位置移