Как вы рисуете текст с рамкой на MapView в Android? - PullRequest
32 голосов
/ 12 ноября 2009

Я пытаюсь нарисовать текст на MapView на Android. Рисование текста идет хорошо, но его очень трудно прочитать, потому что он белый без черной рамки (как и остальная часть текста, который естественно отображается в MapViews для обозначения городов, штатов и стран). Я не могу понять, как нарисовать текст с черной рамкой. Кто-нибудь знает, как это сделать?

Это код, который я сейчас использую (это просто пример кода, найденный в одном из моих оверлеев):

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

Ответы [ 4 ]

63 голосов
/ 28 января 2010

Самый простой способ сделать это с помощью Stroke ... примерно так:

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

Это нарисует границу в 2 пикселя вокруг внешней части текста, затем нарисует текст поверх него, создавая иллюзию контура.

Кроме того, возможно, стоит установить Paint в конструкторе, а затем просто повторно использовать его.

16 голосов
/ 28 апреля 2011

Вместо этого кода (из первого ответа)

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

попробуйте использовать то же самое с 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);

выглядит лучше?

11 голосов
/ 16 ноября 2009

Полуответ, который может быть или не быть достаточно хорошим (это было в моем случае), состоит в том, чтобы установить тень:

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

Тень помогает тексту выделиться, но не так хорошо, как с черной рамкой. Мне все еще интересно, как решить оригинальный вопрос.

2 голосов
/ 18 ноября 2009

Это полный снимок в темноте, и может быть лучше, но если вы создадите 4 копии текста, установите их цвет на черный, а затем сместите каждый слой на 1 пиксель по диагонали, это создаст иллюзию граница. Поэтому, если ваш текст расположен в [100,100], 4 тени нужно расположить в [99,99], [99,101], [101,99] и [101,101], например:

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