如何将指南针的方向捕捉到Map的方向?
我将指南针添加到MapView并启用Map旋转,如下所示:
MapView mapView = findViewById(R.id.mapView);
// Enable & add compass
CompassOverlay compassOverlay = new CompassOverlay(this, mapView);
compassOverlay.enableCompass();
mapView.getOverlays().add(compassOverlay);
// Enable map rotation with gestures
mapView.getOverlays().add(new RotationGestureOverlay(mapView));
现在,当Map不旋转时,向上是北,向右是东等,指南针工作正常。但当我用手势旋转Map时,指南针并不随之移动。因此,当设备面向北,Map处于默认旋转时,指南针根据Map显示北,这是正确的。但当我顺时针旋转Map90°时,指南针仍然指向上方而不是顺时针转动90°。
我尝试使用compassOverlay.setPointerMode(true);
,但这只改变了指南针的外观。
2条答案
按热度按时间cygmwpex1#
我修改了我之前的回答:指南针似乎只能在实际的硬件上工作。
请参阅:Adding Compass to Rotate MapView
dsekswqp2#
这篇文章https://github.com/osmdroid/osmdroid/issues/1647有解决方案。从那里复制,轻编辑...
1.创建新类:
MapAlignedCompassOverlay.java
,它只是类www.example.com的副本/重命名CompassOverlay.java,更改包名以匹配您的包,并将类名更改为MapAlignedCompassOverlay
。1.将函数
drawCompass()
中的一行从mCompassMatrix.setRotate(-bearing, mCompassRoseCenterX, mCompassRoseCenterY);
更改为mCompassMatrix.setRotate(proj.getOrientation(), mCompassRoseCenterX, mCompassRoseCenterY);
1.在设置代码中(例如
onCreate
,如果您在Activity中),使用MapAlignedCompassOverlay
替换我的应用中的CompassOverlay
,并且只给予它一个假的OrientationProvider来使它满意。例如(Kotlin):现在你有了一个与Map匹配的指南针。注意为了演示这一点,你可以用
并观察旋转时指南针是否仍指向(真)北。