Pregunta

Estoy intentando sacar algún texto en un MapView en Android. El dibujo del texto va bien, pero es muy difícil de leer el texto porque es blanco con ningún borde negro (al igual que el resto del texto que aparece de forma natural en MapViews para denotar ciudades, estados y países). Me parece que no puede averiguar 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 (esto es solo código de ejemplo, que se encuentra en uno 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);
}
¿Fue útil?

Solución

La forma más sencilla de hacerlo es con un golpe ... 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);
}

Para ello se utilizará una frontera de 2 píxeles alrededor del exterior del texto a continuación, dibujar el texto en la parte superior de la misma, dando la ilusión de un esquema.

Además, puede valer la pena el establecimiento de las pinturas en el constructor a continuación, sólo volver a utilizarlos.

Otros consejos

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

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

tratar de utilizar la misma con la trayectoria:

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?

El medio-respuesta, que pueden o no ser lo suficientemente bueno (que era en mi caso), es fijar una sombra:

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

La sombra ayuda a que el texto se destacan mucho, pero no es tan bueno como un borde negro sería. Todavía estoy curioso cómo resolver la pregunta original.

Esto es un tiro 'en la oscuridad y no podría haber una mejor manera, pero si crea 4 copias del texto, establece su color a negro, a continuación, cambiar cada capa por 1 píxel en diagonal, sería crear una ilusión de una frontera. Así que si su texto se sitúa en [100,100], tendría que ser colocado en [99,99], [99.101], [101,99] y [101,101], así las sombras 4:

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);
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top