flutter - Flutter:如何使用matrix_gesture_detector设置最大/最小刻度

标签 flutter dart zoom scale gesture

我正在尝试使列缩放/可移动。但是,如何设置最大变焦和最小变焦呢?这样就不会放大到无限远。

现在使用此方法:

 Matrix4 matrix = Matrix4.identity();

     MatrixGestureDetector(
      shouldRotate: false
      onMatrixUpdate: (Matrix4 m, Matrix4 tm, Matrix4 sm, Matrix4 rm) {
        setState(() {
          matrix = m;
        });
      },
      child: Transform(
        transform: matrix,
        child: Column(
      ),
    ),

最佳答案

我遇到了同样的问题,花了一段时间,但遇到了解决方案。

在Flutter的 Transform.scale source中进行了一些挖掘之后,揭示了这一行,这给了我们提示:

transform = Matrix4.diagonal3Values(scale, scale, 1.0)

它使用的是您在Matrix4中收到的onMatrixUpdate中的对角线值。因此,它从第一个Vector4中获取x,从第二个中获取y,从第三个中获取z。 (据我所知,第四项是固定的)。因此,这些是您需要限制的值。在此示例中,我制作了一个小的_minMax方法,该方法在相关时将比例尺限制在相关的最小/最大值(可以将其传递给null来忽略限制的任一侧)。

我用这个来限制规模:
typedef MathF<T extends num> = T Function(T, T);
typedef VFn = Vector4 Function(double x, double y, double z, double w);

double _minMax(num _min, num _max, num actual) {
  if (_min == null && _max == null) {
    return actual.toDouble();
  }

  if (_min == null) {
    return min(_max.toDouble(), actual.toDouble());
  }

  if (_max == null) {
    return max(_min.toDouble(), actual.toDouble());
  }

  return min(_max.toDouble(), max(_min.toDouble(), actual.toDouble()));
}

// ... ... ...

onMatrixUpdate: (Matrix4 m, Matrix4 tm, Matrix4 sm, Matrix4 rm) {
    var finalM = Matrix4.copy(m);
    Map<int, VFn> colmap = {
      0: (x, y, z, w) {
        x = _minMax(widget.minScale, widget.maxScale, x);
        return Vector4(x, y, z, w);
      },
      1: (x, y, z, w) {
        y = _minMax(widget.minScale, widget.maxScale, y);
        return Vector4(x, y, z, w);
      },
      2: (x, y, z, w) {
        z = _minMax(widget.minScale, widget.maxScale, z);
        return Vector4(x, y, z, w);
      },
    };
    for (var col in colmap.keys) {
      var oldCol = m.getColumn(col);
      var colD = colmap[col];
      if (colD != null) {
        finalM.setColumn(col, colD(oldCol.x, oldCol.y, oldCol.z, oldCol.w));
      }
    }
    setState(() {
      matrix = finalM;
    });
  },

关于flutter - Flutter:如何使用matrix_gesture_detector设置最大/最小刻度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60858334/

相关文章:

google-maps - GoogleMap 的 onCameraIdle 在 SingleChildScrollView 中停止触发

flutter - GoogleAuthProvider - 选择帐户的选项

ios - MKTileOverlay缩放级别大于21

button - Highcharts 隐藏缩放重置按钮,以编程方式调用缩放重置

html - 以em为单位的背景图像尺寸在缩放时是否应在Safari中调整图像大小?

ios - 如何调试 Flutter iOS 崩溃

flutter - 在 Flutter 中,如何使我的 FadeInImage 适合具有圆边的父容器?

dart - 使用 PageView 预加载网络图像

dart - 在 Angular Dart 中访问路由参数

ios - 链接框架 'Pods_Runner.framework' 缺少此目标 : x86_64 所需的一个或多个架构