组件添加90度旋转效果后位置更新异常问题求助
旋转组件后保持拖拽位置更新正常的解决方案
当组件添加90度旋转变换后,onDragUpdate中直接使用event.localDelta更新position会出现异常,原因是**localDelta的坐标系随组件旋转发生了偏移**,本地坐标系的轴方向与父坐标系不再一致,导致拖拽偏移的计算逻辑失效。
修改后的回调实现
import 'dart:math' as math; void onDragUpdate(DragUpdateEvent event) { super.onDragUpdate(event); // 对应组件的90度旋转角度(π/2弧度) final rotationAngle = math.pi / 2; // 创建逆旋转矩阵,将本地坐标系的偏移转换为父坐标系的偏移 final inverseTransform = Matrix4.rotationZ(-rotationAngle); // 转换拖拽偏移量 final adjustedDelta = Offset( inverseTransform.transformVector3(Vector3(event.localDelta.dx, event.localDelta.dy, 0)).x, inverseTransform.transformVector3(Vector3(event.localDelta.dx, event.localDelta.dy, 0)).y, ); // 使用转换后的偏移更新位置 position += adjustedDelta; }
关键逻辑说明
- 组件旋转后,本地拖拽的
localDelta是基于旋转后的坐标系计算的,直接累加会导致拖拽方向与预期不符。 - 通过逆旋转矩阵(旋转角度取负),将本地坐标系的拖拽偏移转换回父坐标系的正确偏移量,这样
position的更新逻辑就和未旋转组件的行为完全一致。 - 如果旋转角度动态变化,只需将
rotationAngle替换为当前组件的实时旋转弧度值即可。
内容的提问来源于stack exchange,提问作者Son Nguyen Quoc
相关产品推荐
相关产品推荐

