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