我如何将指南针的方向与地图的方向对齐?
我将罗盘添加到我的MapView并启用地图旋转,如下所示:
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));
现在,当地图不旋转时,向上是北方,右边是东方等,指南针可以正常工作。但是,当我用手势旋转地图时,指南针不会相应移动。因此,当设备朝北且地图处于默认旋转位置时,指南针会根据地图向北显示,这是正确的。但是,当我将地图顺时针旋转90°时,指南针仍然指向上方,而不是顺时针旋转90°。
我尝试使用compassOverlay.setPointerMode(true);
,但这仅改变了指南针的外观。
旧问题-我将此答案发布给任何有兴趣的读者。我不知道这是否是正确的方法,但是它有效,我找不到更好的方法。您可以修改azimuthOffset,比方说每0.1秒:
val icop = InternalCompassOrientationProvider(applicationContext)
val co = CompassOverlay(applicationContext, icop, mapView)
co.enableCompass()
mapView.overlays.add(co)
Timer().scheduleAtFixedRate(object : TimerTask() {
override fun run() {
co.azimuthOffset = - mapView.mapOrientation
}
}, 0, 100 /*millisecs*/)
((也许您可以根据mapView上的某些旋转事件来更改指南针的方向,而不是在固定的时间间隔,但是我还没有找到方法。)
如果您扩展CompassOverlay,也可以通过按指南针来重置地图的方向。
class MyCompassOverlay(context: Context, icop: InternalCompassOrientationProvider,
mapView: MapView): CompassOverlay(context, icop, mapView) {
private lateinit var onSingleTapConfirmedFunction: () -> Unit
private var rawXYLimit: Float = 0f
init {
rawXYLimit = 0.8f /*inches*/ * mCompassRoseBitmap.density /*DPI*/
}
override fun onSingleTapConfirmed(e: MotionEvent?, mapView: MapView?): Boolean {
e?.run {
if (rawX < rawXYLimit && rawY < rawXYLimit) {
onSingleTapConfirmedFunction()
}
}
return super.onSingleTapConfirmed(e, mapView)
}
fun setOnSingleTapConfirmedFunction(function: () -> Unit) {
onSingleTapConfirmedFunction = function
}
}
和
val co = MyCompassOverlay(applicationContext, icop, mapView)
...
co.setOnSingleTapConfirmedFunction {
mapView.mapOrientation = 0f
}
rawXYLimit字段用于将动作限制在指南针区域。在这里,您当然也可以找到更好的计算方法。