You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

组件添加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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 10:17:55