extended_image
extended_image copied to clipboard
关于缩放的开始与结束问题
作者们好,请问如何知道一次完整缩放操作的开始与结束?
暂时没有 api,你是想做什么事情
做事件统计
其实你可以监听下 pointer down up
是的,目前我们是通过 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;
},
);
确实有一些场景需要这样的回调,比如现在我要框选图片,对选中部分进行文字识别,需要结束的回调. 另外,请问有什么方法设置裁剪框不自动移到中间吗,我现在是把进入中间的动画时长设置一个很大的时间,感觉不太对???
确实有一些场景需要这样的回调,比如现在我要框选图片,对选中部分进行文字识别,需要结束的回调. 另外,请问有什么方法设置裁剪框不自动移到中间吗,我现在是把进入中间的动画时长设置一个很大的时间,感觉不太对???
不能