Intereting Posts
Дата и время прослушивателя изменений в Android? Невероятно высокая скорость «карты клиента была отклонена» в API подписки Android Studio, как запустить градиентную синхронизацию вручную? Создание среднего элемента для застревания в заголовке (ScrollView / ListView) ActivityNotFoundException? Маскирование Drawable / Bitmap на Android Как получить файл apk с устройства Android? Как обновить Android Studio автоматически? Для вызова требуется уровень API 16 (текущий минимум равен 14): android.app.Notification.Builder # build Нажатие на значок гамбургера на панели инструментов не открывает навигационный ящик Ожидание до завершения асинхронной задачи Невозможно выполнить это действие после onSaveInstanceState на super.onBackPressed () Как загрузить видео из папки с ресурсами? (Чтобы воспроизвести их с помощью VideoView) Как изменить размер эмулятора AVD (в Eclipse)? В Activity.onCreate (), почему Intent.getExtras () иногда возвращает null?

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