加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

dart – Offset在onTap和OnDrag上有所不同 – Flutter

发布时间:2020-12-14 14:51:28 所属栏目:百科 来源:网络整理
导读:我有一个图像,其中某些项目有起始偏移及其高度和宽度,对应于图像中的每个项目我有不同的文本,我必须拖动文本并将其放到图像上的正确位置,我是在点击特定位置时获得不同的偏移量,同时拖动也会得到不同的偏移量.我怎样才能获得相同的偏移量? 这是我正在使用的
我有一个图像,其中某些项目有起始偏移及其高度和宽度,对应于图像中的每个项目我有不同的文本,我必须拖动文本并将其放到图像上的正确位置,我是在点击特定位置时获得不同的偏移量,同时拖动也会得到不同的偏移量.我怎样才能获得相同的偏移量?

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

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

关于形象.
?

enter image description here

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);
              });
            },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: Text(
                      'tree',feedback: Container(
                height: 10.0,child: Text(
                  'tree',);
  }

  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,'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,TapDownDetails details);

class TapImage extends StatelessWidget {
  TapImage({Key key,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);
  }
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读