¿Cómo dibuja texto con un borde en un MapView en Android?

Estoy tratando de dibujar algo de texto en un MapView en Android. El dibujo del texto va bien, pero es muy difícil leer el texto porque es blanco sin borde negro (como el rest del texto que aparece de forma natural en MapViews para indicar ciudades, estados y países). Parece que no puedo imaginar cómo dibujar el texto con un borde negro. Alguien sabe cómo hacer esto?

Este es el tipo de código que estoy usando en este momento (este es solo el código de ejemplo, que se encuentra en una de mis superposiciones):

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

La forma más fácil de hacerlo es con un trazo … algo como esto:

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

Esto dibujará un borde de 2 píxeles alrededor de la parte exterior del texto y luego dibujará el texto sobre la parte superior, lo que le dará la ilusión de un contorno.

Además, puede valer la pena configurar los Paints en el constructor y luego reutilizarlos.

En lugar de este código (de la primera respuesta)

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

intenta usar lo mismo con Path:

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

¿Se ve mejor?

La media respuesta, que puede o no ser lo suficientemente buena (fue en mi caso), es establecer una sombra:

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

La sombra ayuda a que el texto se destaque mucho, pero no es tan bueno como lo sería un borde negro. Todavía tengo curiosidad por cómo resolver la pregunta original.

Esta es una toma completa en la oscuridad y podría haber una manera mejor, pero si crea 4 copias del texto, establezca su color en negro, luego cambie cada capa por 1 píxel en diagonal, crearía una ilusión de un borde. Entonces, si su texto está posicionado en [100,100], las 4 sombras tendrían que estar posicionadas en [99,99], [99,101], [101,99] y [101,101], así:

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