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();
}
}
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.
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.