问题描述
是否可以在 InteractiveViewer 内使用 GestureDetector(特别是 onTapUp 手势)?
我知道 InteractiveViewer 使用 GestureDetector 本身并覆盖 onScaleEnd、onScaleStart 和 onScaleUpdate 方法来实现平移。但是,onTapUp 没有被覆盖,这让我觉得有可能使用它。
解决方法
我进行了一些挖掘,并在 toScene() 方法的 InteractiveViewer's TransformationController documentation 中找到了这个:
返回给定视口点的场景点。
视口点是相对于父级的,而场景点是相对于父级的 相对于子,不分变换。调用场景 带有视口点本质上返回场景坐标 位于给定变换的视口点下方。
视口变换为子对象的倒数(即移动 child left 相当于将 viewport 向右移动)。
这种方法在确定事件发生的位置时通常很有用 父母发生在孩子身上。此示例显示如何确定位置 对父级的轻按发生在子级上。
GestureDetector(
onTapUp: (TapUpDetails details) {
_childWasTappedAt = _transformationController.toScene(
details.localPosition,);
},child: InteractiveViewer(
transformationController: _transformationController,child: child,),); }
因此,建议的解决方案是将 InteractiveViewer 与 GestureDetector 包装在一起,使用自定义 TransformationController,并从该控制器获取相对于查看器视口的位置,而不是将 GestureDetector 作为子项使用。