Flutter 如何在定位小部件中获得图像的偏移量,它比颤振中的设备大

Flutter 如何在定位小部件中获得图像的偏移量,它比颤振中的设备大,flutter,position,flutter-layout,gesture-recognition,Flutter,Position,Flutter Layout,Gesture Recognition,我正在努力做到这一点: SVG文件加载到画布上。OnPanUpdate im更改设备上图片的位置。我试图在这个svg上放置一些标记,但我无法获得正确的点击位置 小部件: @override Widget build(BuildContext context) { return GestureDetector( onLongPressEnd: _handlePutMarker, onPanUpdate: _handlePanUpdate, child

我正在努力做到这一点: SVG文件加载到画布上。OnPanUpdate im更改设备上图片的位置。我试图在这个svg上放置一些标记,但我无法获得正确的点击位置

小部件:

@override
  Widget build(BuildContext context) {
    return GestureDetector(
      onLongPressEnd: _handlePutMarker,
      onPanUpdate: _handlePanUpdate,
      child: Scaffold(
        backgroundColor: Colors.cyan[100],
        body: SafeArea(
          child: Container(
            height: double.infinity,
            width: double.infinity,
            child: Stack(
              overflow: Overflow.visible,
              children: <Widget>[
                Positioned(
                  key: _keyRed,
                  top: top - (MediaQuery.of(context).size.height / 4),
                  left: left - (MediaQuery.of(context).size.width / 6),
                  width: 100 * ratio,
                  child: FutureBuilder<DrawableRoot>(
                    future: svg.fromSvgString(rawSvg, rawSvg),
                    builder: (context, snapshot) {
                      if (snapshot.hasData) {
                        return CustomPaint(
                          painter: SvgPainter(snapshot.data, top, left, ratio,
                              markers, markerImage),
                        );
                      }
                      return Container();
                    },
                  ),
                ),
                Positioned(
                  left: 0,
                  top: 0,
                  child: Row(
                    children: <Widget>[
                      IconButton(
                        icon: Icon(Icons.add_circle_outline),
                        onPressed: _handleZoomIn,
                      ),
                      IconButton(
                        icon: Icon(Icons.remove_circle_outline),
                        onPressed: _handleZoomOut,
                      ),
                      IconButton(
                        icon: Icon(Icons.pause_circle_outline),
                        onPressed: () {
                          markers.removeLast();
                        },
                      ),
                    ],
                  ),
                ),
              ],
            ),
          ),
        ),
      ),
    );
  }
}
PutMarker:

void _handlePutMarker(LongPressEndDetails details) {
    setState(() {
      final RenderBox box = context.findRenderObject();
      final Offset localOffset = box.globalToLocal(details.globalPosition);

      markers.add(Offset(localOffset.dx, localOffset.dy));
    });
  }
画布:

@override
  void paint(Canvas canvas, Size size) async {
    try {
      size = Size(data.viewport.size.width, data.viewport.size.height);
      data.scaleCanvasToViewBox(canvas, Size(1000 * ratio, 1000 * ratio));
      data.draw(
        canvas,
        ColorFilter.srgbToLinearGamma(),
        Rect.fromLTWH(0, 0, 2148, 814),
      );

      Paint paint = Paint()..color = Colors.red;

      for (int i = 0; i < markers.length; i++) {
        canvas.drawImage(markerImage, markers[i], paint);
      }
@覆盖
无效绘制(画布,大小)异步{
试一试{
大小=大小(data.viewport.size.width,data.viewport.size.height);
scaleCanvasToViewBox(画布,大小(1000*比率,1000*比率));
data.draw(
帆布,
ColorFilter.srgbToLinearGamma(),
来自LTWH的矩形(0,0,2148,814),
);
油漆油漆=油漆()…颜色=颜色。红色;
for(int i=0;i
@override
  void paint(Canvas canvas, Size size) async {
    try {
      size = Size(data.viewport.size.width, data.viewport.size.height);
      data.scaleCanvasToViewBox(canvas, Size(1000 * ratio, 1000 * ratio));
      data.draw(
        canvas,
        ColorFilter.srgbToLinearGamma(),
        Rect.fromLTWH(0, 0, 2148, 814),
      );

      Paint paint = Paint()..color = Colors.red;

      for (int i = 0; i < markers.length; i++) {
        canvas.drawImage(markerImage, markers[i], paint);
      }