2017-10-04 421 views
0

我想在触摸坐标上显示一个弹出框。我使用堆栈和定位小部件来放置弹出窗口。如何计算#flutter中的触摸坐标?

+1

我增加了一个回答你的问题有关显示的触摸事件后弹出,我建议你让你的文章更加清晰,因为它现在有点混乱,标题和正文都不清楚,好像还不到相互关联。 – aziza

+0

@aziza我想在触摸屏幕的那些坐标处显示一个弹出窗口。 – AjayKumar

+0

@aziza例如,如果屏幕是图形,那么如果我触摸(15,15)点,那么弹出应该显示在(15,15).... – AjayKumar

回答

1

您可以添加一个GestureDetector作为堆栈的父级,并注册onTapDownDetails侦听器。这应该在每个减量事件中调用您的监听器,并在您的监听器的参数TapDownDetails中使用全局偏移量。

下面是演示相同的示例代码。

import 'package:flutter/material.dart'; 

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

class MyApp extends StatelessWidget { 
    @override 
    Widget build(BuildContext context) { 
    return new MaterialApp(
     title: 'Flutter Demo', 
     home: new MyHomePage(), 
    ); 
    } 
} 

class MyHomePage extends StatefulWidget { 
    @override 
    MyHomePageState createState() => new MyHomePageState(); 
} 

class MyHomePageState extends State<MyHomePage> { 
    @override 
    Widget build(BuildContext context) { 
    return new Scaffold(
     appBar: new AppBar(
      title: new Text('Popup Demo'), 
     ), 
     body: new MyWidget()); 
    } 
} 

class MyWidget extends StatefulWidget { 
    @override 
    State<StatefulWidget> createState() { 
    return new MyWidgetState(); 
    } 
} 

class MyWidgetState extends State<MyWidget> { 
    double posx = 100.0; 
    double posy = 100.0; 

    void onTapDown(BuildContext context, TapDownDetails details) { 
    print('${details.globalPosition}'); 
    final RenderBox box = context.findRenderObject(); 
    final Offset localOffset = box.globalToLocal(details.globalPosition); 
    setState(() { 
     posx = localOffset.dx; 
     posy = localOffset.dy; 
    }); 
    } 

    @override 
    Widget build(BuildContext context) { 
    return new GestureDetector(
     onTapDown: (TapDownDetails details) => onTapDown(context, details), 
     child: new Stack(fit: StackFit.expand, children: <Widget>[ 
     // Hack to expand stack to fill all the space. There must be a better 
     // way to do it. 
     new Container(color: Colors.white), 
     new Positioned(
      child: new Text('hello'), 
      left: posx, 
      top: posy, 
     ) 
     ]), 
    ); 
    } 
}