_globalToLocal
来源:12-6 计算点赞坐标(二)

demonCry
2022-09-09
本节实现了 _globalToLocal 这个方法, 将全局坐标变成相对的
我想问的是为什么不直接在点击的时候不要获取details.globalPosition
而是直接选择获取 details.localPosition
呢? 这不直接得到相对距离了吗?
2回答
-
马超老师
2022-09-26
回答完之后,可以引申出下一个问题:
为什么_globalToLocal方法获取到的就是相对视频区域的坐标了呢?
首先我们看一下方法的代码:
Offset _globalToLocal(Offset global) { RenderBox renderBox = _key.currentContext?.findRenderObject() as RenderBox; return renderBox.globalToLocal(global); }
其实答案就在这个context当中。
context表示上下文,我们从GestureDetector的_key中拿到context对象,然后找到RenderObject,其实就是GestureDetector对应的RenderObject,而此时的RenderObject是一个RenderBox类型,RenderBox的globalToLocal方法专门用于计算当前坐标和自己的相对坐标,所以_globalToLocal方法返回的就是将传入的offset坐标转换成与Context相关的控件的相对坐标。所以当你需要拿到固定控件都相对坐标时,就要用到context去做转换,这样在本案例中就可以拿到双击点距离视频区域的相对坐标了。
00 -
马超老师
2022-09-26
这个问题问的很好,首先给结论:在本案例中,两个API获取到的数值确实是一样的,但是仅仅是数值一样,意义是不一样的,下面详细说明一下。
details.globalPosition
以上代码中的details对象来自于GestureDetector,所以detail.globalPosition和details.localPosition获取到的是点击点的绝对坐标以及相对于GestureDetector控件的相对坐标。而我们需要的值准确说应该是点击点相对于视频区域的相对坐标。然而当前案例中因为GestureDetector和视频区域是完全重合的,故两个API获取到的数值是一样的。
如果当我们拿到的相对坐标的控件,和GestureDetector不完全一样的时候,就不能直接从details中取值了,就需要拿到对应控件都contex对象。
00