【问题标题】:What is delta, globalPosition, localPosition and primaryDelta in Flutter?Flutter 中的 delta、globalPosition、localPosition 和 primaryDelta 是什么?
【发布时间】:2020-12-13 17:10:20
【问题描述】:

我很难理解deltaglobalPositionlocalPositionprimaryDelta 的属性DragUpdateDetails。我为DragUpdateDetails 阅读了documentation,但它并没有太大帮助。

我发现有人问了一些问题:What is primaryDelta and delta in DragUpdateDetailsWhat is the difference between globalposition and localposition in flutter?。第一个没有答案,而第二个只有globalPositionlocalPosition 的解释。

这是一个拖拽容器的示例代码:

import 'package:flutter/material.dart';

void main() => runApp(MyApp());

class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  double _xPosition = 0;
  double _yPosition = 0;

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      debugShowCheckedModeBanner: false,
      home: Scaffold(
        body: SafeArea(
          child: Container(
            child: Stack(
              children: [
                Positioned(
                  top: _yPosition,
                  left: _xPosition,
                  child: GestureDetector(
                    onPanUpdate: (DragUpdateDetails e) {
                      setState(() {
                        _xPosition += e.delta.dx;
                        _yPosition += e.delta.dy;
                      });
                    },
                    child: Container(
                      height: 200,
                      width: 200,
                      color: Colors.black,
                    ),
                  ),
                )
              ],
            ),
          ),
        ),
      ),
    );
  }
}

在这个例子中,为什么我们使用delta 而不是globalPositionlocalPosition。我的意思是当然拖动不会按预期工作,但如何知道何时使用deltaglobalPositionlocalPosition

有人可以快速解释一下这些属性吗?这真的意味着很多。谢谢!

【问题讨论】:

    标签: flutter


    【解决方案1】:

    根据DragUpdateDetailsclass的源码:

    delta → 偏移量 自上次更新以来指针在事件接收器坐标空间中的移动量

    含义,自上次指针接触以来拖动所经过的距离。 Delta 为水平距离提供dx,为垂直距离提供dy

    primaryDelta → 双倍 自上次更新以来,指针在事件接收器坐标空间中沿主轴移动的量

    primaryDelta 仅给出一个主要拖动方向的绝对距离,这意味着如果拖动主要在水平轴上(仅 GestureDragUpdateCallback + 水平),则此值表示水平轴上的拖动距离。如果拖入是垂直轴(仅GestureDragUpdateCallback + Vertical),则该值表示垂直轴上的拖拽量。

    注意:如果GestureDragUpdateCallback 用于二维拖动(例如,平移),则此值为null

    globalPosition → 偏移 触发此更新时指针的全局位置。

    屏幕上指针相对于整个屏幕区域的位置,原点在屏幕的top-left角。全球定位为水平坐标提供x,为垂直坐标提供y

    localPosition → 偏移 指针与屏幕接触的事件接收器坐标系中的本地位置。

    指针的位置与global position 一样,只是引用框架是小部件/渲染对象而不是整个屏幕。这里,小部件是接收到指针联系的小部件。

    关于示例代码的说明

    根据提供的示例代码,我可以肯定地说,当您处理任何可拖动小部件的定位时,您必须有一个初始位置。

    对于初始位置,可以使用globalPositionlocalPosition。使用哪一个取决于小部件树和应用程序的使用。

    设置初始位置后,您可以使用deltaprimaryDelta 找到可拖动小部件在拖动时移动到的新位置,公式如下:

    newXPosition = initialXPosition + (dxprimaryDelta 在水平轴上)

    newYPosition = initialYPosition +(dyprimaryDelta 在垂直轴上)

    在使用 deltaprimaryDelta 时要记住的一点是,如果小部件可以/应该识别两个轴上的拖动事件,则将仅提供 deltaprimaryDelat 将是 @987654348 @。

    否则,如果预计只有一个方向拖动,则仅使用 primaryDelta 将按预期工作,此时 delta 将只有一个值作为 non-zero 值,其他作为 0 值取决于哪个方向要识别拖动。

    如果您对 cme​​ts 有任何其他问题,请告诉我。

    【讨论】:

    • 正如你所说的“globalPosition = 屏幕上指针相对于整个屏幕区域和屏幕左上角原点的位置。”。那么,拖动位置计算不应该像_xPosition = e.globalPosition.dx - width_of_container; _yPosition = e.globalPosition.dy - height_of_container;那样,因为我们是根据屏幕上指针的位置移动容器吗?
    • 好的,我现在知道了。非常感谢
    • @DRAGON 我想你现在明白了,但只是为了完成,对于评论中的问题:你已经从拖动更新细节中获得了 delta 值,所以没有必要再次计算它以用于移动容器,但是,没有规则只能使用delta,任何对你有用的东西都是允许的。请记住,如果您自己执行此操作,如果不小心执行,可能会导致意外的性能问题。
    猜你喜欢
    • 1970-01-01
    • 2019-02-17
    • 2022-06-16
    • 1970-01-01
    • 2021-04-03
    • 1970-01-01
    • 1970-01-01
    • 2021-04-04
    • 2020-06-28
    相关资源
    最近更新 更多