Flutter中如何获取子组件相对于父Stack组件的坐标位置
实现方案
你当前代码里调用的localToGlobal方法获取的是Container相对于设备屏幕的全局坐标,要获取相对于父组件Stack的坐标,改用localToAncestor方法指定父Stack的RenderObject作为锚点即可。
操作步骤
- 首先给Stack组件也绑定一个GlobalKey,比如定义
final _stackKey = GlobalKey(); - 点击事件触发时,先分别拿到Container和Stack的RenderBox
- 调用Container对应的RenderBox的
localToAncestor方法,传入Stack的RenderObject,得到的就是相对于Stack的坐标
修改后的完整代码
// 先定义两个GlobalKey final _stackKey = GlobalKey(); final _containerKey = GlobalKey(); // 组件部分代码 Stack( key: _stackKey, // 给Stack绑定key alignment: Alignment.center, children: [ GestureDetector( onPanDown: (d) { // 拿到Container的RenderBox RenderBox containerBox = _containerKey.currentContext! .findRenderObject() as RenderBox; // 拿到父Stack的RenderObject作为锚点 RenderObject stackRender = _stackKey.currentContext!.findRenderObject()!; // 获取Container相对于Stack的坐标 Offset positionRelativeToStack = containerBox.localToAncestor(Offset.zero, ancestor: stackRender); print("相对于Stack的坐标:$positionRelativeToStack"); setState(() { value.offset = Offset( positionRelativeToStack.dx / screen.width, positionRelativeToStack.dy / screen.height ); }); }, child: Container( key: _containerKey, height: value.height, width: value.width, color: Colors.red, ), ) ], )
原理解释
localToAncestor方法是Flutter RenderBox类提供的坐标转换方法,第一个参数是子组件自身坐标系下的偏移量(填Offset.zero就是取子组件左上角的点),第二个参数ancestor指定要转换到哪个祖先组件的坐标系下,返回的结果就是目标点在指定祖先坐标系下的坐标值。
效果示意

内容的提问来源于stack exchange,提问作者Niteesh
相关产品推荐
相关产品推荐

