Android 当地图旋转时,将标记旋转到设备标题的精确位置。

Android 当地图旋转时,将标记旋转到设备标题的精确位置。,android,openstreetmap,mapsforge,Android,Openstreetmap,Mapsforge,使用新版本的mapsforge 0.5.1,贴图可以使用onSensorChanged事件进行精细旋转。我在onLocationChanged事件的GPS点添加了一个自定义GPS位置标记。当地图旋转时,标记也会旋转指向设备标题,就像在谷歌地图中使用标记绘制方法中的以下代码一样 android.graphics.Canvas androidCanvas = AndroidGraphicFactory.getCanvas(canvas); androidCanvas.save(); Float px

使用新版本的mapsforge 0.5.1,贴图可以使用onSensorChanged事件进行精细旋转。我在onLocationChanged事件的GPS点添加了一个自定义GPS位置标记。当地图旋转时,标记也会旋转指向设备标题,就像在谷歌地图中使用标记绘制方法中的以下代码一样

android.graphics.Canvas androidCanvas = AndroidGraphicFactory.getCanvas(canvas);
androidCanvas.save();
Float px = (float) canvas.getWidth()/2;
Float py = (float) canvas.getHeight()/2;
androidCanvas.rotate(degree, px, py);
canvas.drawBitmap(bitmap, left, top);
androidCanvas.restore();

但是,当拖动地图时,标记的位置会与GPS位置的上一点失去方向


如何计算px和py值,使标记保持在地图上GPS位置的精确点上,即使地图正在旋转,标记也指向设备标题。

我知道它有点旧,但为了将来的研究,我找到了一个解决方案:

  • 首先扩展mapsforge标记并重写其draw()方法
  • 从标记复制粘贴绘制方法的内容
  • 然后在最后一个条件中添加以下内容:
替换此项: 为此: 在我的例子中,“方位”是我的类扩展标记的一个成员变量,我在前面的代码(gps位置)中从两个不同的位置设置了它。你可以用任何适合你需要的角度来替换它

if(canvasRectangle.intersects(bitmapRectangle)) {
    canvas.drawBitmap(bitmap, left, top);
}
if(canvasRectangle.intersects(bitmapRectangle)) {
    // Rotate the marker based on bearing for example (or whatever angle you want)
    android.graphics.Canvas androidCanvas = AndroidGraphicFactory.getCanvas(canvas);
    androidCanvas.save();

    float px = (right + left) / 2f;
    float py = (bottom + top) / 2f;

    androidCanvas.rotate(bearing, px, py);
    canvas.drawBitmap(bitmap, left, top);
    androidCanvas.restore();
}