在Android Canvas上包装长文本

时间:2010-02-25 19:27:28

标签: android canvas 2d

我有一个自定义控件,它直接在canvas进行大量2D绘图。

这张图的一部分是文字,所以我使用的是Canvas.drawText()方法。

我想在某些范围内绘制文本 - 左上角,某个最大宽度和最大行数。在绘制文本后,我想知道它花了多少行。

是否有内置函数在界限范围内绘制文本进行明智的分割?

如果没有,是否有这样做的标准配方?

3 个答案:

答案 0 :(得分:30)

您可以使用android.text.StaticLayout类来实现此目的;只需为所需的文本,对齐方式,宽度等创建StaticLayout,然后调用其draw(Canvas)方法绘制到画布。

答案 1 :(得分:4)

您可以使用Paint.getTextBounds()来测量整个字符串的大小,或使用Paint.getTextWidths()来获取每个字符的宽度。然后在绘制之前适当地拆分字符串。

答案 2 :(得分: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是文本高度的原因。但是你可以将你想要的东西传递给函数。

良好的编程!