Yandex Map Kit for Android. Поворот карты

в 18:11, , рубрики: android, Разработка под android, метки:

Здравствуйте!
В этом сообщении опишу включение функции вращения карты в приложении использующем Yandex Map Kit for Android. Сообщение написано по мотивам Issue #99, которое осталось без решения.

Yandex Map Kit for Android. Поворот карты

Маленькое отступление. Начать работать с картой по описанию в разделе Wiki «Как начать работу» не удалось. Приложение падало при старте с ошибкой «Caused by: android.view.InflateException: Binary XML file line #7: Error inflating class ru.yandex.yandexmapkit.MapView». Помогло подключение к проекту classes.jar, располагается в yandexmapkit-librarylibs.

Как и у автора Issue #99 метод МapController setRotateAnimtionTo повернул карту, но вместо тайлов карты получил тайлы с надписью «Для этого участка нет данных».

Воспользовавшись подсказкой поддержки

По вращение оно делалось для моего место положения и как бы представляет внутрений функционал.
Проблема у Вас в повороте это то что не выставлена точка центра вращение. Но все эти АПИ пока увы закрыты

исследовал класс MyLocationOverlay(байт код можно посмотреть в Eclipse), были найдены следующие строчки

    223  aload_0 [this]
    224  invokevirtual ru.yandex.yandexmapkit.overlay.location.MyLocationOverlay.f() : boolean [168]
    227  ifeq 258
    230  aload_0 [this]
    231  getfield ru.yandex.yandexmapkit.overlay.location.MyLocationOverlay.y : al [78]
    234  aload_0 [this]
    235  invokevirtual ru.yandex.yandexmapkit.overlay.location.MyLocationOverlay.getMyLocationItem() : ru.yandex.yandexmapkit.overlay.location.MyLocationItem [171]
    238  invokevirtual ru.yandex.yandexmapkit.overlay.location.MyLocationItem.getBearing() : float [154]
    241  invokevirtual al.a(float) : void [79]
    244  aload_0 [this]
    245  getfield ru.yandex.yandexmapkit.overlay.location.MyLocationOverlay.y : al [78]
    248  aload_0 [this]
    249  invokevirtual ru.yandex.yandexmapkit.overlay.location.MyLocationOverlay.getMyLocationItem() : ru.yandex.yandexmapkit.overlay.location.MyLocationItem [171]
    252  invokevirtual ru.yandex.yandexmapkit.overlay.location.MyLocationItem.getPoint() : cp [156]
    255  invokevirtual al.a(cp) : void [80]
    258  aload_0 [this]
    259  invokevirtual ru.yandex.yandexmapkit.overlay.location.MyLocationOverlay.getMapController() : ru.yandex.yandexmapkit.MapController [170]
    262  invokevirtual ru.yandex.yandexmapkit.MapController.notifyRepaint() : void [140]

где al — это то, что возвращает метод MapController getMapRotator(). MyLocationItem — расширение OverlayItem, метод getPoint() которого наследуется в MyLocationItem (потребуется для получения недоступного экземпляра класса cp). Увидев все это, нетрудно догадаться, что метод класса al a(cp point) задает координаты оси вокруг которой вращается карта, а al.a(float bearing) угол поворота. У класса al (напомню, что экземпляр получен методом getMapRotator() класса MapController ) есть еще один метод a(boolean enableRotation) относительно которого была догадка, что он разрешает вращение карты, которая впоследствии подтвердилась.

Теперь все готово, чтобы вращать карту, например, при изменении азимута. Как получать значения азимута при изменении положения устройства в пространстве хорошо описано в книге. Остается только вставить в обработчик события изменения азимута следующий код

        GeoPoint geoPoint = mMapController.getMapCenter(); //получает географические координаты центра карты
        OverlayItem overlayItem = new OverlayItem(geoPoint, null); // необходимо для получения недоступного экземпляра класса cp,  представляет внутренние координаты центра карты библиотеки
        mMapController.getMapRotator().a(bearing); //задаем угол поворота
        mMapController.getMapRotator().a(overlayItem.getPoint()); //задаем точку относительно которой производится вращение

где

        MapController mMapController;
        MapView mMapView;

        mMapView = (MapView) findViewById(R.id.map);
        mMapController = mMapView.getMapController();
        mMapController.getMapRotator().a(true); // разрешаем вращение

Результат

Yandex Map Kit for Android. Поворот карты

Автор: constv

Источник

Поделиться

* - обязательные к заполнению поля