【问题标题】:Wrapping long text on an Android Canvas在 Android 画布上包装长文本
【发布时间】:2010-02-25 19:27:27
【问题描述】:

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

这幅画有些是文字,所以我使用Canvas.drawText()方法。

我想在某些范围内绘制文本 - 左上角、某个最大宽度和最大行数。画完文字,想知道用了多少行。

是否有内置函数可以在边界内绘制文本以进行明智的拆分?

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

【问题讨论】:

标签: android canvas 2d


【解决方案1】:

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

【讨论】:

  • 我居然忽略了它
  • 这仅适用于Android吗?其他平台呢?
  • 太棒了!如何将文本在画布中居中?
  • @zboarda 不确定你的意思,但你试过 Paint.setTextAlign(Align.CENTER); ?
【解决方案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 是文本高度的原因。但是你可以将你想要的传递给函数。

    编程不错!

    【讨论】:

    • 是的,这对我有用,但它会迫使文字中断!有没有办法解决这个问题?
    • 嘿Eenvincible,你是说单字吗?断字?
    • 不是特别的。这段代码发生的情况是,文本在矩形内正确换行,但有些单词被截断,最终分成新行,部分单词显示在一行中,部分单词显示在下一行。
    • 这就是我要说的。并且您想要一个能够正确进行连字的算法,或者一个只是将受影响的单词放入下一行的算法?
    猜你喜欢
    • 1970-01-01
    • 2014-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-10
    • 1970-01-01
    相关资源
    最近更新 更多