Continuer à améliorer les réponses de Dee et FrinkTheBrave. J'ai ajouté un Rect à la méthode pour permettre le dessin dans une zone de largeur particulière. Nous chercherons à le modifier pour sélectionner une taille de police appropriée et nous assurer que la taille est correcte. Cela vous permettra de spécifier la largeur des lignes que vous voulez écrire, ce qui est très utile pour décomposer une chaîne de texte non formatée en lignes de longueur similaire et les dessiner sur un canevas.
private void drawMultilineText(String str, int x, int y, Paint paint, Canvas canvas, int fontSize, Rect drawSpace) {
int lineHeight = 0;
int yoffset = 0;
String[] lines = str.split(" ");
// set height of each line (height of text + 20%)
lineHeight = (int) (calculateHeightFromFontSize(str, fontSize) * 1.2);
// draw each line
String line = "";
for (int i = 0; i < lines.length; ++i) {
if(calculateWidthFromFontSize(line + " " + lines[i], fontSize) <= drawSpace.width()){
line = line + " " + lines[i];
}else{
canvas.drawText(line, x, y + yoffset, paint);
yoffset = yoffset + lineHeight;
line = lines[i];
}
}
canvas.drawText(line, x, y + yoffset, paint);
}
private int calculateWidthFromFontSize(String testString, int currentSize)
{
Rect bounds = new Rect();
Paint paint = new Paint();
paint.setTextSize(currentSize);
paint.getTextBounds(testString, 0, testString.length(), bounds);
return (int) Math.ceil(bounds.width());
}
private int calculateHeightFromFontSize(String testString, int currentSize)
{
Rect bounds = new Rect();
Paint paint = new Paint();
paint.setTextSize(currentSize);
paint.getTextBounds(testString, 0, testString.length(), bounds);
return (int) Math.ceil(bounds.height());
}
Cette réponse comprend cet excellent extrait de code trouvé ici dans une réponse précédente par user850688 https://stackoverflow.com/a/11353080/1759409
merci. Je ne savais pas qu'il ne supporte pas newline. c'est vraiment énervant. que voulez-vous dire avec strip the newline? – RoflcoptrException
Utilisez String.replace() pour remplacer toutes les instances de "\ n" par "" (une chaîne vide). –
ah oui ce n'est pas le problème, le code ci-dessus est la situation unique où j'en ai besoin;) et comme vous pouvez le voir ajouté le "\ n" par moi-même – RoflcoptrException