Как вы рисуете текст с рамкой на 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); } 

Solutions Collecting From Web of "Как вы рисуете текст с рамкой на MapView в Android?"

Самый простой способ сделать это – с помощью 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 в конструкторе, а затем просто повторно использовать их.

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

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