Здравствуйте!
В этом сообщении опишу включение функции вращения карты в приложении использующем Yandex Map Kit for Android. Сообщение написано по мотивам Issue #99, которое осталось без решения.
Маленькое отступление. Начать работать с картой по описанию в разделе 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); // разрешаем вращение
Результат
Автор: constv