Android - osmbonuspack - как повернуть название маркера на карте

Моя карта (osmbonuspack) поворачивается в направлении ходьбы.

Как я могу повернуть название маркера на карте, чтобы они были горизонтальными, т.е. удобными для чтения? Я вижу, что сам маркер не нуждается ни в каком вращении при переворачивании карты.

Любое изменение направления ходьбы приведет к правильному повороту карты с помощью:

mapview.setMapOrientation( (float) -headingByCompass);

Поэтому при любом изменении я сначала нахожу все маркеры на карте. Затем я попытался их повернуть... но направление заголовка осталось прежним.

marker.setRotation( rotation);

Чтобы быть уверенным: речь идет о тексте, который находится возле перевернутой глазной капли. Это не информация в пузыре.


person tm1701    schedule 29.07.2015    source источник


Ответы (2)


Сам маркер не имеет прикрепленной к нему этикетки. Итак, я создал подкласс Marker под названием MarkerWithLabel. В этом подклассе рисуется заголовок или метка.

Когда карта поворачивается, поворот впоследствии передается всем объектам MarkerWithLabel. Последующая недействительность в представлении карты сделает изменения видимыми. Таким образом, маркеры и этикетки всегда расположены горизонтально для удобства чтения.

Класс MarkerWithLabel это:

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;
    }
}

Надеюсь, это поможет вам.

person tm1701    schedule 31.07.2015

Поскольку OSMBonusPack Marker пытается имитировать API Карт Google, вы можете обратиться к https://developers.google.com/maps/documentation/android/marker

=> У вас будет описание плоской / рекламной ориентации и вращения.

Если вы просто хотите, чтобы маркер был выровнен по экрану, это поведение по умолчанию, просто ничего не делайте (без поворота).

Кстати, что вы называете "заголовком маркера"? Название, показанное в пузыре?

person MKer    schedule 30.07.2015
comment
marker.setRotation... действительно не нужен, пока вид карты вращается. Название рядом с маркером (так перевернутая глазная капля) не «читается», так как оно поворачивается так же, как и карта. Итак, я не имею в виду информацию о пузыре. Таким образом, как перевернутый маркер глазной капли всегда отображается правильно, точно так же я хотел бы, чтобы текст отображался горизонтально. - person tm1701; 30.07.2015
comment
Ну... так как OSMBonusPack Marker отображает заголовок рядом с маркером, я предполагаю, что у вас была проблема в вашем собственном MarkerWithLabel. Но я вижу, вы также решили свою проблему :-) - person MKer; 31.07.2015
comment
Да, @MKer, спасибо! И я все еще учусь ;-) Больше года я наслаждаюсь Osmdroid и Osmbonuspack. - person tm1701; 01.08.2015