Подтвердить что ты не робот

Обтекание длинного текста на холсте Android

У меня есть настраиваемый элемент управления, который делает много 2D-чертежа прямо на canvas.

Некоторые из этого рисунка являются текстом, поэтому я использую метод Canvas.drawText().

Я хочу нарисовать текст в определенных пределах - верхнюю левую, определенную максимальную ширину и максимальное количество строк. После рисования текста я хочу знать, сколько строк оно взяло.

Есть ли встроенная функция для рисования текста в пределах границ, делающих расщепление разумно?

Если нет, существует ли стандартный рецепт для этого?

4b9b3361

Ответ 1

Для этого можно использовать класс android.text.StaticLayout; просто создайте StaticLayout для нужного текста, выравнивания, ширины и т.д. и вызовите его метод draw(Canvas) для рисования на холст.

Ответ 2

Вы можете использовать Paint.getTextBounds() для измерения размера всей строки или Paint.getTextWidths(), чтобы получить ширину каждого символа. Затем разделите строку соответствующим образом перед ее рисованием.

Ответ 3

У меня была та же проблема. Одно из моих первых решений следующее.

/**
     * 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);
}

Что не хватает:

  • Отсутствует интеллектуальный механизм прерывания, поскольку он разбивается на основе maxWidth

Как позвонить?

    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 - это высота текста. Но вы можете передать то, что хотите для этой функции.

Хорошее программирование!