2009-11-12 15 views
31

Próbuję narysować tekst na MapView na Androida. Rysowanie tekstu jest w porządku, ale bardzo trudno jest odczytać tekst, ponieważ jest biały bez czarnej granicy (podobnie jak reszta tekstu, który pojawia się naturalnie w MapViews w celu oznaczenia miast, stanów i krajów). Nie mogę sobie wyobrazić, jak narysować tekst czarną obwódką. Czy ktoś wie, jak to zrobić?Jak narysować tekst z obramowaniem na MapView w systemie Android?

Jest to rodzaj kodu używam teraz (to jest tylko przykładowy kod, znajdujący się w jednej z moich nakładek):

@Override 
public void draw(Canvas canvas, MapView mapView, boolean shadow) { 
    Paint textPaint = new Paint(); 
    textPaint.setARGB(255, 255, 255, 255); 
    textPaint.setTextAlign(Paint.Align.CENTER); 
    textPaint.setTextSize(16); 
    textPaint.setTypeface(Typeface.DEFAULT_BOLD); 

    canvas.drawText("Some Text", 100, 100, textPaint); 

    super.draw(canvas, mapView, shadow); 
} 

Odpowiedz

61

Najprostszym sposobem na to jest o skoku ... coś takiego:

@Override 
public void draw(Canvas canvas, MapView mapView, boolean shadow) { 
    Paint strokePaint = new Paint(); 
    strokePaint.setARGB(255, 0, 0, 0); 
    strokePaint.setTextAlign(Paint.Align.CENTER); 
    strokePaint.setTextSize(16); 
    strokePaint.setTypeface(Typeface.DEFAULT_BOLD); 
    strokePaint.setStyle(Paint.Style.STROKE); 
    strokePaint.setStrokeWidth(2); 

    Paint textPaint = new Paint(); 
    textPaint.setARGB(255, 255, 255, 255); 
    textPaint.setTextAlign(Paint.Align.CENTER); 
    textPaint.setTextSize(16); 
    textPaint.setTypeface(Typeface.DEFAULT_BOLD); 

    canvas.drawText("Some Text", 100, 100, strokePaint); 
    canvas.drawText("Some Text", 100, 100, textPaint); 

    super.draw(canvas, mapView, shadow); 
} 

będzie to narysować granicę 2 piksele wokół zewnętrznej części tekstu, a następnie narysować tekstu nad wierzchu, co daje złudzenie zarysu.

Być może warto też ustawić farby w konstruktorze, a następnie po prostu je ponownie wykorzystać.

+1

Ach, cudownie! Dobre rozwiązanie. Ponadto już skonfigurowałem Paints w konstruktorze i ponownie używam; Uproszczono mój przykład powyżej w celach wyjaśniających. –

+0

Ja wymyśliłem (ty nie wydajesz się głupi :)). Głównie po prostu dodając to dla potomności. –

+0

@fiXedd Ale jak mam przesłonić widok, który jest zadeklarowany w pliku xml? –

10

Pół odpowiedzi, które mogą lub nie mogą być dobre wystarczy (to było w moim przypadku), to ustawienie cień:

textPaint.setShadowLayer(3, 0, 0, Color.BLACK); 

cień pomaga tekst wyróżniać się dużo, ale nie jest tak dobre, jak czarne obramowanie będzie. Wciąż jestem ciekawa, jak rozwiązać oryginalne pytanie.

1

To kompletne ujęcie w ciemności i może być lepszy sposób, ale jeśli utworzysz 4 kopie tekstu, ustaw ich kolor na czarny, a następnie przesuń każdą warstwę o 1 piksel po przekątnej, co spowoduje iluzję granicy. Więc jeśli tekst jest umieszczony w [100,100], 4 cienie będą musiały być umieszczone w [99,99], [99,101], [101,99] i [101,101], jak to:

canvas.drawText("Some Text", 99, 99, borderPaint); 
canvas.drawText("Some Text", 99, 101, borderPaint); 
canvas.drawText("Some Text", 101, 99, borderPaint); 
canvas.drawText("Some Text", 101, 101, borderPaint); 

canvas.drawText("Some Text", 100, 100, textPaint); 
+3

To jest genialne i śmieszne ... Będę musiał spróbować i zobaczyć. :) –

+0

Często używam tej techniki z gimpem (nie wiedząc, jak to zrobić właściwie) –

13

Zamiast tego kodu (z pierwszej odpowiedzi)

canvas.drawText("Some Text", 100, 100, strokePaint); 
canvas.drawText("Some Text", 100, 100, textPaint); 

Spróbuj użyć to samo z Ścieżka:

Path path = new Path(); 
String text = "Some Text"; 
tp.getTextPath(text, 0, text.length(), 0, 100, path); 
canvas.drawPath(path, strokePaint); 
canvas.drawPath(path, textPaint); 

wygląda lepiej?

+0

Nie wiedziałem o getTextPath, to całkiem fajne!(Chociaż nie sądzę, bym użył go w tym konkretnym przypadku.) – Josh

+0

+1, ponieważ ta alternatywna metoda rysowania tekstu jest jedynym dobrym rozwiązaniem ** [błąd wprowadzony w systemie Android 4.4] (https : //code.google.com/p/android/issues/detail? id = 62800) ** (KitKat) i jest nadal dostępny w wersji 4.4.3. @Oleg twoja odpowiedź poprzedza wprowadzenie błędu, ale nieumyślnie uratowałeś moje zdrowie psychiczne. Dziękuję Ci. –

+0

+1 wow po prostu najlepsza odpowiedź ... dziękuję .. –

Powiązane problemy