我有一个自定义控件,它直接在canvas
进行大量2D绘图。
这张图的一部分是文字,所以我使用的是Canvas.drawText()
方法。
我想在某些范围内绘制文本 - 左上角,某个最大宽度和最大行数。在绘制文本后,我想知道它花了多少行。
是否有内置函数在界限范围内绘制文本进行明智的分割?
如果没有,是否有这样做的标准配方?
答案 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);
}
缺少什么:
如何打电话?
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是文本高度的原因。但是你可以将你想要的东西传递给函数。
良好的编程!