web-dev-qa-db-fra.com

Android canvas drawText position y du texte

J'utilise un canevas pour créer un dessinable avec de l'arrière-plan et du texte. Le drawable est utilisé comme un drawable composé à l'intérieur d'un EditText.

Le texte est dessiné via drawText () sur la toile, mais j'ai un problème avec la position y du texte dessiné dans certains cas. Dans ces cas, des parties de certains caractères sont coupées (voir les liens d'image).

Caractères sans problème de positionnement:

http://i50.tinypic.com/zkpu1l.jpg

Caractères ayant un problème de positionnement, le texte contient 'g', 'j', 'q', etc.:

http://i45.tinypic.com/vrqxja.jpg

Vous pouvez trouver un extrait de code pour reproduire le problème ci-dessous.

Un expert sait-il comment déterminer le décalage approprié pour la position y?

public void writeTestBitmap(String text, String fileName) {
   // font size
   float fontSize = new EditText(this.getContext()).getTextSize();
   fontSize+=fontSize*0.2f;
   // Paint to write text with
   Paint paint = new Paint(); 
   Paint.setStyle(Style.FILL);  
   Paint.setColor(Color.DKGRAY);
   Paint.setAntiAlias(true);
   Paint.setTypeface(Typeface.SERIF);
   Paint.setTextSize((int)fontSize);
   // min. rect of text
   Rect textBounds = new Rect();
   Paint.getTextBounds(text, 0, text.length(), textBounds);
   // create bitmap for text
   Bitmap bm = Bitmap.createBitmap(textBounds.width(), textBounds.height(), Bitmap.Config.ARGB_8888);
   // canvas
   Canvas canvas = new Canvas(bm);
   canvas.drawARGB(255, 0, 255, 0);// for visualization
   // y = ?
   canvas.drawText(text, 0, textBounds.height(), Paint);

   try {
      FileOutputStream out = new FileOutputStream(fileName);
      bm.compress(Bitmap.CompressFormat.JPEG, 100, out);
   } catch (Exception e) {
      e.printStackTrace();
   }
}
28
darksaga

Je pense que c'est probablement une erreur de supposer que textBounds.bottom = 0. Pour ces caractères descendants, les parties inférieures de ces caractères sont probablement inférieures à 0 (ce qui signifie textBounds.bottom> 0). Vous voulez probablement quelque chose comme:

canvas.drawText(text, 0, textBounds.top, Paint); //instead of textBounds.height()

Si vos limites de texte sont comprises entre +5 et -5 et que vous dessinez du texte à y = hauteur (10), vous ne verrez que la moitié supérieure du texte.

26
Tim

Je crois que si vous voulez dessiner du texte près du coin supérieur gauche, vous devez le faire:

canvas.drawText(text, -textBounds.left, -textBounds.top, Paint);

Et vous pouvez vous déplacer dans le texte en additionnant la quantité de déplacement souhaitée aux deux coordonnées:

canvas.drawText(text, -textBounds.left + yourX, -textBounds.top + yourY, Paint);

La raison pour laquelle cela fonctionne (au moins pour moi) est que getTextBounds () vous indique où drawText () dessinerait le texte dans le cas où x = 0 et y = 0. Vous devez donc contrer ce comportement en soustrayant le déplacement (textBounds.left et textBounds.top) introduit par la façon dont le texte est géré dans Android.

Dans cette réponse j'élabore un peu plus sur ce sujet.

13
damix911