2010-06-30 16 views
6

J'ai essayé d'écrire du texte sur une vue de surface que j'ai créée. Cela fonctionne bien, si le titre est faux, et il n'y a pas de saut de ligne ajouté au texte. Mais si j'ajoute un titre et donc un saut de ligne, le retour à la ligne n'est pas imprimé comme prévu, mais à la place il y a ce symbole [] imprimé.Canvas.drawText (...) n'imprime pas le saut de ligne

Des indices pourquoi?

@Override 
public void drawObject() { 
String text = ""; 
if (title) { 
    text = getGameBoard().getGame().getForeignProfile().getName() + "\n"; 
} 
text = text + getScoreAsString(); 
getGameBoard().getCanvas().drawText(text, 0, text.length(), getPosition().getX(), getPosition().getY(), getPaint()); 
} 

Répondre

1

Le symbole [] est probablement votre caractère de retour à la ligne. Pour une raison quelconque, drawText() ne sait pas comment gérer les retours à la ligne. Débarrassez-vous de la nouvelle ligne, ou appelez drawText() deux fois avec une position Y décalée pour simuler une nouvelle ligne.

+0

merci. Je ne savais pas qu'il ne supporte pas newline. c'est vraiment énervant. que voulez-vous dire avec strip the newline? – RoflcoptrException

+0

Utilisez String.replace() pour remplacer toutes les instances de "\ n" par "" (une chaîne vide). –

+0

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

24

Vous pouvez essayer quelque chose comme ce qui suit pour dessiner le texte avec des sauts de ligne:

Rect bounds = new Rect(); 
void drawString(Canvas canvas, Paint paint, String str, int x, int y) { 
    String[] lines = str.split("\n"); 

    int yoff = 0; 
    for (int i = 0; i < lines.length; ++i) { 
     canvas.drawText(lines[i], x, y + yoff, paint); 
     paint.getTextBounds(lines[i], 0, lines[i].length(), bounds); 
     yoff += bounds.height(); 
    } 
} 
8

dee de réponse est brillante. Le code ci-dessous est basé sur la réponse de dee, mais avec quelques modifications des préférences personnelles:

  1. Appelez-drawMultilineText (comme il est une sorte d'équivalent à drawText
  2. Mettez les paramètres dans le même ordre que drawText (texte, x , y, peinture et toile sur la fin)
  3. obtenir la hauteur de ligne une fois au début que la hauteur de retour des limites dépend de la hauteur des lettres, c.-à-e est pas aussi grand que E
  4. Ajouter 20 % écart de hauteur entre les lignes

    void drawMultilineText(String str, int x, int y, Paint paint, Canvas canvas) { 
        int  lineHeight = 0; 
        int  yoffset = 0; 
        String[] lines  = str.split("\n"); 
    
        // set height of each line (height of text + 20%) 
        paint.getTextBounds("Ig", 0, 2, mBounds); 
        lineHeight = (int) ((float) mBounds.height() * 1.2); 
        // draw each line 
        for (int i = 0; i < lines.length; ++i) { 
         canvas.drawText(lines[i], x, y + yoffset, paint); 
         yoffset = yoffset + lineHeight; 
        } 
    } 
    
+0

Magique !! Thx @dee a sauvé ma journée – Billyjoker

4

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

+0

et drawSpace serait ...? – desgraci

+0

drawSpace est une variable Rect que vous envoyez à la méthode afin que la méthode sache à quel point une zone est disponible pour être remplie de texte. –

+0

@MusicMonkey n'est pas la hauteur de chaque ligne exactement la même que la taille de la police? –

Questions connexes