Android - osmbonuspack - 如何在地图上旋转标记标题

Android - osmbonuspack - how to rotate the marker title on the map

我的地图视图 (osmbonuspack) 旋转到步行方向。

如何在地图上旋转标记的标题,使其水平 - 即易于阅读?我看到在地图转动时标记本身不需要任何旋转。

步行方向的任何变化都会导致地图向右旋转:

mapview.setMapOrientation( (float) -headingByCompass);

因此,在进行任何更改时,我首先会在地图视图上找到所有标记。然后我尝试旋转它们......但标题方向仍然相同。

marker.setRotation( rotation);

可以肯定的是:这是关于倒置眼药水附近的文字。这不是气泡中的信息。

由于OSMBonusPack Marker试图模仿Google地图API,您可以参考https://developers.google.com/maps/documentation/android/marker

=> 您将获得平面/广告​​牌方向和旋转的描述。

如果您只是想让标记与屏幕对齐,这是默认行为,什么都不做(不旋转)。

顺便说一句,你叫 "Marker title" 什么?气泡中显示的标题?

标记本身没有附加标签。因此,我创建了一个名为 MarkerWithLabel 的 Marker 子class。在这个 subclass 中绘制了标题或标签。

当地图旋转时,旋转随后传递给所有MarkerWithLabel objects。地图视图上的后续无效将使更改可见。因此,标记和标签始终是水平的,以便于阅读。

MarkerWithLabel class它:

public class MarkerWithLabel extends Marker {
    Paint textPaint = null; 
    String mLabel = null; 
    float rotation = 0.0f;

    public MarkerWithLabel( MapView mapView, String label) {
        super( mapView);
        mLabel = label; 
        textPaint = new Paint();
        textPaint.setColor( Color.RED);
        textPaint.setTextSize( WaypointActivity.textSizeCanvas25sp);
        textPaint.setAntiAlias(true);
        textPaint.setTextAlign(Paint.Align.LEFT);
        setTitle( label);
    }
    public void draw( final Canvas c, final MapView osmv, boolean shadow) {
        draw( c, osmv); 
    }
    public void draw( final Canvas c, final MapView osmv) {
        super.draw( c, osmv, false); 
        Point p = this.mPositionPixels;  // already provisioned by Marker
        if( rotation <= -1 || rotation >= 1) { // could be left out
            c.save();
            c.rotate( rotation, p.x, p.y);
            c.drawText( getTitle(), p.x, p.y+20, textPaint);
            c.restore();
        } else { 
            c.drawText( getTitle(), p.x, p.y+20, textPaint); 
        }
    }
}

查找所有 MarkerWithLabel 实例很容易:

List<Overlay> markersOnTheMap = mv.getOverlays();
if( markersOnTheMap == null || markersOnTheMap.isEmpty()) { 
    return ; 
}
for( int i = 0; i < markersOnTheMap.size(); i++) { 
    Object o = markersOnTheMap.get( i);
    if( o instanceof MarkerWithLabel) {
        MarkerWithLabel m = (MarkerWithLabel) o;
        m.rotation = rotation;
    }
}

希望对您有所帮助。