AndroidcanvasdrawText文本的y位置

我正在使用Canvas来创build带有一些背景和一些文本的Drawable。 drawable用作EditText中的复合drawable。

文本是通过canvas上的drawText()绘制的,但在某些情况下,我确实遇到了绘制文本的y位置的问题。 在这些情况下,部分字符的部分被切断(见图片链接)。

没有定位问题的字符:

http://sofzh.miximages.com/android/zkpu1l.jpg

定位问题的文字,文字包含“g”,“j”,“q”等:

http://sofzh.miximages.com/android/vrqxja.jpg

你可以find一个代码片段来重现下面的问题。

是否有专家知道如何确定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(); } } 

Solutions Collecting From Web of "AndroidcanvasdrawText文本的y位置"

我想这可能是一个错误,假设textBounds.bottom = 0.对于那些降序字符,这些字符的底部可能低于0(这意味着textBounds.bottom> 0)。 你可能想要像这样的东西:

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

如果你的textBounds是从+5到-5,并且你在y = height(10)处绘制文本,那么你只能看到文本的上半部分。

我相信如果你想在左上angular附近画文字,你应该这样做:

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

您可以通过将所需的位移量合计到两个坐标来移动文本:

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

之所以这么做(至less对我来说)是因为getTextBounds()告诉你在x = 0和y = 0的情况下,drawText()会在哪里绘制文本。 所以你必须通过减去在Android中处理文本的方式引入的位移(textBounds.left和textBounds.top)来抵消这种行为。

在这个答案中,我详细阐述了这个话题。