如何使用Flutter检测用户在屏幕上的点击位置?

29

我希望知道屏幕上发生点击事件的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!')
    );
  }
}

它确实记录了水龙头的点击... 但我怎样才能找出水龙头是从哪里开始的呢?

2个回答

52

观察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;
    // or user the local position method to get the offset
    print(details.localPosition);
    print("tap down " + x.toString() + ", " + y.toString());
  }

  _onTapUp(TapUpDetails details) {
    var x = details.globalPosition.dx;
    var y = details.globalPosition.dy;
    // or user the local position method to get the offset
    print(details.localPosition);
    print("tap up " + x.toString() + ", " + y.toString());
  }
}

好问题。你应该要求他们提供详细信息,而不是空着回答。 :) - Brandon
4
onTap 是用于通常情况下不关心位置的情况。如果 onTap 处理程序带有一个参数,每个人在其 onTap 处理程序中都将具有一个被忽略的参数,这会增加复杂性和认知负担。onTapDown 和 onTapUp 则适用于那些想要执行比仅检测触摸更复杂操作的边缘情况。 - Collin Jackson
8
别忘了你可以使用 context.findRenderObject().globalToLocal(details.globalPosition) 将位置转换为本地坐标。 - Collin Jackson
2
但是,如果在手势检测器上有8个触发处理程序,认知负荷会增加得更多。我怀疑额外的参数不会有太大的差异。 - DarkNeuron
@Brandon,单击坐标怎么样? - Mukta

1

使用以下方式中的onTapDown属性:

  onTapDown: (details) {
    var position = details.globalPosition;
    print(position.dx);
    print(position.dy);             
  }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接