Ответ 1
Для этого можно использовать класс android.text.StaticLayout
; просто создайте StaticLayout
для нужного текста, выравнивания, ширины и т.д. и вызовите его метод draw(Canvas)
для рисования на холст.
У меня есть настраиваемый элемент управления, который делает много 2D-чертежа прямо на canvas
.
Некоторые из этого рисунка являются текстом, поэтому я использую метод Canvas.drawText()
.
Я хочу нарисовать текст в определенных пределах - верхнюю левую, определенную максимальную ширину и максимальное количество строк. После рисования текста я хочу знать, сколько строк оно взяло.
Есть ли встроенная функция для рисования текста в пределах границ, делающих расщепление разумно?
Если нет, существует ли стандартный рецепт для этого?
Для этого можно использовать класс android.text.StaticLayout
; просто создайте StaticLayout
для нужного текста, выравнивания, ширины и т.д. и вызовите его метод draw(Canvas)
для рисования на холст.
Вы можете использовать Paint.getTextBounds() для измерения размера всей строки или Paint.getTextWidths(), чтобы получить ширину каждого символа. Затем разделите строку соответствующим образом перед ее рисованием.
У меня была та же проблема. Одно из моих первых решений следующее.
/**
* This function draws the text on the canvas based on the x-, y-position.
* If it has to break it into lines it will do it based on the max width
* provided.
*
* @author Alessandro Giusa
* @version 0.1, 14.08.2015
* @param canvas
* canvas to draw on
* @param paint
* paint object
* @param x
* x position to draw on canvas
* @param y
* start y-position to draw the text.
* @param maxWidth
* maximal width for break line calculation
* @param text
* text to draw
*/
public static void drawTextAndBreakLine(final Canvas canvas, final Paint paint,
final float x, final float y, final float maxWidth, final String text) {
String textToDisplay = text;
String tempText = "";
char[] chars;
float textHeight = paint.descent() - paint.ascent();
float lastY = y;
int nextPos = 0;
int lengthBeforeBreak = textToDisplay.length();
do {
lengthBeforeBreak = textToDisplay.length();
chars = textToDisplay.toCharArray();
nextPos = paint.breakText(chars, 0, chars.length, maxWidth, null);
tempText = textToDisplay.substring(0, nextPos);
textToDisplay = textToDisplay.substring(nextPos, textToDisplay.length());
canvas.drawText(tempText, x, lastY, paint);
lastY += textHeight;
} while(nextPos < lengthBeforeBreak);
}
Что не хватает:
Как позвонить?
paint.setTextSize(40);
paint.setColor(Color.WHITE);
paint.setSubpixelText(true);
float textHeight = paint.descent() - paint.ascent();
CanvasUtils.drawTextAndBreakLine(canvas, paint, this.left,
textHeight, this.displayWidth, this.text);
У меня есть статический класс CanvasUtils, где я инкапсулирую такие вещи. В основном я рисую текст внутри прямоугольника. Вот почему textHeight - это высота текста. Но вы можете передать то, что хотите для этой функции.
Хорошее программирование!