如何通过Flutter检测用户在屏幕上的位置?

Set*_*add 4 dart flutter

我想知道屏幕上点击的x/y坐标.我找到了GestureDetector,但似乎并没有告诉我龙头究竟在哪里发生.

到目前为止,这是我的代码:

import 'package:flutter/material.dart';

void main() {
  runApp(new MyWidget());
}

class MyWidget extends StatelessWidget {

  @override
  Widget build(BuildContext context) {
    return new GestureDetector(
      onTap: () => print('tapped!')
    );
  }
}
Run Code Online (Sandbox Code Playgroud)

这确实注册一个水龙头......但我怎么发现那里的自来水从开始的?

Bra*_*don 11

观察onTapDown和onTapUp,它们提供了更多细节供您使用.

class MyWidget extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return new GestureDetector(
      onTap: () => print('tapped!'),
      onTapDown: (TapDownDetails details) => _onTapDown(details),
      onTapUp: (TapUpDetails details) => _onTapUp(details),
    );
  }

  _onTapDown(TapDownDetails details) {
    var x = details.globalPosition.dx;
    var y = details.globalPosition.dy;
    print("tap down " + x.toString() + ", " + y.toString());
  }

  _onTapUp(TapUpDetails details) {
    var x = details.globalPosition.dx;
    var y = details.globalPosition.dy;
    print("tap up " + x.toString() + ", " + y.toString());
  }
}
Run Code Online (Sandbox Code Playgroud)

  • 不要忘记您可以使用context.findRenderObject()将位置转换为本地坐标.globalToLocal(details.globalPosition); (4认同)
  • onTap适用于您不关心位置的常见情况.如果onTap处理程序接受了一个参数,那么每个人的onTap处理程序都会有一个被忽略的参数,这会增加复杂性和认知开销.onTapDown和onTapUp用于边缘情况,你想要做的事情比仅仅检测触摸更有趣. (2认同)
  • 但手势检测器上有 8 个点击处理程序会进一步增加认知开销。我怀疑额外的参数会产生很大的影响。 (2认同)