_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去做转换,这样在本案例中就可以拿到双击点距离视频区域的相对坐标了。



0
0

马超老师

2022-09-26

这个问题问的很好,首先给结论:在本案例中,两个API获取到的数值确实是一样的,但是仅仅是数值一样,意义是不一样的,下面详细说明一下。

details.globalPosition

以上代码中的details对象来自于GestureDetector,所以detail.globalPosition和details.localPosition获取到的是点击点的绝对坐标以及相对于GestureDetector控件的相对坐标。而我们需要的值准确说应该是点击点相对于视频区域的相对坐标。然而当前案例中因为GestureDetector和视频区域是完全重合的,故两个API获取到的数值是一样的。

如果当我们拿到的相对坐标的控件,和GestureDetector不完全一样的时候,就不能直接从details中取值了,就需要拿到对应控件都contex对象。


0
0

基于Flutter 3.x 实战跨平台仿抖音App混合开发

以短视频APP为例,快速上手原生/Flutter 混合开发

481 学习 · 120 问题

查看课程