Как нарисовать текст с рамкой на MapView в Android?
-
19-09-2019 - |
Вопрос
Я пытаюсь нарисовать какой-нибудь текст в MapView на Android.Прорисовка текста выполняется нормально, но его очень трудно прочитать, потому что он белый без черной рамки (как и остальной текст, который естественным образом отображается на картах для обозначения городов, штатов и стран).Кажется, я не могу понять, как нарисовать текст с черной рамкой.Кто-нибудь знает, как это сделать?
Именно такой код я использую прямо сейчас (это всего лишь пример кода, найденный в одном из моих оверлеев).:
@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);
}
Решение
Самый простой способ сделать это - с помощью инсульта...что - то вроде этого:
@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 пикселя вокруг внешней стороны текста, а затем нарисовать текст поверх него, создавая иллюзию контура.
Кроме того, возможно, стоит настроить Краски в конструкторе, а затем просто использовать их повторно.
Другие советы
Вместо этого кода (из первого ответа)
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);
выглядит лучше?
Половинчатый ответ, который может быть достаточно хорошим, а может и не быть (так было в моем случае), заключается в том, чтобы установить тень:
textPaint.setShadowLayer(3, 0, 0, Color.BLACK);
Тень помогает тексту сильно выделяться, но не так хороша, как черная рамка.Мне все еще любопытно, как решить первоначальный вопрос.
Это полный снимок в темноте, и, возможно, есть способ получше, но если вы создадите 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);