草庐IT

dart - 偏移量是不同的 onTap 和 OnDrag - Flutter

coder 2023-05-09 原文

我有一个图像,其中某些项目具有起始偏移量及其高度和宽度,对应于图像中的每个项目我有不同的文本,我必须将文本拖放到图像上的正确位置,我在点击特定位置时得到不同的偏移量,在拖动时我也得到不同的偏移量。如何获得相同的偏移量?

这是我正在使用的代码和图像。这些是树的细节

x=673
y=635
h=214
w=149

关于图像。

class Home extends StatefulWidget {
  @override
  _HomeState createState() => _HomeState();
}

class _HomeState extends State<Home> {
  ImageInfo _imageInfo;
  AssetImage assestImage;
  double dx;
  double dy;
  Offset dragOffset;
  @override
  void initState() {
    super.initState();
    assestImage = AssetImage('assets/hospital.jpg');
    WidgetsBinding.instance.addPostFrameCallback((a) => _getImageInfo());
  }

  void _getImageInfo() async {
    Image image = new Image.asset('assets/hospital.jpg');
    image.image
        .resolve(new ImageConfiguration())
        .addListener((ImageInfo info, bool _) {
      _imageInfo = info;
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Container(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.spaceEvenly,
          children: <Widget>[
            DragTarget(
                onAccept: (Offset dragOffset) {},
                builder: (
                  BuildContext context,
                  List<dynamic> accepted,
                  List<dynamic> rejected,
                ) {
                  return TapImage(
                    onTap: (Offset offset) {
                      print('Offset on Tapping the image is $offset');
                      dx = offset.dx * _imageInfo.image.width;
                      dy = offset.dy * _imageInfo.image.height;
                      if (_imageInfo != null) {
                        print('Image clicked: ${dx.toInt()} x ${dy.toInt()}');
                        if ((673 <= dx && dx <= 822) &&
                            (635 <= dy && dy <= 849)) {
                          print('you drop in tree');
                        } else {}
                      }
                    },
                    image: assestImage,
                  );
                }),
            Draggable(
                dragAnchor: DragAnchor.pointer,
                onDragEnd: (details) {
                  setState(() {
                    dragOffset = details.offset;
                  });
                  print('dragoffset in onDrag Method is  $dragOffset');
                },
                data: dragOffset,
                child: Container(
                    color: Colors.green,
                    child: Text(
                      'Tree',
                      style: TextStyle(fontSize: 30.0),
                    )),
                feedback: Container(
                  height: 10.0,
                  child: Text(
                    'Tree',
                    style: TextStyle(fontSize: 15.0),
                  ),
                )),
          ],
        ),
      ),
    );
  }
}

typedef void OnTapLocation(Offset offset);

class TapImage extends StatelessWidget {
  TapImage({Key key, this.onTap, this.image}) : super(key: key);

  final OnTapLocation onTap;
  final ImageProvider image;

  @override
  Widget build(BuildContext context) {
    return GestureDetector(
      onTapDown: (TapDownDetails details) => _onTap(details, context),
      onLongPress: () {},
      child: Image(image: AssetImage('assets/hospital.jpg')),
    );
  }

  void _onTap(TapDownDetails details, BuildContext context) {
    RenderBox getBox = context.findRenderObject();
    Offset local = getBox.globalToLocal(details.globalPosition);
    print('locla ois $local');
    onTap(Offset(local.dx / getBox.size.width, local.dy / getBox.size.height));
  }
}

最佳答案

它对我有用

class _HomeState extends State<Home> {
  ImageInfo _imageInfo;
  AssetImage assestImage;
  double getheight;
  double getywidth;

  Offset dragOffset;
  @override
  void initState() {
    super.initState();
    assestImage = AssetImage('assets/hospital.jpg');
    WidgetsBinding.instance.addPostFrameCallback((a) => _getImageInfo());
  }

  void _getImageInfo() async {
    Image image = new Image.asset('assets/hospital.jpg');
    image.image
        .resolve(new ImageConfiguration())
        .addListener((ImageInfo info, bool _) {
      _imageInfo = info;
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Container(
          child: Column(
        children: <Widget>[
          TapImage(
            onTap: (Offset offset, RenderBox getBox, TapDownDetails details) {
              double dx;
              double dy;
              dx = offset.dx * _imageInfo.image.width;
              dy = offset.dy * _imageInfo.image.height;
              setState(() {
                dragEnd(dx, dy);
              });
            },
            image: assestImage,
          ),
          Draggable(
              dragAnchor: DragAnchor.pointer,
              onDragStarted: () {
                WidgetsBinding.instance
                    .addPostFrameCallback((_) => setState(() {
                          RenderBox getBox = context.findRenderObject();
                          getheight = getBox.size.height;
                          getywidth = getBox.size.width;
                        }));
              },
              onDragEnd: (details) {
                double dx;
                double dy;
                dx = (details.offset.dx / getywidth) * _imageInfo.image.width;
                dy =
                    ((details.offset.dy) / getywidth) * _imageInfo.image.height;
                setState(() {
                  dragEnd(dx, dy);
                });
              },
              child: Padding(
                padding: const EdgeInsets.only(top: 28.0),
                child: Container(
                    color: Colors.green,
                    child: Text(
                      'tree',
                      style: TextStyle(fontSize: 30.0),
                    )),
              ),
              feedback: Container(
                height: 10.0,
                child: Text(
                  'tree',
                  style: TextStyle(fontSize: 15.0),
                ),
              )),
        ],
      )),
    );
  }

  void dragEnd(double dx, double dy) {
    if (_imageInfo != null) {
      if ((673 <= dx && dx <= 822) && (635 <= dy && dy <= 849)) {
        showDialog(
          context: context,
          builder: (context) {
            return _textDescriptionDialog(
              context,
              'Drag on tree',
            );
          },
        );
      } else {
        showDialog(
          context: context,
          builder: (context) {
            return _textDescriptionDialog(
              context,
              'Drag outside',
            );
          },
        );
      }
    }
  }

  Widget _textDescriptionDialog(BuildContext context, String text) {
    return new FractionallySizedBox(
        heightFactor: MediaQuery.of(context).orientation == Orientation.portrait
            ? 0.5
            : 0.8,
        widthFactor: MediaQuery.of(context).orientation == Orientation.portrait
            ? 0.8
            : 0.4,
        child: Card(
          shape: RoundedRectangleBorder(
            borderRadius: BorderRadius.all(
              Radius.circular(20.0),
            ),
          ),
          child: Container(child: Center(child: Text(text))),
        ));
  }
}

typedef void OnTapLocation(
    Offset offset, RenderBox getBox, TapDownDetails details);

class TapImage extends StatelessWidget {
  TapImage({Key key, this.onTap, this.image}) : super(key: key);

  final OnTapLocation onTap;
  final ImageProvider image;

  @override
  Widget build(BuildContext context) {
    return GestureDetector(
      onTapDown: (TapDownDetails details) => _onTap(details, context),
      child: Image(image: AssetImage('assets/hospital.jpg')),
    );
  }

  void _onTap(TapDownDetails details, BuildContext context) {
    RenderBox getBox = context.findRenderObject();
    print('size is ${getBox.size}');
    Offset local = getBox.globalToLocal(details.globalPosition);
    print('local is $local');
    onTap(Offset(local.dx / getBox.size.width, local.dy / getBox.size.height),
        getBox, details);
  }
}

关于dart - 偏移量是不同的 onTap 和 OnDrag - Flutter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55018479/

有关dart - 偏移量是不同的 onTap 和 OnDrag - Flutter的更多相关文章

  1. ruby - 如何将相同的相邻数字分组 - 2

    如果至少有两个相邻的数字相同,格式为,我需要打包.这是我的输入:[2,2,2,3,4,3,3,2,4,4,5]以及预期的输出:"2:3,3,4,3:2,2,4:2,5"到目前为止我试过:a=[1,1,1,2,2,3,2,3,4,4,5]a.each_cons(2).any?do|s,t|ifs==t如果相等,也许可以尝试计数器,但那是行不通的。 最佳答案 您可以使用Enumerable#chunk_while(如果你使用的是Ruby>=2.3):a.chunk_while{|a,b|a==b}.flat_map{|chunk|chu

  2. ruby - 如何从二进制数据的偏移量开始读取? - 2

    我有一个类似C的结构:SomeStruct:lenVarsstring:namestring:lname#...end我在:Person之前有一堆偏移量和长度。所有偏移量和长度都描述了:Person结构中的数据。如何从指定的偏移量、给定的长度或直到下一个偏移量开始读取数据? 最佳答案 寻求偏移1234,然后将32个字节读入Strings:open'some-binary-file','r'do|f|f.seek1234s=f.read32#thoinyourcase,somethinglike:o=aBinData_object.r

  3. Flutter 环境变量配置和flutter doctor中的错误解决 - 2

    一、环境变量右键点击我的电脑-属性:然后找到环境变量 1.Android的SDK不在C盘的话需要额外配这个到用户环境变量:ANDROID_HOMED:\AndroidSDK2.然后在系统变量:Path中添加一条这样的值        D:\Flutter\flutter\bin             这个值写flutter包解压的实际地址即可 3.在系统变量中添加两个镜像变量:        变量名:FLUTTER_STORAGE_BASE_URL      变量值:https://storage.flutter-io.cn        变量名:PUB_HOSTED_URL      变量

  4. ruby-on-rails - 常量化通过浏览器提交的参数是不好的做法吗? - 2

    我有一个单表继承设置,我有一个Controller(我觉得有多个Controller会重复)。但是,对于某些方法,我想调用模型的子类。我想我可以让浏览器发送一个参数,我会针对该参数编写一个case语句。像这样的东西:case@model[:type]when"A"@results=Subclass1.search(params[:term])when"B"@results=Subclass2.search(params[:term])...end或者,我了解到Ruby的所有技巧都可以用字符串创建模型。像这样的东西:@results=params[:model].constantize.

  5. ruby - "begin"和 "end"是不是保留字? - 2

    我对Ruby中的保留字有点困惑。Matz与人合着的《TheRubyProgrammingLanguage》说begin和end是语言的保留字。它们肯定在句法上用于标记block。但是,该语言中的范围对象具有名为begin和end的方法,如(1..10).end=>10现在,对此进行测试,我发现我确实可以在对象上定义名为“begin”和“end”的方法,但如果我尝试将变量命名为“begin”,它会失败。(这里有一个使用它作为方法名的示例,它确实有效......:)classFoodefbeginputs"hi"endendFoo.new.begin所以,我想我是在问,像这样的保留字的实际

  6. ruby - 将相同的方法添加到多个类 - 2

    我有一些代码可以计算数字的n次方根。现在,该方法仅适用于Fixnum,因为我在Fixnum类中定义了它。这样做会很容易classFloat#samecodeaswasinFixnumend但这似乎是不必要的。我不知道如何动态调用类。我试过:classes=[Fixnum,Float]classes.eachdo|x|x.instance_evaldodefroot(pow)returnself**(1/pow.to_f)endendend但这没有用。我该怎么做呢?注意:发布后,我意识到这可能更适合Programmers.SE,因为它是理论上的,并且是基于单一问题的。随意相应地迁移...

  7. ruby - 在 object.initialize 中,使用 self 是不是更好。超过 @? - 2

    有一种约定,在可能的情况下,通过对象的实例变量来引用对象的属性。PracticalObject-OrientedDesigninRuby说:Alwayswrapinstancevariablesinaccessormethodsinsteadofdirectlyreferringtovariables...这显示了一个例子,我已经释义了:classGearattr_reader:chainring,:cog...defratio#thisisbad#@chainring/@cog.to_f#thisisgoodchainring/cog.to_fend我看到使用实例变量创建新对象的最常

  8. ruby-on-rails - 从不同的 PC 访问 WEBrick - 2

    我用过:railssrunwebrickon0.0.0.0:3000但我无法从另一台PC访问Web应用程序。如何在Rails3中实现这一点? 最佳答案 默认绑定(bind)IP为0.0.0.0,因此问题可能是您的防火墙阻止了该端口。尝试使用railss-bIP_ADDRESS-pPORT以确保问题出在您的防火墙上。顺便说一句。Linux、OSX、Windows? 关于ruby-on-rails-从不同的PC访问WEBrick,我们在StackOverflow上找到一个类似的问题:

  9. ruby-on-rails - 如何在 rails 中的数组中指定限制和偏移量? - 2

    我有3个表PostText、PostImage和PostVideo。现在,我将上述所有三个表中的数据合并到一个名为userposts的数组中。现在从userposts我只想访问从偏移量15开始的10条记录。我该怎么做?我尝试了userposts.first(10)。它给了我前10条记录,但我想要从offset-15开始的10条记录。提前致谢。 最佳答案 userposts.drop(15).first(10)会帮助你 关于ruby-on-rails-如何在rails中的数组中指定限制和偏

  10. ruby - 在 Ruby 中获取 UTC 偏移量 - 2

    我正在尝试获取日期时间的UTC偏移量。日期时间保存为:Fri,31May201315:19:08EDT-04:00我想要得到的是"-04:00"。当我执行object.utc_offset时,我得到-14400。我应该使用什么功能? 最佳答案 您正在寻找strftime:Time.now.strftime("%:z")这将为您提供诸如“-04:00”之类的偏移量。 关于ruby-在Ruby中获取UTC偏移量,我们在StackOverflow上找到一个类似的问题:

随机推荐