Как обвести текст в телефоне

Все категории

  • Фотография и видеосъемка
  • Знания
  • Другое
  • Гороскопы, магия, гадания
  • Общество и политика
  • Образование
  • Путешествия и туризм
  • Искусство и культура
  • Города и страны
  • Строительство и ремонт
  • Работа и карьера
  • Спорт
  • Стиль и красота
  • Юридическая консультация
  • Компьютеры и интернет
  • Товары и услуги
  • Темы для взрослых
  • Семья и дом
  • Животные и растения
  • Еда и кулинария
  • Здоровье и медицина
  • Авто и мото
  • Бизнес и финансы
  • Философия, непознанное
  • Досуг и развлечения
  • Знакомства, любовь, отношения
  • Наука и техника


0

Андроид. Как на фото обвести объект?

Как на фото (фотография) обвести объект (андроид)?

Как на фото выделить объект (андроид)?

Приведите наглядные примеры.

Фото, скриншоты, видео.

5 ответов:



20



0

В принципе, обвести определённый объект на фотографии либо на скриншоте довольно просто.

Как это сделать, последовательно расскажу на конкретном примере.

Итак, первое, что необходимо сделать, это зайти в приложение «Галерея» (оно есть во всех мобильных устройствах), открываем нужное нам фото:

Внизу в левом углу вы увидите карандашик (на моём скрине отмечено галочкой):

Нажимаете на него, появится такая картинка, нажимаете на иконку (нижний правый угол), отмеченную красной галочкой:

Далее жмите на слово «Рисование»:

Как видно, нам предлагается на выбор несколько вариаций цветов, также можно выбрать размер:

Допустим, я хочу выделить / обвести строчку, на которой указано непрерывное количество дней, проведённых на сайте, нажимаю на квадратик синего (или любой другой) цвета, выбираем размер, обводим цифру 730, и вуаля, у нас получилось обвести объект:

Не забудьте нажать на «Сохранить» (у меня вверху, слева).

Пробуйте. Тренируйтесь. У вас всё получится. Успехов.



2



0

Открыть приложение Галерея, выбрать нужный снимок либо в первой вкладке Все, либо во второй Локальные > категориям Скриншоты, он откроется в полном размере, под ним нажать Изменить, в Изменить нажать под снимком Кисть, а когда откроется ее страница, нажатием на кружок желаемого цвета выбрать цвет контура обводки, а слева ползунок толщины рисуемой линии перетащить в крайнее левое положение, чтобы линия получилась максимально тонкой и не замазала нужное место. После этого пальцем обводим требуемый участок снимка и, если результат устраивает, сохраняем, нажав над ним в правом верхнем углу сначала зелёную галочку, а потом ОК. Если получилось плохо, нажимаем в левом верхнем углу красный крестик и переделываем. Если ползунок выбора толщины линии не реагирует на скользящее движение пальца, то просто ткните в крайнюю точку слева. А может, его и двигать не придется, если линия средней толщины по умолчанию вас устроит. В Галерее отредактированное изображение не заменяет собой оригинал, а появляется дальше по списку, а в приложении Google Photos заменяет.



2



0

Как на фото обвести объект в Андроид немного отличается от того, какая версия (более новая или более старая). Покажу свой пример.

Для начала нужно открыть это самое фото, оно находиться в галерее. Если коснуться его пальцем, то появиться меню и функция «изменить». (отмечено красной стрелкой)

Тыцяем на него пальчиком и переходим в следующую менюшку. В ней нужно найти опцию «Граффити». Касаемся ее.

Дальше нужно выбрать, каким контуром вы хотите обвести. Просто корявой линией или четкой геометрической фигурой. Я выбрала квадрат, коснулась его. Далее ставим пальчик на то место, от которого хотим рисовать квадрат и собственно рисуем.

Вуяла, получается такая славная котейка в квадрате! Ее кстати зовут Марфуша.

Как на фото обвести объект в Андроид



0



0

Обвести объект на фото (картинке) на устройстве с операционной системой Android проще всего через Галерею. Галерея по умолчанию установлена телефоне, поэтому не нужно что-либо устанавливать дополнительно.

Открываем фото в галерее.

Затем, нажимаем на второй значек под фото.

Выбираем «набросок» и жмём на такой кружок.

Теперь, обводим нужный нам объект и сохранить изменения.



0



0

Открываем приложение «галерея».

Далее, выбираем необходимое фото.

Под фото жмём на «изменить».

В этом пункте находим значок кисти.

Далее в «кисть» нажимаем на кружок и выбираем подходящий цвет обводки.

Есть ещё и ползунок, можно выбрать необходимую толщину линии.

Всё, обводим рисунок (пальцем) и если всё устраивает жмём на «ОК».

Если не понравилось, то можно нажать на крестик (верхн угол слева), удалить и заново произвести эти действия.

Во всяком случае у меня это всё работает, именно так.

Читайте также

Зашифрованное в этих четырёх картинках слово — БЛЮДО. Ключевым является первое изображение блюдо (большая тарелка), подтверждающими — изображения различных кулинарных блюд. Слово подходит по смыслу. Количество букв соответствует количеству клеток. Нужные буквы есть в предлагаемом перечне.

Первое задание, правильные ответы к нему будут такие: Пузырьки, волосы, комбинезон, акваланг, шланг, дайвинг, актиния, маска.

Второе задание, правильные ответы к нему будут такие: Антенна, шестиугольники, соты, ячейки, пчела, мед, воск, улей.

Третье задание, правильные ответы к нему будут такие: Сумчатые, животные, грызун, уши, усики, всеядные, когти, опоссум.

Четвёртое задание, правильными ответами будут такие: Ресторан, подсолнечник, цветы, окна, зонтик, стулья, столы, тротуар, арка.

Пятое задание, правильные ответы к ним будут такие: Мужчина, ремень, браслет, джинсы, рюкзак, часы, пряжка, мода, граффити.

На очередном уровне игры представлены четыре картинки с различными изображениями.Необходимо найти общее слово, которое их обьединяет.Рассмотрим каждую в отдельности.

На первом изображении мы видим — торт разрезан на несколько частей или раздроблен

На втором изображении показывают — номер дома показан через дробь

На третьем изображении нарисовано — круг с числами через дробь

На четвертой картинке изображение — дробь для патрона

В результате, учитывая количество букв, общим словом для всех четырех картинок будет = ДРОБЬ

Дело в том, что большинство провайдеров стали ограничивать скорость скачивания торрентов, в вашем случае ограничение до 128кбит/с, а бывает и до 32кбит/с, есть способы обойти это ограничение, но более подробно об этом я объяснять не стану, однако на мой взгляд проще воспользоваться другим мобильным оператором, у которого нет этих ограничений или же скачивать торренты через wi-fi

Набирает популярность среди мобильных игр головоломка, которая построена по принципу мини-кроссвордов- Слова в связке (W connect).

В качестве подсказки загружается картинка, которую можно увеличить, перевернув телефон.

Посмотреть все ответы на прохождение игры можно конечно же у нас, набрав в поисковике фразу «слова в связке»

, или на менее популярном сайте в интернете igroki24

Как сделать выделение в скриншоте?

Как на скриншоте добавить текст?

Нажмите иконку справа от названия скриншота; На месте названия появится текстовое поле для его редактирования; введите новое название; С помощью клавиши Enter на клавиатуре или кликнув на иконку сохраните новое название.

Как рисовать на скриншоте на телефоне?

На большинстве Android-устройств это происходит при одновременном нажатии кнопок питания и уменьшения громкости. После этого в центре уведомлений нужно нажать «Отправить» и выбрать в предложенном списке приложений Markup. Затем на полученном изображении можно рисовать.

Как рисовать на скриншоте в ворде?

Порисуем? Как рисовать в Word, основы

  1. Открываем программу Word.
  2. На панели инструментов выбираем «Вставка» — «Фигуры» — «Новое полотно».
  3. На верхней панели появляется вкладка «Формат», которая позволит вам творить на возникшем полотне.

Как поставить стрелку в скриншоте?

Чтобы добавить стрелку на скриншот, просто выберите сей инструмент в редакторе (в колонке слева) и поставьте ее в нужное место (см. на примере ниже 👇). Собственно, после добавление всего, что нужно, останется только сохранить скриншот: File/Save as… (Файл/Сохранить как…).

Как редактировать снимок экрана?

Чаще всего для этого необходимо одновременно нажать и удерживать кнопку уменьшения громкости и питание. Способ может отличаться в зависимости от модели смартфона. Если скриншот создан, то экран мигнет со звуком затвора камеры. На многих моделях можно сразу нажать на кнопку «Изменить».

Что такое скрин экрана на своем телефоне?

Как сделать скриншот (снимок) экрана на смартфоне или планшете Скриншот – это снимок всего, что видно на экране телефона или планшета. Он сохраняется на устройстве, после чего его можно просматривать, редактировать и отправлять другим пользователям.

Как сделать скриншот не нажимая кнопок?

Нажмите клавишу [Fn] и одновременно с ней, например, клавишу [F11], если на ней есть надпись «Print Screen». Однако Windows предлагает и другие способы сделать скриншот, в частности, при помощи инструмента «Ножницы» (Snipping Tool).

Куда сохраняются скриншоты на телефоне?

Если девайс работает под управлением предшествующих версий Android, например Kit Kat (версия 4.4), то просто откройте приложение Галерея (Gallery), выберите альбомное отображение (Album view) и затем найдите папку «Скриншоты» (Screenshots).

Как в ворде обвести кружком?

меню «границы и заливка» – вкладка «граница» – «рамка» – «применить к *тексту* – ок. . тогда вставка – фигуры – круг. ну и в контекстном меню выберите пункт «порядок» – «поместить за текстом».

Как сохранить картинку с помощью Print Screen?

Копирование изображения активного окна

  1. Щелкните окно, которое хотите скопировать.
  2. Нажмите клавиши ALT+PRINT SCREEN.
  3. Вставьте (CTRL+V) изображение в программу Office или другое приложение.

Что можно нарисовать в ворде?

Щелкните в том месте документа, где вы хотите создать рисунок. На вкладке Вставка в группе элементов Иллюстрации нажмите кнопку Фигуры. Когда вы найдете фигуру, которая вы хотите вставить, дважды щелкните, чтобы вставить ее автоматически, или щелкните и перетащите, чтобы нарисовать ее в документе.

Как сделать скриншот окна приложения?

Если хотите сделать скриншот только активного окна (программы), нажмите одновременно «Alt» и «Print Screen» на компьютере; «Alt», «Print Screen» и «Fn» — на ноутбуке. Скриншот сохранится в буфер обмена. Теперь можно вставить его в письмо, фоторедактор или Word (нажать одновременно кнопки «Ctrl» и «V»).

Как отправить ссылку на скриншот?

Чтобы скопировать ссылку на скриншот, достаточно щелкнуть на нем правой кнопкой мыши и в контекстном меню выбрать «Копировать ссылку».

3 способ: социальные сети

  1. В поле «Что у вас нового?» нажмите на значок фотоаппарата.
  2. После этого откроется окно для загрузки изображения. …
  3. Скриншот будет загружен.

Выделяем главное: как быстро нарисовать стрелку или обвести текст на скриншоте

Многие пользователи знают, как сделать скриншот, но далеко не все понимают, как выделить на нем важную информацию, например, подчеркнуть текст или добавить направляющую стрелку. На самом деле сделать это можно как прямо в процессе создания снимка экрана, так и после, обработав созданный файл в фоторедакторе. В этой статье мы расскажем вам, как рисовать на скриншоте при помощи специальных приложений.

  1. Как рисовать на скриншоте: самый быстрый способ
  2. Как редактировать скриншот через Paint
  3. Заключение
  4. Вопросы и ответы

Как рисовать на скриншоте: самый быстрый способ

Если вам нужно сделать снимок и сразу же добавить на него поясняющие заметки или обвести элементы, советуем воспользоваться программой ФотоСКРИН. Это легкое приложение позволяет захватывать любую область экрана и проводить правки:

  • Размывать или добавлять текст;
  • Встраивать прямоугольники, стрелки и линии;
  • Выделять любую область при помощи карандаша или маркера;
  • Произвольно рисовать на экране;
  • Быстро добавлять нумерованные списки.

ФотоСКРИН удобен в обращении и интуитивно понятен. Весь процесс займет несколько шагов:

1. Установите программу на ПК: скачайте установщик и запустите инсталляцию двойным кликом.

2. Вызовите скриншотер, кликнув по значку в панели уведомлений. Курсором обведите участок экрана, который нужно сохранить как изображение.

ФотоСКРИН

Как рисовать на скриншоте

3. Начните рисовать на картинке. После выделения участка появится панель инструментов. Выберите карандаш или маркер в нижней строке.

Укажите предпочтительный оттенок в цветовом квадрате. Рисуйте на экране нужные объекты или обведите текст на сфотографированной области.

Чтобы добавить стрелку или линию, кликните на соответствующую иконку и проведите по снимку в нужном направлении. Вы можете добавлять сколько угодно таких элементов поверх картинки.

4. Сохраните изображение, нажав на кнопку с дискетой. Также вы можете загрузить его на сервер для получения короткой ссылки или скопировать в буфер обмена для отправки через мессенджер.

Сохранение результата

Если вы не знаете, где найти скриншот после сохранения, то не волнуйтесь — программа создаст специальную папку «Screenshot» в разделе «Документы».

Вот и все, что нужно, чтобы выделить текст или объект на скриншоте при помощи программы ФотоСКРИН. Это наиболее удобный способ для тех, кто создает статьи или видео с поясняющими слайдами, так как не нужно искать софт для редактирования.

Как редактировать скриншот через Paint

Что делать, если нужно добавить элементы на готовую фотографию? Если не хочется устанавливать дополнительные программы, воспользуйтесь стандартным средством Paint. Это приложение встроено в компьютеры с ОС Windows и позволяет проводить быструю обработку графических файлов: обрезать, добавлять геометрические фигуры и писать пометки на скриншотах.

    Запустите Paint из списка установленных приложений в меню «Пуск» и импортируйте фото через «Файл» —> «Открыть». Либо кликните по картинке правой кнопкой мыши, выберите «Открыть с помощью. » и найдите нужный вариант.

Как рисовать на скриншоте в Paint

Откройте изображение в Paint

Выделение фрагмента

Выделяйте важное на скриншоте

Добавление фигур и стрелок

Дополняйте изображение фигурами

Пэйнт разрешает сохранять изображения в оригинальном формате или преобразовать в другие.

Выводы

Теперь вы знаете, как нарисовать стрелку на скриншоте или выделить нужную область. А ФотоСКРИН поможет в разы ускорить работу, ведь в программе есть все необходимое для создания скриншотов для обучающих статей или слайдов для бизнес-презентаций. Скачайте приложение и создавайте снимки рабочего стола компьютера буквально за секунды.

Cохраните себе статью, чтобы не потерять:

Частые вопросы

Самый быстрый способ того, как обвести текст на скриншоте – воспользоваться приложением ФотоСКРИН. Захватите с его помощью нужную область экрана и выберите инструмент «Маркер». После этого подчеркните информацию, проведя курсором по снимку, и сохраните результат.

Чтобы встроить прямую линию в скриншот, воспользуйтесь соответствующим инструментом в программе ФотоСКРИН. Выделите иконку линии на панели опций и проведите курсором в нужной части снимка.

Как создать скриншот в Microsoft Word; как редактировать скриншот

скриншот в Microsoft Word

Работа за компьютером, в частности, с программой Microsoft Word, иногда сопряжена с медиафайлами — например, с созданием скриншотов:

если мы хотим добавить в документ изображение (иллюстрацию какой-либо области экрана), то нам потребуется сначала сделать сам скриншот требуемой области, а уж затем добавить этот скрин в документ, либо, коли возникло желание, банально поделиться со своим коллегой…

Создание скриншота возможно непосредственно из Word, к тому же, если нужно, с последующей вставкой в документ автоматически! Опция работы со скриншотами в Word имеет множество встроенных инструментов для коррекции изображения.

Итак — узнаем каким образом создать снимок экрана или его области при помощи встроенного инструмента для создания скриншотов в Word:

Для уверенной работы с картинками нам всего-то нужно изучить инструментарий программы Microsoft Word. Рассмотрим примеры работы Word 2013 (в иных версиях несущественные различия в работе…).

Пришло время убрать старый маркер, потому что вы будете выполнять большинство этих действий в Интернете. Вместо этого вы можете аннотировать текст онлайн, используя различные современные инструменты.

Эти инструменты называются приложениями для выделения, поскольку они позволяют аннотировать и выделять. Многие компании выпустили приложения для выделения, совместимые с устройствами Android и iOS.

В этой статье мы обсудим, что такое приложения для выделения, зачем они нам нужны и как они помогают в повседневной жизни разных людей. Наконец, мы обсудим некоторые из лучших приложений для выделения текста на Android и iPhone.

Что такое выделение приложений?

Выделение — это метод обучения, который может помочь вам учиться более эффективно, выбирая важную информацию из документа.

Когда дело доходит до выделения веб-страниц, вы можете легко отметить отрывок текста, используя онлайн-инструмент или ручку и бумагу. Эти онлайн-инструменты для выделения полезны для нас, потому что большая часть нашего чтения и исследований в эти дни проводится в Интернете.

Используя приложения для выделения, вы можете найти важные элементы на странице с плотным текстом. Эти технологии достигают этого, выделяя важные вещи с помощью цветовой схемы. Эта настройка включает в себя цвет фона, цвет текста и оценку приоритета для просмотра ваших обращений.

Различные типы приложений для выделения предлагают различные функции для своих пользователей. Вы также можете сделать цветовое кодирование, чтобы ваши тексты были выделены в соответствии с их важностью.

Зачем нужны инструменты выделения?

Чтобы понять, зачем нужны инструменты выделения, давайте возьмем пример вашей любимой книги. Когда вы читаете книгу в первый раз, вы сталкиваетесь с разными словами, фразами или цитатами, которые могут вам понравиться или на которые вы захотите обратить внимание даже после того, как закончите читать книгу. Некоторые из нас также выделяли в книге свои любимые предложения, чтобы их было легко прочитать в следующий раз.

Для большинства из нас, кто много читает и вынужден снова и снова просматривать одни и те же страницы, чтение может стать сложной задачей. Вы можете сделать свою учебу проще и приятнее, выделив важные, интересные и бесполезные части страниц.

Обучение в основном мигрировало или полностью онлайн, поскольку цифровая жизнь расширилась, чтобы включить больше аспектов нашей повседневной жизни. В наши дни вы можете выделить текст на веб-сайтах и ​​в PDF-файлах с помощью нескольких онлайн-инструментов. Вы можете выбрать любой из них, в зависимости от доступных ресурсов. Онлайн-выделение облегчает хранение большего количества учебных заметок под рукой.

Как выделение приложений может помочь в повседневной жизни разных людей?

Инструменты выделения могут работать практически с любым предметом или уровнем обучения. Ниже приведены несколько моментов о том, как выделение приложений может помочь в повседневной жизни каждого.

Выяснение основных понятий

Способность различать основные понятия и вспомогательные детали — одна из самых сложных проблем, с которыми сталкиваются учащиеся по мере взросления и усложнения информации.

Студенты могут начать подчеркивать то, что они считают важными понятиями, одним цветом и вспомогательные детали другим цветом после того, как они познакомятся с различием между ними. Это помогает учащимся осознать основные темы статей.

Соберите основные положения статьи

Большинству студентов нужна только продуктивная техника для заметок в наиболее важных отрывках документа. Это относительно легко сделать с помощью инструментов для выделения.

Учащиеся могут отсканировать документ, подчеркнув ключевые отрывки цветом по своему выбору, а затем скомпилировать эти основные моменты в другом документе. Затем, чтобы помочь в учебе, эти основные моменты могут быть мгновенно извлечены, когда это необходимо.

Нахождение сложных слов

Учебники часто включают в себя список словарных терминов, относящихся к разделу по различным предметам. Несмотря на то, что это полезно, некоторым учащимся может потребоваться более подробное знакомство со словарными словами или любым из множества других терминов, включенных в книгу.

Предоставляя учащимся средства для выделения любых слов, с которыми они не знакомы, и добавления их в другой документ, инструменты выделения могут быть полезными.

Увеличивает сохранение памяти

Никто не может оспорить тот факт, что выделение помогает нам укрепить нашу память, особенно нашу зрительную память. Студенты могут углубить свои знания, внимательно отмечая важные детали и перечитывая отрывок.

Когда дело доходит до процессов обучения, происходящих в нашем мозгу, цвета имеют сложную психологическую связь. Желтый цвет наиболее эффективно выделяет информацию на протяжении всего учебного процесса. Таким образом, выделение приложений может улучшить удержание при использовании на бумаге.

Теперь, когда все переместилось в онлайн-среду, вам также нужны онлайн-хайлайтеры. Итак, у нас есть несколько приложений для выделения важного текста на вашем смартфоне.

Лайнер

Одним из самых отличных инструментов выделения и аннотации, доступных в Интернете, является Liner. Недавние улучшения улучшили его больше, чем когда-либо, и сделали его чрезвычайно простым в использовании на различных устройствах. Вы можете загрузить как расширение для браузера, так и приложение для своих телефонов, а затем войти в систему, используя ту же учетную запись.

Любую ссылку можно отправить в Liner на мобильных устройствах, чтобы открыть ее в приложении. Кроме того, вы можете использовать его как на устройствах Android, так и на iOS.

Вы можете выделить любой текст там, удерживая кнопку достаточно долго. Бесплатная версия Liner включает желтый и зеленый цвета. Одна папка может состоять из нескольких ссылок или примечаний. В бесплатной версии разрешены три папки. И последнее, но не менее важное: поиск в приложении Liner извлекает все ваши основные моменты и заголовки ссылок.

Adobe Acrobat

С более чем 635 миллионами установок Adobe Acrobat является наиболее широко используемой и надежной программой просмотра PDF в мире. В этой программе есть несколько возможностей для взаимодействия с файлами PDF.

Кроме того, Adobe Acrobat хорошо работает в качестве маркера PDF. Вы можете редактировать, выделять, зачеркивать и подчеркивать целевые тексты. Вы также можете изменить цвет маркера и удалить его. Он имеет онлайн-версию, а также совместим с iOS и Android.

Только веб-версия доступна бесплатно. Настольные версии дорогие, но включают в себя множество функций. Пользователи могут изменять цвета маркера, и он предлагает больше возможностей, чем просто маркер.

Существуют онлайн- и офлайн-версии Adobe Acrobat, которые позволяют пользователям прозрачно раскрашивать онлайн-текст.

Readwise

Вы можете быстро хранить, упорядочивать и повторно просматривать свои электронные книги и основные моменты статей с помощью приложения Readwise. Вы можете использовать его, чтобы упорядочить и просмотреть основные моменты ваших электронных книг и статей.

Программное обеспечение возвращает вам ваши лучшие моменты в нужный момент с ежедневным электронным письмом, и все благодаря научному методу, известному как интервальные повторения.

Таким образом вы сможете повторять и запоминать основные понятия из прочитанных вами книг. Вы можете использовать его как на устройствах Android, так и на iOS.

Ежедневный дайджест электронной почты от Readwise может быть полезным дополнением к утренней рутине, поэтому люди его ценят. Это полезно для читателей документальной литературы, у которых есть тысячи основных моментов, поскольку это простой способ упорядочить свои основные моменты и помочь вам запомнить то, что вы узнали.

Выделить и отметить

Инструмент выделения Highlight & Note имеет простой пользовательский интерфейс и очень прост в использовании. Когда текст выделен, вы можете выбрать приложение «Выделение и заметка» в меню параметров копирования и вставки, чтобы либо создать новую заметку, либо добавить выделенный текст в существующую заметку.

В этом приложении вы можете легко выполнять различные действия, такие как добавление, удаление, обмен и т. д. Вы можете использовать это программное обеспечение для просмотра веб-страниц и добавления своих основных моментов. Позже вы также можете поделиться своими заметками и связать их. Это приложение доступно только для пользователей Android.

Хайлайтер для Safari

Highlighter for Safari — фантастическое дополнение для большинства пользователей iOS. Он прост в использовании, доступен одним щелчком мыши и доступен, когда вам нужно отслеживать то, что важно. Он выделяет ключевую информацию и улучшает понимание. Поскольку все сохраняется локально, нет необходимости в удаленной службе, учетных записях или логинах.

В Safari вы можете выделять текст разными цветами и комментировать любую веб-страницу с помощью заметок. Когда вы вернетесь на свои страницы, вы всегда сможете перечитать сделанные вами заметки и выделения.

Кроме того, вы можете исследовать и удалять недавно добавленные выделения и примечания, а также искать выделенную информацию. Вы также можете экспортировать свои заметки в формат RTF.

Выделено

Выделено приложение для iOS, которое уже было помещено в список Apple «Новые приложения, которые мы любим».

Приложение, несомненно, заслуживает внимания благодаря простому, логичному дизайну, замечательному вниманию к деталям и простой функциональности. Программное обеспечение собирает цитаты, упорядочивает их и делает разметку книжных фрагментов проще, чем когда-либо.

Пользовательский интерфейс гладкий, лаконичный и чрезвычайно простой в использовании, а общий стиль напоминает ранние программы Apple. Кроме того, установка и использование Highlighted Book Scanner занимает всего несколько минут.

Приложение точно записывает фразу без орфографических или грамматических ошибок. Кроме того, он разумно удаляет неполные предложения до и после начала и конца отрывка.

Особенности

Приложение Highlights рекламируется как «читатель PDF для учебы». Программа имеет несколько функций, которые особенно полезны для сортировки большого количества исследований, таких как контекстно-зависимые аннотации, поддержка извлечения аннотаций и многое другое. Одной из самых захватывающих характеристик является способность извлекать данные из изображений и таблиц.

Поскольку многие провайдеры предпочитают публиковать скриншот или изображение диаграммы, а не фактические данные, получить последние может быть сложно. Highlights может взять эту диаграмму и преобразовать ее в настоящую текстовую таблицу с помощью машинного обучения.

В Highlights используются новейшие функции, в том числе сочетания клавиш и навигация, поддержка нескольких окон, интеграция с Apple Pencil и многое другое. Кроме того, все платформы поддерживают темный режим.

PDF маркер

Ваши PDF-файлы, важные документы и фотографии можно редактировать или выделять с помощью PDF Highlighter. Инструменты этого приложения для редактирования фотографий или PDF-файлов обладают выдающимися возможностями.

С помощью этого приложения вы можете выделить важный контент в файлах PDF и изображениях. Приложение предлагает такие же реалистичные блики, как те, что сделаны маркером.

Благодаря таким параметрам редактора, как «Рисование», «Запись текста» и «Изменение PDF» в этом программном обеспечении, легко выделять и редактировать файлы PDF, а также фотографии. Ваш измененный PDF-файл или изображения также можно сохранить и отправить другим. Вы можете сохранить выделенные и измененные PDF-документы и фотографии как PDF-файлы или фотофайлы.

Вывод

Существует правильный способ использования приложений для выделения, который может революционизировать способ создания заметок. Они не помогут делать заметки при неправильном использовании и даже могут работать против этого. Вы можете легко выполнять свою работу и сократить время, которое тратите на свое устройство, выбрав лучший инструмент выделения для своего гаджета.

Подчеркивание текста на странице однообразного материала способствует запоминанию и привлекает внимание. Вот почему приложения для выделения текста необходимы практически всем, будь то школьник, исследователь или просто читатель.

Вы также можете изучить некоторые лучшие инструменты аннотирования веб-сайтов, которые помогут вам выделить контент на веб-сайте.

outline effect can be achieved using shadow in TextView:

    android:shadowColor="#000000"
    android:shadowDx="1.5"
    android:shadowDy="1.3"
    android:shadowRadius="1.6"
    android:text="CCC"
    android:textAllCaps="true"
    android:textColor="@android:color/white"

answered Feb 6, 2015 at 14:26

Rafał's user avatar

RafałRafał

1,1271 gold badge7 silver badges4 bronze badges

4

So, little late, but MagicTextView will do text outlines, amongst other things.

enter image description here

<com.qwerjk.better_text.MagicTextView
    xmlns:qwerjk="http://schemas.android.com/apk/res/com.qwerjk.better_text"
    android:textSize="78dp"
    android:textColor="#ff333333"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    qwerjk:strokeColor="#FFff0000"
    qwerjk:strokeJoinStyle="miter"
    qwerjk:strokeWidth="5"
    android:text="Magic" />

Note: I made this, and am posting more for the sake of future travelers than the OP.
It’s borderline spam, but being on-topic, perhaps acceptable?

answered Apr 24, 2012 at 8:24

ABentSpoon's user avatar

ABentSpoonABentSpoon

4,9771 gold badge26 silver badges23 bronze badges

5

It is quite an old question but still I don’t see any complete answers. So I am posting this solution, hoping that someone struggling with this problem might find it useful. The simplest and most effective solution is to override TextView class’ onDraw method. Most implementations I have seen use drawText method to draw the stroke but that approach doesn’t account for all the formatting alignment and text wrapping that goes in. And as a result often the stroke and text end up at different places. Following approach uses super.onDraw to draw both the stroke and fill parts of the text so you don’t have to bother about rest of the stuff. Here are the steps

  1. Extend TextView class
  2. Override onDraw method
  3. Set paint style to FILL
  4. call parent class on Draw to render text in fill
    mode.
  5. save current text color.
  6. Set current text color to your stroke color
  7. Set paint style to Stroke
  8. Set stroke width
  9. And call parent class onDraw again to draw the stroke over the
    previously rendered text.

    package com.example.widgets;
    
    import android.content.Context;
    import android.content.res.TypedArray;
    import android.graphics.Canvas;
    import android.graphics.Paint;
    import android.graphics.Typeface;
    import android.util.AttributeSet;
    import android.widget.Button;
    
    public class StrokedTextView extends Button {
    
        private static final int DEFAULT_STROKE_WIDTH = 0;
    
        // fields
        private int _strokeColor;
        private float _strokeWidth;
    
        // constructors
        public StrokedTextView(Context context) {
            this(context, null, 0);
        }
    
        public StrokedTextView(Context context, AttributeSet attrs) {
            this(context, attrs, 0);
        }
    
        public StrokedTextView(Context context, AttributeSet attrs, int defStyle) {
            super(context, attrs, defStyle);
    
            if(attrs != null) {
                TypedArray a = context.obtainStyledAttributes(attrs,R.styleable.StrokedTextAttrs);
                _strokeColor = a.getColor(R.styleable.StrokedTextAttrs_textStrokeColor,
                        getCurrentTextColor());         
                _strokeWidth = a.getFloat(R.styleable.StrokedTextAttrs_textStrokeWidth,
                        DEFAULT_STROKE_WIDTH);
    
                a.recycle();
            }
            else {          
                _strokeColor = getCurrentTextColor();
                _strokeWidth = DEFAULT_STROKE_WIDTH;
            } 
            //convert values specified in dp in XML layout to
            //px, otherwise stroke width would appear different
            //on different screens
            _strokeWidth = dpToPx(context, _strokeWidth);           
        }    
    
        // getters + setters
        public void setStrokeColor(int color) {
            _strokeColor = color;        
        }
    
        public void setStrokeWidth(int width) {
            _strokeWidth = width;
        }
    
        // overridden methods
        @Override
        protected void onDraw(Canvas canvas) {
            if(_strokeWidth > 0) {
                //set paint to fill mode
                Paint p = getPaint();
                p.setStyle(Paint.Style.FILL);        
                //draw the fill part of text
                super.onDraw(canvas);       
                //save the text color   
                int currentTextColor = getCurrentTextColor();    
                //set paint to stroke mode and specify 
                //stroke color and width        
                p.setStyle(Paint.Style.STROKE);
                p.setStrokeWidth(_strokeWidth);
                setTextColor(_strokeColor);
                //draw text stroke
                super.onDraw(canvas);      
               //revert the color back to the one 
               //initially specified
               setTextColor(currentTextColor);
           } else {
               super.onDraw(canvas);
           }
       }
    
       /**
        * Convenience method to convert density independent pixel(dp) value
        * into device display specific pixel value.
        * @param context Context to access device specific display metrics 
        * @param dp density independent pixel value
        * @return device specific pixel value.
        */
       public static int dpToPx(Context context, float dp)
       {
           final float scale= context.getResources().getDisplayMetrics().density;
           return (int) (dp * scale + 0.5f);
       }            
    }
    

That is all. This class uses custom XML attributes to enable specifying stroke color and width from the XML layout files. Therefore, you need to add these attributes in your attr.xml file in subfolder ‘values’ under folder ‘res’. Copy and paste the following in your attr.xml file.

<?xml version="1.0" encoding="utf-8"?>
<resources>

    <declare-styleable name="StrokedTextAttrs">
        <attr name="textStrokeColor" format="color"/>    
        <attr name="textStrokeWidth" format="float"/>
    </declare-styleable>                

</resources>

Once you are done with that, you can use the custom StrokedTextView class in your XML layout files and specify stroke color and width as well. Here is an example

<com.example.widgets.StrokedTextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Stroked text sample"
    android:textColor="@android:color/white"
    android:textSize="25sp"
    strokeAttrs:textStrokeColor="@android:color/black"
    strokeAttrs:textStrokeWidth="1.7" />

Remember to replace package name with your project’s package name. Also add the xmlns namespace in the layout file in order to use custom XML attributes. You can add the following line in your layout file’s root node.

xmlns:strokeAttrs="http://schemas.android.com/apk/res-auto"

answered Aug 11, 2015 at 14:53

Nouman Hanif's user avatar

12

The framework supports text-shadow but does not support text-outline. But there is a trick: shadow is something that is translucent and fades. Redraw the shadow a couple of times and all the alpha gets summed up and the result is an outline.

A very simple implementation extends TextView and overrides the draw(..) method. Every time a draw is requested our subclass does 5-10 drawings.

public class OutlineTextView extends TextView {

    // Constructors

    @Override
    public void draw(Canvas canvas) {
        for (int i = 0; i < 5; i++) {
            super.draw(canvas);
        }
    }

}


<OutlineTextView
    android:shadowColor="#000"
    android:shadowRadius="3.0" />

answered Aug 9, 2011 at 12:42

Zsolt Safrany's user avatar

Zsolt SafranyZsolt Safrany

13.1k6 gold badges49 silver badges62 bronze badges

2

I’ve just been trying to figure out how to do this and couldn’t find a good guide online but eventually figured it out. As Steve Pomeroy suggested, you do have to do something more involved. In order to get the outlined text effect, you draw the text twice: once with a thick outline and then the second time we draw the main text over the outline. But, the task is made easier because you can very easily adapt one of the code samples provided with the SDK, namely the one under this name in your SDK directory: «/samples/android-/ApiDemos/src/com/example/android/apis/view/LabelView.java». Which can also found on the Android developer website here.

Depending on what you’re doing, it’s very easy to see you will only need to make minor modifications to that code, such as changing it to extend from TextView, etc. Before I discovered this sample I forgot to override onMeasure() (which you must do in addition to overriding onDraw() as is mentioned in the «Building Custom Components» guide on the Android Developer website), which is part of why I was having trouble.

Once you’ve done that, you can do what I did:

public class TextViewOutline extends TextView {

private Paint mTextPaint;
private Paint mTextPaintOutline; //add another paint attribute for your outline
...
//modify initTextViewOutline to setup the outline style
   private void initTextViewOutline() {
       mTextPaint = new Paint();
       mTextPaint.setAntiAlias(true);
       mTextPaint.setTextSize(16);
       mTextPaint.setColor(0xFF000000);
       mTextPaint.setStyle(Paint.Style.FILL);

       mTextPaintOutline = new Paint();
       mTextPaintOutline.setAntiAlias(true);
       mTextPaintOutline.setTextSize(16);
       mTextPaintOutline.setColor(0xFF000000);
       mTextPaintOutline.setStyle(Paint.Style.STROKE);
       mTextPaintOutline.setStrokeWidth(4);

       setPadding(3, 3, 3, 3);
}
...
//make sure to update other methods you've overridden to handle your new paint object
...
//and finally draw the text, mAscent refers to a member attribute which had
//a value assigned to it in the measureHeight and Width methods
   @Override
   protected void onDraw(Canvas canvas) {
       super.onDraw(canvas);
       canvas.drawText(mText, getPaddingLeft(), getPaddingTop() - mAscent, 
           mTextPaintOutline);
       canvas.drawText(mText, getPaddingLeft(), getPaddingTop() - mAscent, mTextPaint);
   }

So, in order to get the outlined text effect, you draw the text twice: once with a thick outline and then the second time we draw the main text over the outline.

answered Oct 5, 2010 at 16:49

sversch's user avatar

sverschsversch

8468 silver badges21 bronze badges

0

credit to @YGHM add shadow support
enter image description here

package com.megvii.demo;
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.util.AttributeSet;

public class TextViewOutline extends android.support.v7.widget.AppCompatTextView {

// constants
private static final int DEFAULT_OUTLINE_SIZE = 0;
private static final int DEFAULT_OUTLINE_COLOR = Color.TRANSPARENT;

// data
private int mOutlineSize;
private int mOutlineColor;
private int mTextColor;
private float mShadowRadius;
private float mShadowDx;
private float mShadowDy;
private int mShadowColor;

public TextViewOutline(Context context) {
    this(context, null);
}

public TextViewOutline(Context context, AttributeSet attrs) {
    super(context, attrs);
    setAttributes(attrs);
}

private void setAttributes(AttributeSet attrs) {
    // set defaults
    mOutlineSize = DEFAULT_OUTLINE_SIZE;
    mOutlineColor = DEFAULT_OUTLINE_COLOR;
    // text color   
    mTextColor = getCurrentTextColor();
    if (attrs != null) {
        TypedArray a = getContext().obtainStyledAttributes(attrs, R.styleable.TextViewOutline);
        // outline size
        if (a.hasValue(R.styleable.TextViewOutline_outlineSize)) {
            mOutlineSize = (int) a.getDimension(R.styleable.TextViewOutline_outlineSize, DEFAULT_OUTLINE_SIZE);
        }
        // outline color
        if (a.hasValue(R.styleable.TextViewOutline_outlineColor)) {
            mOutlineColor = a.getColor(R.styleable.TextViewOutline_outlineColor, DEFAULT_OUTLINE_COLOR);
        }
        // shadow (the reason we take shadow from attributes is because we use API level 15 and only from 16 we have the get methods for the shadow attributes)
        if (a.hasValue(R.styleable.TextViewOutline_android_shadowRadius)
                || a.hasValue(R.styleable.TextViewOutline_android_shadowDx)
                || a.hasValue(R.styleable.TextViewOutline_android_shadowDy)
                || a.hasValue(R.styleable.TextViewOutline_android_shadowColor)) {
            mShadowRadius = a.getFloat(R.styleable.TextViewOutline_android_shadowRadius, 0);
            mShadowDx = a.getFloat(R.styleable.TextViewOutline_android_shadowDx, 0);
            mShadowDy = a.getFloat(R.styleable.TextViewOutline_android_shadowDy, 0);
            mShadowColor = a.getColor(R.styleable.TextViewOutline_android_shadowColor, Color.TRANSPARENT);
        }

        a.recycle();
    }

}

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    setPaintToOutline();
    super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}

private void setPaintToOutline() {
    Paint paint = getPaint();
    paint.setStyle(Paint.Style.STROKE);
    paint.setStrokeWidth(mOutlineSize);
    super.setTextColor(mOutlineColor);
    super.setShadowLayer(0, 0, 0, Color.TRANSPARENT);

}

private void setPaintToRegular() {
    Paint paint = getPaint();
    paint.setStyle(Paint.Style.FILL);
    paint.setStrokeWidth(0);
    super.setTextColor(mTextColor);
    super.setShadowLayer(mShadowRadius, mShadowDx, mShadowDy, mShadowColor);
}


@Override
public void setTextColor(int color) {
    super.setTextColor(color);
    mTextColor = color;
}


public void setOutlineSize(int size) {
    mOutlineSize = size;
}

public void setOutlineColor(int color) {
    mOutlineColor = color;
}

@Override
protected void onDraw(Canvas canvas) {
    setPaintToOutline();
    super.onDraw(canvas);

    setPaintToRegular();
    super.onDraw(canvas);
}

}

attr define

<declare-styleable name="TextViewOutline">
    <attr name="outlineSize" format="dimension"/>
    <attr name="outlineColor" format="color|reference"/>
    <attr name="android:shadowRadius"/>
    <attr name="android:shadowDx"/>
    <attr name="android:shadowDy"/>
    <attr name="android:shadowColor"/>
</declare-styleable>

xml code below

<com.megvii.demo.TextViewOutline
    android:id="@+id/product_name"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="center_horizontal"
    android:layout_marginTop="110dp"
    android:background="#f4b222"
    android:fontFamily="@font/kidsmagazine"
    android:padding="10dp"
    android:shadowColor="#d7713200"
    android:shadowDx="0"
    android:shadowDy="8"
    android:shadowRadius="1"
    android:text="LIPSTICK SET"
    android:textColor="@android:color/white"
    android:textSize="30sp"
    app:outlineColor="#cb7800"
    app:outlineSize="3dp" />

answered Mar 14, 2019 at 7:20

Arthur's user avatar

ArthurArthur

1791 silver badge6 bronze badges

2

You can do this programmatically with the below snippet.
That provides white letters with black background:

textView.setTextColor(Color.WHITE);            
textView.setShadowLayer(1.6f,1.5f,1.3f,Color.BLACK);

The parameters of the method are radius,dx,dy,color. You can change them for you specific needs.

I hope I will help someone that creates TextView programmatically and not having it inside xml.

Cheers to the stackOverflow community!

answered May 24, 2018 at 15:16

Farmaker's user avatar

FarmakerFarmaker

2,65011 silver badges16 bronze badges

I want to add a solution in order to solve the performance issue. For example, the answer of @YGHM and a few others does the job, but it causes infinite call of onDraw because setTextColor calls invalidate(). So in order to solve it, you also need to override invalidate() and add a variable isDrawing that you will set to true, when onDraw() is in progress and drawing with a stroke. invalidate will return if the variable is true.

override fun invalidate() {
    if (isDrawing) return
    super.invalidate()
  }

Your onDraw will look like this:

override fun onDraw(canvas: Canvas) {
    if (strokeWidth > 0) {
      isDrawing = true
      val textColor = textColors.defaultColor
      setTextColor(strokeColor)
      paint.strokeWidth = strokeWidth
      paint.style = Paint.Style.STROKE
      super.onDraw(canvas)
      setTextColor(textColor)
      paint.strokeWidth = 0f
      paint.style = Paint.Style.FILL
      isDrawing = false
      super.onDraw(canvas)
    } else {
      super.onDraw(canvas)
    }
  }

answered Feb 13, 2019 at 23:22

Sermilion's user avatar

SermilionSermilion

1,7833 gold badges30 silver badges50 bronze badges

1

Here’s the trick I found that works better than MagicTextView’s stroke IMO

@Override
protected void onDraw(Canvas pCanvas) {
    int textColor = getTextColors().getDefaultColor();
    setTextColor(mOutlineColor); // your stroke's color
    getPaint().setStrokeWidth(10);
    getPaint().setStyle(Paint.Style.STROKE);
    super.onDraw(pCanvas);
    setTextColor(textColor);
    getPaint().setStrokeWidth(0);
    getPaint().setStyle(Paint.Style.FILL);
    super.onDraw(pCanvas);
}

answered May 28, 2014 at 10:46

VinZen's user avatar

VinZenVinZen

3033 silver badges12 bronze badges

4

I’ve written a class to perform text with outline and still support all the other attributes and drawing of a normal text view.

it basically uses the super.onDraw(Canves canvas) on the TextView but draws twice with different styles.

hope this helps.

public class TextViewOutline extends TextView {

    // constants
    private static final int DEFAULT_OUTLINE_SIZE = 0;
    private static final int DEFAULT_OUTLINE_COLOR = Color.TRANSPARENT;

    // data
    private int mOutlineSize;
    private int mOutlineColor;
    private int mTextColor;
    private float mShadowRadius;
    private float mShadowDx;
    private float mShadowDy;
    private int mShadowColor;

    public TextViewOutline(Context context) {
        this(context, null);
    }

    public TextViewOutline(Context context, AttributeSet attrs) {
        super(context, attrs);
        setAttributes(attrs);
    }

    private void setAttributes(AttributeSet attrs){ 
        // set defaults
        mOutlineSize = DEFAULT_OUTLINE_SIZE;
        mOutlineColor = DEFAULT_OUTLINE_COLOR;   
        // text color   
        mTextColor = getCurrentTextColor();
        if(attrs != null) {
            TypedArray a = getContext().obtainStyledAttributes(attrs,R.styleable.TextViewOutline);
            // outline size
            if (a.hasValue(R.styleable.TextViewOutline_outlineSize)) {
                mOutlineSize = (int) a.getDimension(R.styleable.TextViewOutline_outlineSize, DEFAULT_OUTLINE_SIZE);
            }
            // outline color
            if (a.hasValue(R.styleable.TextViewOutline_outlineColor)) {
                mOutlineColor = a.getColor(R.styleable.TextViewOutline_outlineColor, DEFAULT_OUTLINE_COLOR);
            }
            // shadow (the reason we take shadow from attributes is because we use API level 15 and only from 16 we have the get methods for the shadow attributes)
            if (a.hasValue(R.styleable.TextViewOutline_android_shadowRadius) 
                    || a.hasValue(R.styleable.TextViewOutline_android_shadowDx)
                    || a.hasValue(R.styleable.TextViewOutline_android_shadowDy) 
                    || a.hasValue(R.styleable.TextViewOutline_android_shadowColor)) {
                mShadowRadius = a.getFloat(R.styleable.TextViewOutline_android_shadowRadius, 0);
                mShadowDx = a.getFloat(R.styleable.TextViewOutline_android_shadowDx, 0);
                mShadowDy = a.getFloat(R.styleable.TextViewOutline_android_shadowDy, 0);
                mShadowColor = a.getColor(R.styleable.TextViewOutline_android_shadowColor, Color.TRANSPARENT);
            }

            a.recycle();
        }

        PFLog.d("mOutlineSize = " + mOutlineSize);
        PFLog.d("mOutlineColor = " + mOutlineColor);
    }

    private void setPaintToOutline(){
        Paint paint = getPaint();
        paint.setStyle(Paint.Style.STROKE);
        paint.setStrokeWidth(mOutlineSize);
        super.setTextColor(mOutlineColor);
        super.setShadowLayer(mShadowRadius, mShadowDx, mShadowDy,  mShadowColor);
    }

    private void setPaintToRegular() {
        Paint paint = getPaint();
        paint.setStyle(Paint.Style.FILL);
        paint.setStrokeWidth(0);
        super.setTextColor(mTextColor);
        super.setShadowLayer(0, 0, 0, Color.TRANSPARENT);
    } 

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        setPaintToOutline();
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    }

    @Override
    public void setTextColor(int color) {
        super.setTextColor(color);
        mTextColor = color;
    } 

    @Override
    public void setShadowLayer(float radius, float dx, float dy, int color) {
        super.setShadowLayer(radius, dx, dy, color);
        mShadowRadius = radius;
        mShadowDx = dx;
        mShadowDy = dy;
        mShadowColor = color;
    }

    public void setOutlineSize(int size){
        mOutlineSize = size;
    }

    public void setOutlineColor(int color){
       mOutlineColor = color;
    }

    @Override
    protected void onDraw(Canvas canvas) {
        setPaintToOutline();
        super.onDraw(canvas);
        setPaintToRegular();
        super.onDraw(canvas);
    }

}

attr.xml

<declare-styleable name="TextViewOutline">
    <attr name="outlineSize" format="dimension"/>
    <attr name="outlineColor" format="color|reference"/>
    <attr name="android:shadowRadius"/>
    <attr name="android:shadowDx"/>
    <attr name="android:shadowDy"/>
    <attr name="android:shadowColor"/>
</declare-styleable>

answered Feb 28, 2016 at 12:53

YGHM's user avatar

YGHMYGHM

1311 silver badge9 bronze badges

1

I have created a library based on Nouman Hanif’s answer with some additions. For example, fixing a bug that caused an indirect infinite loop on View.invalidate() calls.

OTOH, the library also supports outlined text in EditText widgets, as it was my real goal and it needed a bit more work than TextView.

Here is the link to my library: https://github.com/biomorgoth/android-outline-textview

Thanks to Nouman Hanif for the initial idea on the solution!

Community's user avatar

answered Jan 10, 2017 at 17:17

biomorgoth's user avatar

biomorgothbiomorgoth

6304 silver badges8 bronze badges

I found simple way to outline view without inheritance from TextView.
I had wrote simple library that use Android’s Spannable for outlining text.
This solution gives possibility to outline only part of text.

I already had answered on same question (answer)

Class:

class OutlineSpan(
        @ColorInt private val strokeColor: Int,
        @Dimension private val strokeWidth: Float
): ReplacementSpan() {

    override fun getSize(
            paint: Paint,
            text: CharSequence,
            start: Int,
            end: Int,
            fm: Paint.FontMetricsInt?
    ): Int {
        return paint.measureText(text.toString().substring(start until end)).toInt()
    }


    override fun draw(
            canvas: Canvas,
            text: CharSequence,
            start: Int,
            end: Int,
            x: Float,
            top: Int,
            y: Int,
            bottom: Int,
            paint: Paint
    ) {
        val originTextColor = paint.color

        paint.apply {
            color = strokeColor
            style = Paint.Style.STROKE
            this.strokeWidth = this@OutlineSpan.strokeWidth
        }
        canvas.drawText(text, start, end, x, y.toFloat(), paint)

        paint.apply {
            color = originTextColor
            style = Paint.Style.FILL
        }
        canvas.drawText(text, start, end, x, y.toFloat(), paint)
    }

}

Library: OutlineSpan

answered Jul 9, 2018 at 6:49

Pavel Santaev's user avatar

1

MagicTextView is very useful to make stroke font, but in my case, it cause error like
this
this error caused by duplication background attributes which set by MagicTextView

so you need to edit attrs.xml and MagicTextView.java

attrs.xml

<attr name="background" format="reference|color" />
 ↓
<attr name="mBackground" format="reference|color" />

MagicTextView.java 88:95

if (a.hasValue(R.styleable.MagicTextView_mBackground)) {
Drawable background = a.getDrawable(R.styleable.MagicTextView_mBackground);
if (background != null) {
    this.setBackgroundDrawable(background);
} else {
    this.setBackgroundColor(a.getColor(R.styleable.MagicTextView_mBackground, 0xff000000));
}
}

answered Aug 13, 2016 at 13:27

kazuwombat's user avatar

kazuwombatkazuwombat

1,4071 gold badge15 silver badges18 bronze badges

So you want a stroke around the textview? Unfortunately there is no simple way to do it with the styling. You’ll have to create another view and place your textview over-top, making the parent view (the one it’s on top of) just a few pixels bigger — this should create an outline.

answered Jul 5, 2010 at 22:10

xil3's user avatar

xil3xil3

16.2k8 gold badges61 silver badges96 bronze badges

4

Here is the simplest way I could find by extending TextView

public class CustomTextView extends androidx.appcompat.widget.AppCompatTextView {

float mStroke;

public CustomTextView(Context context, @Nullable AttributeSet attrs) {
    super(context, attrs);
    TypedArray a = context.obtainStyledAttributes(attrs,
            R.styleable.CustomTextView);
    mStroke=a.getFloat(R.styleable.CustomTextView_stroke,1.0f);
    a.recycle();
}

@Override
protected void onDraw(Canvas canvas) {
    TextPaint paint = this.getPaint();
    paint.setStyle(Paint.Style.STROKE);
    paint.setStrokeWidth(mStroke);
    
    super.onDraw(canvas);
}
}

then you only need to add the following to the attrs.xml file

<declare-styleable name="CustomTextView">
    <attr name="stroke" format="float"/>
</declare-styleable>

and now you will be able to set the stroke widht by app:stroke while retaining all other desirable properties of TextView. my solution only draws the stroke w/o a fill. this makes it a bit simpler than the others. bellow a screencapture with the result while setting a custom font to my customtextview.

enter image description here

answered Jan 5, 2021 at 2:40

quealegriamasalegre's user avatar

outline effect can be achieved using shadow in TextView:

    android:shadowColor="#000000"
    android:shadowDx="1.5"
    android:shadowDy="1.3"
    android:shadowRadius="1.6"
    android:text="CCC"
    android:textAllCaps="true"
    android:textColor="@android:color/white"

answered Feb 6, 2015 at 14:26

Rafał's user avatar

RafałRafał

1,1271 gold badge7 silver badges4 bronze badges

4

So, little late, but MagicTextView will do text outlines, amongst other things.

enter image description here

<com.qwerjk.better_text.MagicTextView
    xmlns:qwerjk="http://schemas.android.com/apk/res/com.qwerjk.better_text"
    android:textSize="78dp"
    android:textColor="#ff333333"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    qwerjk:strokeColor="#FFff0000"
    qwerjk:strokeJoinStyle="miter"
    qwerjk:strokeWidth="5"
    android:text="Magic" />

Note: I made this, and am posting more for the sake of future travelers than the OP.
It’s borderline spam, but being on-topic, perhaps acceptable?

answered Apr 24, 2012 at 8:24

ABentSpoon's user avatar

ABentSpoonABentSpoon

4,9771 gold badge26 silver badges23 bronze badges

5

It is quite an old question but still I don’t see any complete answers. So I am posting this solution, hoping that someone struggling with this problem might find it useful. The simplest and most effective solution is to override TextView class’ onDraw method. Most implementations I have seen use drawText method to draw the stroke but that approach doesn’t account for all the formatting alignment and text wrapping that goes in. And as a result often the stroke and text end up at different places. Following approach uses super.onDraw to draw both the stroke and fill parts of the text so you don’t have to bother about rest of the stuff. Here are the steps

  1. Extend TextView class
  2. Override onDraw method
  3. Set paint style to FILL
  4. call parent class on Draw to render text in fill
    mode.
  5. save current text color.
  6. Set current text color to your stroke color
  7. Set paint style to Stroke
  8. Set stroke width
  9. And call parent class onDraw again to draw the stroke over the
    previously rendered text.

    package com.example.widgets;
    
    import android.content.Context;
    import android.content.res.TypedArray;
    import android.graphics.Canvas;
    import android.graphics.Paint;
    import android.graphics.Typeface;
    import android.util.AttributeSet;
    import android.widget.Button;
    
    public class StrokedTextView extends Button {
    
        private static final int DEFAULT_STROKE_WIDTH = 0;
    
        // fields
        private int _strokeColor;
        private float _strokeWidth;
    
        // constructors
        public StrokedTextView(Context context) {
            this(context, null, 0);
        }
    
        public StrokedTextView(Context context, AttributeSet attrs) {
            this(context, attrs, 0);
        }
    
        public StrokedTextView(Context context, AttributeSet attrs, int defStyle) {
            super(context, attrs, defStyle);
    
            if(attrs != null) {
                TypedArray a = context.obtainStyledAttributes(attrs,R.styleable.StrokedTextAttrs);
                _strokeColor = a.getColor(R.styleable.StrokedTextAttrs_textStrokeColor,
                        getCurrentTextColor());         
                _strokeWidth = a.getFloat(R.styleable.StrokedTextAttrs_textStrokeWidth,
                        DEFAULT_STROKE_WIDTH);
    
                a.recycle();
            }
            else {          
                _strokeColor = getCurrentTextColor();
                _strokeWidth = DEFAULT_STROKE_WIDTH;
            } 
            //convert values specified in dp in XML layout to
            //px, otherwise stroke width would appear different
            //on different screens
            _strokeWidth = dpToPx(context, _strokeWidth);           
        }    
    
        // getters + setters
        public void setStrokeColor(int color) {
            _strokeColor = color;        
        }
    
        public void setStrokeWidth(int width) {
            _strokeWidth = width;
        }
    
        // overridden methods
        @Override
        protected void onDraw(Canvas canvas) {
            if(_strokeWidth > 0) {
                //set paint to fill mode
                Paint p = getPaint();
                p.setStyle(Paint.Style.FILL);        
                //draw the fill part of text
                super.onDraw(canvas);       
                //save the text color   
                int currentTextColor = getCurrentTextColor();    
                //set paint to stroke mode and specify 
                //stroke color and width        
                p.setStyle(Paint.Style.STROKE);
                p.setStrokeWidth(_strokeWidth);
                setTextColor(_strokeColor);
                //draw text stroke
                super.onDraw(canvas);      
               //revert the color back to the one 
               //initially specified
               setTextColor(currentTextColor);
           } else {
               super.onDraw(canvas);
           }
       }
    
       /**
        * Convenience method to convert density independent pixel(dp) value
        * into device display specific pixel value.
        * @param context Context to access device specific display metrics 
        * @param dp density independent pixel value
        * @return device specific pixel value.
        */
       public static int dpToPx(Context context, float dp)
       {
           final float scale= context.getResources().getDisplayMetrics().density;
           return (int) (dp * scale + 0.5f);
       }            
    }
    

That is all. This class uses custom XML attributes to enable specifying stroke color and width from the XML layout files. Therefore, you need to add these attributes in your attr.xml file in subfolder ‘values’ under folder ‘res’. Copy and paste the following in your attr.xml file.

<?xml version="1.0" encoding="utf-8"?>
<resources>

    <declare-styleable name="StrokedTextAttrs">
        <attr name="textStrokeColor" format="color"/>    
        <attr name="textStrokeWidth" format="float"/>
    </declare-styleable>                

</resources>

Once you are done with that, you can use the custom StrokedTextView class in your XML layout files and specify stroke color and width as well. Here is an example

<com.example.widgets.StrokedTextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Stroked text sample"
    android:textColor="@android:color/white"
    android:textSize="25sp"
    strokeAttrs:textStrokeColor="@android:color/black"
    strokeAttrs:textStrokeWidth="1.7" />

Remember to replace package name with your project’s package name. Also add the xmlns namespace in the layout file in order to use custom XML attributes. You can add the following line in your layout file’s root node.

xmlns:strokeAttrs="http://schemas.android.com/apk/res-auto"

answered Aug 11, 2015 at 14:53

Nouman Hanif's user avatar

12

The framework supports text-shadow but does not support text-outline. But there is a trick: shadow is something that is translucent and fades. Redraw the shadow a couple of times and all the alpha gets summed up and the result is an outline.

A very simple implementation extends TextView and overrides the draw(..) method. Every time a draw is requested our subclass does 5-10 drawings.

public class OutlineTextView extends TextView {

    // Constructors

    @Override
    public void draw(Canvas canvas) {
        for (int i = 0; i < 5; i++) {
            super.draw(canvas);
        }
    }

}


<OutlineTextView
    android:shadowColor="#000"
    android:shadowRadius="3.0" />

answered Aug 9, 2011 at 12:42

Zsolt Safrany's user avatar

Zsolt SafranyZsolt Safrany

13.1k6 gold badges49 silver badges62 bronze badges

2

I’ve just been trying to figure out how to do this and couldn’t find a good guide online but eventually figured it out. As Steve Pomeroy suggested, you do have to do something more involved. In order to get the outlined text effect, you draw the text twice: once with a thick outline and then the second time we draw the main text over the outline. But, the task is made easier because you can very easily adapt one of the code samples provided with the SDK, namely the one under this name in your SDK directory: «/samples/android-/ApiDemos/src/com/example/android/apis/view/LabelView.java». Which can also found on the Android developer website here.

Depending on what you’re doing, it’s very easy to see you will only need to make minor modifications to that code, such as changing it to extend from TextView, etc. Before I discovered this sample I forgot to override onMeasure() (which you must do in addition to overriding onDraw() as is mentioned in the «Building Custom Components» guide on the Android Developer website), which is part of why I was having trouble.

Once you’ve done that, you can do what I did:

public class TextViewOutline extends TextView {

private Paint mTextPaint;
private Paint mTextPaintOutline; //add another paint attribute for your outline
...
//modify initTextViewOutline to setup the outline style
   private void initTextViewOutline() {
       mTextPaint = new Paint();
       mTextPaint.setAntiAlias(true);
       mTextPaint.setTextSize(16);
       mTextPaint.setColor(0xFF000000);
       mTextPaint.setStyle(Paint.Style.FILL);

       mTextPaintOutline = new Paint();
       mTextPaintOutline.setAntiAlias(true);
       mTextPaintOutline.setTextSize(16);
       mTextPaintOutline.setColor(0xFF000000);
       mTextPaintOutline.setStyle(Paint.Style.STROKE);
       mTextPaintOutline.setStrokeWidth(4);

       setPadding(3, 3, 3, 3);
}
...
//make sure to update other methods you've overridden to handle your new paint object
...
//and finally draw the text, mAscent refers to a member attribute which had
//a value assigned to it in the measureHeight and Width methods
   @Override
   protected void onDraw(Canvas canvas) {
       super.onDraw(canvas);
       canvas.drawText(mText, getPaddingLeft(), getPaddingTop() - mAscent, 
           mTextPaintOutline);
       canvas.drawText(mText, getPaddingLeft(), getPaddingTop() - mAscent, mTextPaint);
   }

So, in order to get the outlined text effect, you draw the text twice: once with a thick outline and then the second time we draw the main text over the outline.

answered Oct 5, 2010 at 16:49

sversch's user avatar

sverschsversch

8468 silver badges21 bronze badges

0

credit to @YGHM add shadow support
enter image description here

package com.megvii.demo;
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.util.AttributeSet;

public class TextViewOutline extends android.support.v7.widget.AppCompatTextView {

// constants
private static final int DEFAULT_OUTLINE_SIZE = 0;
private static final int DEFAULT_OUTLINE_COLOR = Color.TRANSPARENT;

// data
private int mOutlineSize;
private int mOutlineColor;
private int mTextColor;
private float mShadowRadius;
private float mShadowDx;
private float mShadowDy;
private int mShadowColor;

public TextViewOutline(Context context) {
    this(context, null);
}

public TextViewOutline(Context context, AttributeSet attrs) {
    super(context, attrs);
    setAttributes(attrs);
}

private void setAttributes(AttributeSet attrs) {
    // set defaults
    mOutlineSize = DEFAULT_OUTLINE_SIZE;
    mOutlineColor = DEFAULT_OUTLINE_COLOR;
    // text color   
    mTextColor = getCurrentTextColor();
    if (attrs != null) {
        TypedArray a = getContext().obtainStyledAttributes(attrs, R.styleable.TextViewOutline);
        // outline size
        if (a.hasValue(R.styleable.TextViewOutline_outlineSize)) {
            mOutlineSize = (int) a.getDimension(R.styleable.TextViewOutline_outlineSize, DEFAULT_OUTLINE_SIZE);
        }
        // outline color
        if (a.hasValue(R.styleable.TextViewOutline_outlineColor)) {
            mOutlineColor = a.getColor(R.styleable.TextViewOutline_outlineColor, DEFAULT_OUTLINE_COLOR);
        }
        // shadow (the reason we take shadow from attributes is because we use API level 15 and only from 16 we have the get methods for the shadow attributes)
        if (a.hasValue(R.styleable.TextViewOutline_android_shadowRadius)
                || a.hasValue(R.styleable.TextViewOutline_android_shadowDx)
                || a.hasValue(R.styleable.TextViewOutline_android_shadowDy)
                || a.hasValue(R.styleable.TextViewOutline_android_shadowColor)) {
            mShadowRadius = a.getFloat(R.styleable.TextViewOutline_android_shadowRadius, 0);
            mShadowDx = a.getFloat(R.styleable.TextViewOutline_android_shadowDx, 0);
            mShadowDy = a.getFloat(R.styleable.TextViewOutline_android_shadowDy, 0);
            mShadowColor = a.getColor(R.styleable.TextViewOutline_android_shadowColor, Color.TRANSPARENT);
        }

        a.recycle();
    }

}

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    setPaintToOutline();
    super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}

private void setPaintToOutline() {
    Paint paint = getPaint();
    paint.setStyle(Paint.Style.STROKE);
    paint.setStrokeWidth(mOutlineSize);
    super.setTextColor(mOutlineColor);
    super.setShadowLayer(0, 0, 0, Color.TRANSPARENT);

}

private void setPaintToRegular() {
    Paint paint = getPaint();
    paint.setStyle(Paint.Style.FILL);
    paint.setStrokeWidth(0);
    super.setTextColor(mTextColor);
    super.setShadowLayer(mShadowRadius, mShadowDx, mShadowDy, mShadowColor);
}


@Override
public void setTextColor(int color) {
    super.setTextColor(color);
    mTextColor = color;
}


public void setOutlineSize(int size) {
    mOutlineSize = size;
}

public void setOutlineColor(int color) {
    mOutlineColor = color;
}

@Override
protected void onDraw(Canvas canvas) {
    setPaintToOutline();
    super.onDraw(canvas);

    setPaintToRegular();
    super.onDraw(canvas);
}

}

attr define

<declare-styleable name="TextViewOutline">
    <attr name="outlineSize" format="dimension"/>
    <attr name="outlineColor" format="color|reference"/>
    <attr name="android:shadowRadius"/>
    <attr name="android:shadowDx"/>
    <attr name="android:shadowDy"/>
    <attr name="android:shadowColor"/>
</declare-styleable>

xml code below

<com.megvii.demo.TextViewOutline
    android:id="@+id/product_name"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="center_horizontal"
    android:layout_marginTop="110dp"
    android:background="#f4b222"
    android:fontFamily="@font/kidsmagazine"
    android:padding="10dp"
    android:shadowColor="#d7713200"
    android:shadowDx="0"
    android:shadowDy="8"
    android:shadowRadius="1"
    android:text="LIPSTICK SET"
    android:textColor="@android:color/white"
    android:textSize="30sp"
    app:outlineColor="#cb7800"
    app:outlineSize="3dp" />

answered Mar 14, 2019 at 7:20

Arthur's user avatar

ArthurArthur

1791 silver badge6 bronze badges

2

You can do this programmatically with the below snippet.
That provides white letters with black background:

textView.setTextColor(Color.WHITE);            
textView.setShadowLayer(1.6f,1.5f,1.3f,Color.BLACK);

The parameters of the method are radius,dx,dy,color. You can change them for you specific needs.

I hope I will help someone that creates TextView programmatically and not having it inside xml.

Cheers to the stackOverflow community!

answered May 24, 2018 at 15:16

Farmaker's user avatar

FarmakerFarmaker

2,65011 silver badges16 bronze badges

I want to add a solution in order to solve the performance issue. For example, the answer of @YGHM and a few others does the job, but it causes infinite call of onDraw because setTextColor calls invalidate(). So in order to solve it, you also need to override invalidate() and add a variable isDrawing that you will set to true, when onDraw() is in progress and drawing with a stroke. invalidate will return if the variable is true.

override fun invalidate() {
    if (isDrawing) return
    super.invalidate()
  }

Your onDraw will look like this:

override fun onDraw(canvas: Canvas) {
    if (strokeWidth > 0) {
      isDrawing = true
      val textColor = textColors.defaultColor
      setTextColor(strokeColor)
      paint.strokeWidth = strokeWidth
      paint.style = Paint.Style.STROKE
      super.onDraw(canvas)
      setTextColor(textColor)
      paint.strokeWidth = 0f
      paint.style = Paint.Style.FILL
      isDrawing = false
      super.onDraw(canvas)
    } else {
      super.onDraw(canvas)
    }
  }

answered Feb 13, 2019 at 23:22

Sermilion's user avatar

SermilionSermilion

1,7833 gold badges30 silver badges50 bronze badges

1

Here’s the trick I found that works better than MagicTextView’s stroke IMO

@Override
protected void onDraw(Canvas pCanvas) {
    int textColor = getTextColors().getDefaultColor();
    setTextColor(mOutlineColor); // your stroke's color
    getPaint().setStrokeWidth(10);
    getPaint().setStyle(Paint.Style.STROKE);
    super.onDraw(pCanvas);
    setTextColor(textColor);
    getPaint().setStrokeWidth(0);
    getPaint().setStyle(Paint.Style.FILL);
    super.onDraw(pCanvas);
}

answered May 28, 2014 at 10:46

VinZen's user avatar

VinZenVinZen

3033 silver badges12 bronze badges

4

I’ve written a class to perform text with outline and still support all the other attributes and drawing of a normal text view.

it basically uses the super.onDraw(Canves canvas) on the TextView but draws twice with different styles.

hope this helps.

public class TextViewOutline extends TextView {

    // constants
    private static final int DEFAULT_OUTLINE_SIZE = 0;
    private static final int DEFAULT_OUTLINE_COLOR = Color.TRANSPARENT;

    // data
    private int mOutlineSize;
    private int mOutlineColor;
    private int mTextColor;
    private float mShadowRadius;
    private float mShadowDx;
    private float mShadowDy;
    private int mShadowColor;

    public TextViewOutline(Context context) {
        this(context, null);
    }

    public TextViewOutline(Context context, AttributeSet attrs) {
        super(context, attrs);
        setAttributes(attrs);
    }

    private void setAttributes(AttributeSet attrs){ 
        // set defaults
        mOutlineSize = DEFAULT_OUTLINE_SIZE;
        mOutlineColor = DEFAULT_OUTLINE_COLOR;   
        // text color   
        mTextColor = getCurrentTextColor();
        if(attrs != null) {
            TypedArray a = getContext().obtainStyledAttributes(attrs,R.styleable.TextViewOutline);
            // outline size
            if (a.hasValue(R.styleable.TextViewOutline_outlineSize)) {
                mOutlineSize = (int) a.getDimension(R.styleable.TextViewOutline_outlineSize, DEFAULT_OUTLINE_SIZE);
            }
            // outline color
            if (a.hasValue(R.styleable.TextViewOutline_outlineColor)) {
                mOutlineColor = a.getColor(R.styleable.TextViewOutline_outlineColor, DEFAULT_OUTLINE_COLOR);
            }
            // shadow (the reason we take shadow from attributes is because we use API level 15 and only from 16 we have the get methods for the shadow attributes)
            if (a.hasValue(R.styleable.TextViewOutline_android_shadowRadius) 
                    || a.hasValue(R.styleable.TextViewOutline_android_shadowDx)
                    || a.hasValue(R.styleable.TextViewOutline_android_shadowDy) 
                    || a.hasValue(R.styleable.TextViewOutline_android_shadowColor)) {
                mShadowRadius = a.getFloat(R.styleable.TextViewOutline_android_shadowRadius, 0);
                mShadowDx = a.getFloat(R.styleable.TextViewOutline_android_shadowDx, 0);
                mShadowDy = a.getFloat(R.styleable.TextViewOutline_android_shadowDy, 0);
                mShadowColor = a.getColor(R.styleable.TextViewOutline_android_shadowColor, Color.TRANSPARENT);
            }

            a.recycle();
        }

        PFLog.d("mOutlineSize = " + mOutlineSize);
        PFLog.d("mOutlineColor = " + mOutlineColor);
    }

    private void setPaintToOutline(){
        Paint paint = getPaint();
        paint.setStyle(Paint.Style.STROKE);
        paint.setStrokeWidth(mOutlineSize);
        super.setTextColor(mOutlineColor);
        super.setShadowLayer(mShadowRadius, mShadowDx, mShadowDy,  mShadowColor);
    }

    private void setPaintToRegular() {
        Paint paint = getPaint();
        paint.setStyle(Paint.Style.FILL);
        paint.setStrokeWidth(0);
        super.setTextColor(mTextColor);
        super.setShadowLayer(0, 0, 0, Color.TRANSPARENT);
    } 

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        setPaintToOutline();
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    }

    @Override
    public void setTextColor(int color) {
        super.setTextColor(color);
        mTextColor = color;
    } 

    @Override
    public void setShadowLayer(float radius, float dx, float dy, int color) {
        super.setShadowLayer(radius, dx, dy, color);
        mShadowRadius = radius;
        mShadowDx = dx;
        mShadowDy = dy;
        mShadowColor = color;
    }

    public void setOutlineSize(int size){
        mOutlineSize = size;
    }

    public void setOutlineColor(int color){
       mOutlineColor = color;
    }

    @Override
    protected void onDraw(Canvas canvas) {
        setPaintToOutline();
        super.onDraw(canvas);
        setPaintToRegular();
        super.onDraw(canvas);
    }

}

attr.xml

<declare-styleable name="TextViewOutline">
    <attr name="outlineSize" format="dimension"/>
    <attr name="outlineColor" format="color|reference"/>
    <attr name="android:shadowRadius"/>
    <attr name="android:shadowDx"/>
    <attr name="android:shadowDy"/>
    <attr name="android:shadowColor"/>
</declare-styleable>

answered Feb 28, 2016 at 12:53

YGHM's user avatar

YGHMYGHM

1311 silver badge9 bronze badges

1

I have created a library based on Nouman Hanif’s answer with some additions. For example, fixing a bug that caused an indirect infinite loop on View.invalidate() calls.

OTOH, the library also supports outlined text in EditText widgets, as it was my real goal and it needed a bit more work than TextView.

Here is the link to my library: https://github.com/biomorgoth/android-outline-textview

Thanks to Nouman Hanif for the initial idea on the solution!

Community's user avatar

answered Jan 10, 2017 at 17:17

biomorgoth's user avatar

biomorgothbiomorgoth

6304 silver badges8 bronze badges

I found simple way to outline view without inheritance from TextView.
I had wrote simple library that use Android’s Spannable for outlining text.
This solution gives possibility to outline only part of text.

I already had answered on same question (answer)

Class:

class OutlineSpan(
        @ColorInt private val strokeColor: Int,
        @Dimension private val strokeWidth: Float
): ReplacementSpan() {

    override fun getSize(
            paint: Paint,
            text: CharSequence,
            start: Int,
            end: Int,
            fm: Paint.FontMetricsInt?
    ): Int {
        return paint.measureText(text.toString().substring(start until end)).toInt()
    }


    override fun draw(
            canvas: Canvas,
            text: CharSequence,
            start: Int,
            end: Int,
            x: Float,
            top: Int,
            y: Int,
            bottom: Int,
            paint: Paint
    ) {
        val originTextColor = paint.color

        paint.apply {
            color = strokeColor
            style = Paint.Style.STROKE
            this.strokeWidth = this@OutlineSpan.strokeWidth
        }
        canvas.drawText(text, start, end, x, y.toFloat(), paint)

        paint.apply {
            color = originTextColor
            style = Paint.Style.FILL
        }
        canvas.drawText(text, start, end, x, y.toFloat(), paint)
    }

}

Library: OutlineSpan

answered Jul 9, 2018 at 6:49

Pavel Santaev's user avatar

1

MagicTextView is very useful to make stroke font, but in my case, it cause error like
this
this error caused by duplication background attributes which set by MagicTextView

so you need to edit attrs.xml and MagicTextView.java

attrs.xml

<attr name="background" format="reference|color" />
 ↓
<attr name="mBackground" format="reference|color" />

MagicTextView.java 88:95

if (a.hasValue(R.styleable.MagicTextView_mBackground)) {
Drawable background = a.getDrawable(R.styleable.MagicTextView_mBackground);
if (background != null) {
    this.setBackgroundDrawable(background);
} else {
    this.setBackgroundColor(a.getColor(R.styleable.MagicTextView_mBackground, 0xff000000));
}
}

answered Aug 13, 2016 at 13:27

kazuwombat's user avatar

kazuwombatkazuwombat

1,4071 gold badge15 silver badges18 bronze badges

So you want a stroke around the textview? Unfortunately there is no simple way to do it with the styling. You’ll have to create another view and place your textview over-top, making the parent view (the one it’s on top of) just a few pixels bigger — this should create an outline.

answered Jul 5, 2010 at 22:10

xil3's user avatar

xil3xil3

16.2k8 gold badges61 silver badges96 bronze badges

4

Here is the simplest way I could find by extending TextView

public class CustomTextView extends androidx.appcompat.widget.AppCompatTextView {

float mStroke;

public CustomTextView(Context context, @Nullable AttributeSet attrs) {
    super(context, attrs);
    TypedArray a = context.obtainStyledAttributes(attrs,
            R.styleable.CustomTextView);
    mStroke=a.getFloat(R.styleable.CustomTextView_stroke,1.0f);
    a.recycle();
}

@Override
protected void onDraw(Canvas canvas) {
    TextPaint paint = this.getPaint();
    paint.setStyle(Paint.Style.STROKE);
    paint.setStrokeWidth(mStroke);
    
    super.onDraw(canvas);
}
}

then you only need to add the following to the attrs.xml file

<declare-styleable name="CustomTextView">
    <attr name="stroke" format="float"/>
</declare-styleable>

and now you will be able to set the stroke widht by app:stroke while retaining all other desirable properties of TextView. my solution only draws the stroke w/o a fill. this makes it a bit simpler than the others. bellow a screencapture with the result while setting a custom font to my customtextview.

enter image description here

answered Jan 5, 2021 at 2:40

quealegriamasalegre's user avatar

Я не могу найти способ обвести текст (на самом тексте, а не на всем текстовом поле), обводка должна быть вокруг букв. есть ли какое-либо пользовательское текстовое представление или библиотека или рисунок, который можно реализовать для рисования штриха

        <TextView
            style="@style/Header"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:layout_marginTop="150dp"
            android:text="HELLO DROID"
            />

Я ожидаю, что текст будет выглядеть так (цвет обводки красный) введите описание изображения здесь

1 ответ

Лучший ответ

Я пробовал два способа добавить обводку к тексту:

Сначала добавьте тень к вашему TextView:

<TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="50sp"
        android:textColor="@android:color/holo_blue_light"
        android:text="Hello"
        android:shadowRadius="10"
        android:shadowDx="1"
        android:shadowDy="1"
        android:shadowColor="@android:color/holo_red_dark"/>

Вывод приведенного выше кода: введите описание изображения здесь

Во-вторых, я нашел проект GitHub android-outline-textview . Перейдите по этой ссылке

Для этого вам нужно добавить в свой проект StrokedTextView и связанные файлы. после этого добавьте ниже код в XML-файл:

 <com.skd.stackdemo.StrokedTextView
        android:id="@+id/stroke"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="60sp"
        android:text="Hello"
        android:textColor="@android:color/holo_blue_light"
        android:layout_marginTop="30dp"/>

Добавьте ниже код в файл Java:

StrokedTextView stroke = findViewById(R.id.stroke);
stroke.setStrokeColor(Color.RED);
stroke.setStrokeWidth(1f);

Вывод приведенного выше кода: введите описание изображения здесь

Надеюсь, это сработает для вас.


2

Android Geek
5 Дек 2019 в 08:19

Как рисовать, добавлять текст и лупу на фото в iPhone и iPad без установки дополнительных приложений

С выходом iOS 10 в мобильной операционной системе Apple появилась новая полезная функция для любителей редактировать изображения — «Разметка». В этом материале мы расскажем как ею пользоваться.

«Разметка» запускается как из приложения «Фото», так и непосредственно из штатного мессенджера «iMessage» (приложение Сообщения).

Видео инструкция

Как рисовать, добавлять текст и лупу на фото в iPhone и iPad

Для того, чтобы запустить эту функцию из медиатеки iPhone или iPad, выполните следующие действия:

1. Откройте любое изображение из приложения «Фото».

3. Нажмите на кружочек с тремя точками.

4. Выберите кнопку «Разметка».

В нижней части располагается панель инструментов, при помощи которой можно рисовать кистью, добавлять настраиваемую, как по размеру, так и по зуму лупу, а также добавлять текст, фигуры и подпись.

Как рисовать, добавлять текст и лупу на фото в iPhone и iPad в приложении Сообщения

Запускается разметка также непосредственно из :

1. Запустите приложение Сообщения с настроенным iMessage (инструкция по настройке).

2. Тапните по иконке для добавления нового фото, а затем выберите фото из Медиатеке или снимите новое.

4. Перейдите в раздел «Разметка».

Разметка — действительно полезная функция, позволяющая отказаться от скачивания дополнительного софта из App Store для простого редактирования изображений.

Источник

Как подписать фото на iPhone или добавить текст (надпись) на картинку?

Наши айфоны позволяют нам не только общаться всеми доступными способами и решать важные задачи в офисных и рабочих приложениях, но и дают широкие возможности развивать свой творческий потенциал. Одна из многочисленных творческих опций – фотографирование и редактирование получившихся фото, их подпись или нанесение текста на “фото-шедевры”.

В наше время большой популярностью пользуются фотографии с надписями – их используют как для контента в социальных сетях, так и для офисных презентаций и докладов. Оформить красивые фото с подписями можно без профессиональных дизайнерских программ на компьютере – с этим легко справится Ваш iPhone.

В базовых программах айфонов не предусмотрены утилиты по добавлению текста, но в AppStore Вы найдёте широкий выбор бесплатных программ данного профиля. Они подходят для всех моделей айфонов, выпускаемых в последние годы. Сегодня в статье мы расскажем о паре таких приложений, и покажем, как ими пользоваться, с помощью фото- и видео-инструкций, сделанных на iPhone 8 plus.

Оглавление

Как в iPhone наложить текст на фото при помощи приложения (обзор Over)

Сегодня мы покажем пример работы в приложении Over, которое является одним из самых популярных среди пользователей уже долгое время. Оно позволяет подбирать стили и шаблоны для создания картинок с надписями по различным тематикам, для разных социальных сетей, выбирать коллекции шрифтов. Но в статье мы рассмотрим основной момент – сам процесс добавления текста.

Как только приложение установится на Ваш девайс и Вы зарегистрируетесь, начинайте работу, следуя нашим подсказкам:

  • Открываем приложение, нажимаем на значок плюса, чтобы начать проект.

Рисунок 1. Жмём знак «+».

  • Нажимаем опцию «Image», чтобы открыть нужное фото.

Рисунок 2. Нажимаем Image, чтобы выбрать фотографию.

  • В открывшемся окне с коллекцией своих фото выбираем то, с которым будем работать, жмём.

Рисунок 3. Выбираем фото для работы.

  • Программа предлагает разные варианты форматов фото, выбираем нужный нам, и подтверждаем нажатием галочки.

Рисунок 4. Подбираем формат, подтверждаем.

  • Чтобы начать работать с текстом, нажимаем на опцию «Text».

Рисунок 5. Жмём «Text».

  • В разделе «Font» выбираем шрифт текста.

Рисунок 6. Выбор шрифта

  • Чтобы создать надпись, дважды щёлкните пальцем на изображении шрифта на картинке. Появится окошко, где мы редактируем текст, затем подтверждаем галочкой.

Рисунок 7. Пишем текст, подтвердим галочкой.

  • В меню Style нас ждут интересные функции: округлить буквы, увеличить/уменьшить заглавные относительно второстепенных, и т.п.

Рисунок 8. Создаём стиль.

  • В разделе Color выбираем цвет и оттенки

Рисунок 9. Выбор цвета

Size позволяет нам изменить размер шрифта, Shadow – добавить тень буквам, Capacity – сделать шрифт бледнее или чётче, Rotate – перевернуть.

Рисунок 10. Дополнительные функции.

Когда Вы довольны получившимся результатом надписи после редактирования, остаётся нажать галочку вверху справа – это сохранит проект в приложении.

Рисунок 11. Жмём галочку, чтобы завершить работу

  • Для сохранения картинки, нажимаем желтый значок справа в верхнем углу, затем – иконку Save внизу слева. Фотография с надписью сохранится в Фото.

Рисунок 12. Жмём значок стрелки вверху.

Рисунок 13. Сохраняем с помощью функции Save.

Как добавить водяной знак на фотографию в iPhone при помощи приложения (обзор eZy Watermark lite).

Помимо добавления надписей, с помощью приложений для айфона на фото можно ставить водяные знаки (watermark). Одна из таких утилит – программа eZy Watermark lite. Рассмотрим работу в нем:

  • Открываем приложение, выбираем Single Image, чтобы открыть нужное изображение, добавляем его из Фото.

Рисунок 14. Открываем необходимое фото.

  • Нажимаем значок «+» под открывшейся фотографией.

Рисунок 15. Нажимаем «+».

  • В открывшемся меню мы можем выбрать, что нужно добавить: текст, фото из Инстаграм, Facebook или Гугл, qr-код или подпись. Если “вотермарк” ещё не создан, можно его нарисовать прямо здесь в приложении, для этого выбираем Autograph.

Рисунок 16. Чтобы создать автограф, нажимаем одноимённую опцию.

  • В появившемся окне пишем роспись или любой знак (цвет можно выбрать), сохраняем нажатием на галочку.

Рисунок 17. Рисуем автограф.

  • Выбираем место для вотермарка на нашем рисунке, редактируем размер и наклон. Для сохранения результата жмём иконку галочки.

Рисунок 18. Размещаем вотермарк на фото.

  • Чтобы сохранить готовый проект, нажимаем галку в нижнем правом углу. Рисунок с водяным знаком сохранится в разделе Фото.

Рисунок 19. Сохраняем проект в Фото.

Таким же образом Вы сможете помещать на свои фото любые профессиональные водяные знаки, сохранённые у Вас на айфоне или в вышеуказанных приложениях.

Видео-инструкции

Для тех пользователей, кто воспринимает материал больше в визуальной степени и предпочитает не тратить время на чтение инструктажа в форме текста, мы записали видео-инструкции, где подробно показали, как поместить текст и водяной знак на фото (на примере приложений Over и eZy Watermark lite). Приятного просмотра и легкой работы с приложениями!

Как написать текст на картинке:

Как наложить водяной знак:

Выводы

Как мы узнали из статьи, благодаря приложениям-редакторам, мы можем создавать разнообразные и оригинальные картинки с подписями, беря за основу любое изображение. Шаблонов для текста и опций редактирования множество, они немного отличаются в разных приложениях, но принцип работы везде одинаковый.

Также мы можем наложить на основное изображение другой рисунок или символ, например, водяной знак.

Какое приложение выбрать, каждый пользователь сможет понять сам, поработав с ними на практике и выбрав тот интерфейс и опции, которые ему будут более удобны.

Мы постарались максимально подробно рассказать и показать процесс добавления текста, и надеемся, что теперь наши читатели с легкостью будут создавать шедевры!

Источник

  • Как ноутбук соединить с телефоном
  • Как ноутбук синхронизировать с телефоном
  • Как ноутбук связать с телефоном
  • Как ноутбук подключить к wifi телефона
  • Как ноут подключить к телефону