Ho avuto lo stesso problema. Una delle mie prime soluzioni sta seguendo.
/**
* 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);
}
Quello che manca:
- Nessun meccanismo di interruzione linea intelligente, dal momento che rompe basa sul maxwidth
Come chiamare?
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);
Ho una classe statica chiamata CanvasUtils in cui incapsulo cose del genere. Fondamentalmente disegno il testo all'interno di un rettangolo. Questo è il motivo textHeight è l'altezza del testo. Ma puoi passare ciò che vuoi alla funzione.
Buona programmazione!
fonte
2015-08-14 19:06:56
Vedere questa risposta per un buon esempio di utilizzo di 'StaticLayout's: http://stackoverflow.com/a/8369690/293280 –