yandex / yandex_maps_mapkit

Other
4 stars 2 forks source link

Предположительно неправильно работает screenToWorld #5

Open iddqd-dev opened 4 months ago

iddqd-dev commented 4 months ago

Пытаюсь реализовать рисование области пальцем. Либо некорректно работает преобазование в методе screenToWorld, либо я что-то делаю не так. zoom установленный по умолчанию.

import 'package:flutter/material.dart';
import 'package:yandex_maps_mapkit/mapkit.dart';
import 'package:yandex_maps_mapkit/yandex_map.dart';

class MainPage extends StatefulWidget {
  const MainPage({Key? key}) : super(key: key);

  @override
  State<MainPage> createState() => _MainPageState();
}

class _MainPageState extends State<MainPage> {
  MapWindow? _mapWindow;
  final List<Point> _polygonPoints = [];
  bool _isDrawing = false;

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: GestureDetector(
        onLongPressStart: _handleLongPressStart,
        onLongPressMoveUpdate: _handleLongPressMoveUpdate,
        onLongPressEnd: _handleLongPressEnd,
        child: YandexMap(
          onMapCreated: _onMapCreated,
        ),
      ),
    );
  }

  void _onMapCreated(MapWindow mapWindow) {
    _mapWindow = mapWindow;
  }

  void _handleLongPressStart(LongPressStartDetails details) {
    final RenderBox renderBox = context.findRenderObject() as RenderBox;
    print(renderBox.localToGlobal(details.globalPosition)); 
    final Point? point = _screenPointToMapPoint(renderBox.globalToLocal(details.globalPosition));
    setState(() {
      _polygonPoints.clear();
      _polygonPoints.add(point!);
      _isDrawing = true;
    });
  }

  void _handleLongPressMoveUpdate(LongPressMoveUpdateDetails details) {
    final RenderBox renderBox = context.findRenderObject() as RenderBox;
    final Point? point = _screenPointToMapPoint(renderBox.globalToLocal(details.localPosition));
    if (_isDrawing) {
      setState(() {
        _polygonPoints.add(point!);
      });
    }
  }

  Point? _screenPointToMapPoint(Offset localPosition) {
    final point = ScreenPoint(x: localPosition.dx, y: localPosition.dy);
    print(point);
    print(_mapWindow!.screenToWorld(point));
    return _mapWindow!.screenToWorld(point);
  }

  void _handleLongPressEnd(LongPressEndDetails details) {
    if (_isDrawing) {
      setState(() {
        _isDrawing = false;
        if (_polygonPoints.length > 3) {
          _drawPolygon();
        }
      });
    }
  }

  void _drawPolygon() {
    if (_mapWindow != null && _polygonPoints.isNotEmpty) {
      final polygon = Polygon(
        LinearRing(_polygonPoints), []
      );
      _mapWindow!.map.mapObjects.addPolygon(polygon);
    }
  }
}
I/flutter ( 7543): Offset(152.0, 362.1)
I/flutter ( 7543): ScreenPoint(x: 151.9950284090909, y: 362.14950284090907)
I/flutter ( 7543): Point(latitude: 78.99708352591344, longitude: 40.39708695628468)

в итоге область появляется ближе к верхнему левому углу при рисовании ближе к центру.