extended_image icon indicating copy to clipboard operation
extended_image copied to clipboard

关于缩放的开始与结束问题

Open LinXunFeng opened this issue 2 years ago • 6 comments

作者们好,请问如何知道一次完整缩放操作的开始与结束?

LinXunFeng avatar Jun 23 '22 10:06 LinXunFeng

暂时没有 api,你是想做什么事情

zmtzawqlp avatar Sep 01 '22 07:09 zmtzawqlp

做事件统计

LinXunFeng avatar Sep 01 '22 08:09 LinXunFeng

其实你可以监听下 pointer down up

zmtzawqlp avatar Sep 01 '22 08:09 zmtzawqlp

是的,目前我们是通过 Listener 监听了手指按下与抬起完成了这个功能,提供以下代码给需要的人

// Widget
/// 图片放大回调
final Function(double startScale, double endScale)? handlePicZoomScaleChange;
// State
/// 是否已ynvi在大图浏览上的手指当前是否为抬起状态
bool haveRecordPanStartZoomScale = false;

/// 图片开始捏合时的缩放倍数
double picPanStartZoomScale = 0.0;

/// 图片结束捏合时的缩放倍数
double picPanEndZoomScale = 0.0;
Widget resultWidget = ExtendedImage.network(
  ...
  initGestureConfigHandler: (state) {
    return GestureConfig(
      ...
      gestureDetailsIsChanged: (GestureDetails? details) {
        final _details = details;
        if (_details == null) return;
        if (_details.actionType != ActionType.zoom) return;
        if (haveRecordPanStartZoomScale) {
          // 记录开始捏合时的缩放
          haveRecordPanStartZoomScale = true;
          picPanStartZoomScale = _details.totalScale ?? 0;
        } else {
          // 记录结束捏合时的缩放
          picPanEndZoomScale = _details.totalScale ?? 0;
        }
      },
    );
  },
  onDoubleTap: (state) {
    var doubleClickAnimationController = _doubleClickAnimationController;
    if (doubleClickAnimationController == null) {
      return;
    }
    final Offset pointerDownPosition =
        state.pointerDownPosition ?? Offset.zero;
    final double begin = state.gestureDetails?.totalScale ?? 1;
    double end;
    // 判断
    if (doubleClickAnimationController.isAnimating) {
      return;
    }
    // 移旧
    if (_doubleClickAnimationListener != null) {
      _doubleClickAnimation?.removeListener(_doubleClickAnimationListener!);
    }
    // 停前
    doubleClickAnimationController.stop();
    // 从头
    doubleClickAnimationController.reset();
    if (begin == doubleTapScales[0]) {
      end = doubleTapScales[1];
    } else {
      end = doubleTapScales[0];
    }

    // 处理图片缩放变化
    widget.handlePicZoomScaleChange?.call(begin, end);
    // 同步缩放
    picPanStartZoomScale = picPanEndZoomScale = end;

    ...
  },
);
resultWidget = Listener(
  child: resultWidget,
  onPointerDown: (PointerDownEvent event) {
    // 手指按下
    // 初始化 picPanStartZoomScale
    picPanStartZoomScale = picPanEndZoomScale;
  },
  onPointerUp: (PointerUpEvent event) {
    // 手指抬起
    // 处理图片缩放变化
    widget.handlePicZoomScaleChange
        ?.call(picPanStartZoomScale, picPanEndZoomScale);
    // 重置 haveRecordPanStartZoomScale
    haveRecordPanStartZoomScale = false;
    // 重置 picPanStartZoomScale,防止双击情况下误报缩放,双击单独处理
    picPanStartZoomScale = picPanEndZoomScale;
  },
);
Widget resultWidget = ExtendedImageGesturePageView.builder(
  ...
  onPageChanged: (index) {
    // 页码改变
    widget.onPageChanged?.call(index);
    // 同步缩放
    picPanStartZoomScale =
        picPanEndZoomScale = TWNHExtendedImageBrowserScale.min;
  },
);

LinXunFeng avatar Sep 02 '22 01:09 LinXunFeng

确实有一些场景需要这样的回调,比如现在我要框选图片,对选中部分进行文字识别,需要结束的回调. 另外,请问有什么方法设置裁剪框不自动移到中间吗,我现在是把进入中间的动画时长设置一个很大的时间,感觉不太对???

fqingyang avatar Nov 17 '23 15:11 fqingyang

确实有一些场景需要这样的回调,比如现在我要框选图片,对选中部分进行文字识别,需要结束的回调. 另外,请问有什么方法设置裁剪框不自动移到中间吗,我现在是把进入中间的动画时长设置一个很大的时间,感觉不太对???

不能

zmtzawqlp avatar Nov 18 '23 01:11 zmtzawqlp