Надеюсь, быстрый вопрос, но я не могу найти никаких примеров ... Я хотел бы написать многострочный текст на заказ View
через a Canvas
, и у onDraw()
меня есть:
...
String text = "This is\nmulti-line\ntext";
canvas.drawText(text, 100, 100, mTextPaint);
...
Я надеялся, что это приведет к разрывам строк, но вместо этого я вижу загадочные символы там, где \n
они будут.
Любые указатели приветствуются.
Павел
android
android-canvas
Пол Меннега
источник
источник
Layout
вместоCanvas.drawText
прямого вызова . В этом разделе вопросов и ответов показано, как использовать aStaticLayout
для рисования многострочного текста.Ответы:
К сожалению, Android не знает, что это
\n
такое. Что вам нужно сделать, так это разделить,\n
а затем сместить Y, чтобы текст появился на следующей строке. Так примерно так:источник
drawText()
?Я нашел другой способ, используя статические макеты. Код здесь, чтобы любой мог сослаться на:
источник
canvas.getWidth()
действительно должно бытьgetWidth() - getPaddingLeft() - getPaddingRight()
, чтобы учесть отступы представления. Также обратите внимание, что вы можете вычислить StaticLayout только тогда, когда ваш текст или размер вашего представления изменится, и нарисовать его, не создавая новый, что, вероятно, лучше!Просто перебирайте каждую строку:
источник
Я написал полный пример
colors.xml
класс Java
источник
int noOfLines = gText.split("\n").length
Это мое решение, основанное на ответе @Dave (спасибо, кстати ;-))
Я пытался унаследовать Canvas, но на самом деле это не позволяет. Так что это промежуточный класс!
источник
Я должен добавить сюда свою версию, которая также учитывает ШИРИНУ ХОДА.
источник
это сработает. я тестировал
Источник: http://www.skoumal.net/en/android-drawing-multiline-text-on-bitmap/
источник
Да. Используйте
canvas.getFontSpacing()
как приращение. Я пробовал сам из любопытства, и он работает для любого размера шрифта.источник
попробуй это
источник
Я повторно использовал решение, предложенное GreenBee, и создал функцию для рисования многострочного текста в заданных границах с "..." в конце, если произошло усечение:
источник
Решение без StaticLayout
источник
Я работал с тем, что у меня было, которое уже преобразовало отдельные строки в холсты, и я отработал ответ Лумиса, и в итоге я получил это. 1.3 и 1.3f означают отступы между строками относительно размера шрифта.
источник
Я столкнулся с подобной проблемой. но я должен вернуть путь текста. вы можете нарисовать этот путь на холсте. это мой код. Я использую разрыв текста. и path.op
и для поиска привязанного текста я использовал эту функцию
источник
Для пользователей Kotlin. Многострочный текст можно создать с помощью StaticLayout . Нашел отличное объяснение и как использовать его как функцию расширения здесь. https://medium.com/over-engineering/drawing-multiline-text-to-canvas-on-android-9b98f0bfa16a
источник
Помимо рисования многострочного текста, может возникнуть проблема с получением границ многострочного текста (например, чтобы выровнять его на холсте).
По умолчанию
paint.getTextBounds()
в этом случае работать не будет, так как измеряется единственная линия.Для удобства я создал эти две функции расширения: одну для рисования многострочного текста, а другую для получения границ текста.
Теперь использовать это очень просто: Для рисования многострочного текста:
Для измерения текста:
val bounds = yourPaint.getTextBoundsMultiLine (текст)
В этом случае он будет измерять весь текст от начала до конца и с использованием значения по умолчанию после выделенного (изменяемого) Rect.
Вы можете поиграть с передачей дополнительных параметров для большей гибкости.
источник
Мой пример с динамическим изменением размера текста и интервалом, отлично подходит для меня ...
источник