Domanda

Sto cercando di disegnare un testo su un MapView su Android. Il disegno del testo va bene, ma è molto difficile da leggere il testo perché è bianco con bordo nero non (come il resto del testo che appare naturalmente sulla MapViews per indicare le città, stati e paesi). Io non riesco a capire come disegnare il testo con un bordo nero. Qualcuno sa come fare questo?

Questo è il tipo di codice che sto usando in questo momento (questo è solo esempio di codice, che si trova in uno dei miei sovrapposizioni):

@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);
}
È stato utile?

Soluzione

Il modo più semplice per farlo è con un colpo ... qualcosa di simile:

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

Questo attirerà un bordo di 2 pixel intorno alla parte esterna del testo quindi disegnare il testo sopra la parte superiore di esso, dando l'illusione di un contorno.

Inoltre, può valere la pena l'impostazione delle vernici fino nel costruttore poi basta riutilizzarli.

Altri suggerimenti

Al posto di questo codice (dalla prima risposta)

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

tenta di utilizzare lo stesso con il percorso:

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

aspetto migliore?

La mezza risposta, che può o non può essere abbastanza buono (è stato nel mio caso), è quello di impostare un'ombra:

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

L'ombra aiuta il testo spiccano un sacco, ma non è abbastanza buono come un bordo nero sarebbe. Sono ancora curioso come risolvere la questione originale.

Questo è un colpo completo nel buio e ci potrebbe essere un modo migliore, ma se si crea 4 copie del testo, impostare il loro colore al bianco, quindi spostare ogni strato di 1 pixel in diagonale, sarebbe creare l'illusione di un bordo. Così, se il testo viene posizionato in [100,100], i 4 ombre dovrebbero essere posizionato a [99,99], [99.101], [101,99] e [101.101], in questo modo:

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);
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top