我们曾经找到适合给定文本的矩形,例如,如果在gettextbounds api中给出“TESTING”,它将给出一个适合给定字符串“TESTING”的矩形,但是任何plz都可以澄清该矩形长度是基于哪个计算得出的,是否可以考虑字体大小,是否可以这样检查?

1)我尝试的方式
CharSequence text = getText();
canvas.drawText(text,0,text.length(),mTextX,mTextY,getPaint());

    Paint pt = new Paint ( );
    pt.setTextSize(10);

    TextPaint tp = getPaint();
    String string = "haa";
    Rect currentBounds = new Rect ( );
    //this.setTextSize(/* TypedValue.COMPLEX_UNIT_PX */ 10, /* fontPixelSize*Home.fltFontRatio */ 32);

    tp.getTextBounds((String) text, 0, text.length(), currentBounds );

    Log.e ( " ", "Desired Text " +text);
    Log.e ( " ", "first Ondraw Left " +currentBounds.left);
    Log.e ( " ", "Ondraw Top" +currentBounds.top);
    Log.e ( " ", "Ondraw right " +currentBounds.right);
    Log.e ( " ", "Ondraw bottom " +currentBounds.bottom);

    pt.setTextSize(20);


    tp.getTextBounds((String) text, 0, text.length(), currentBounds );

    Log.e ( "", "Desired Text " +text);
    Log.e ( " ", "Second Ondraw Left " +currentBounds.left);
    Log.e ( " ", "Ondraw Top" +currentBounds.top);
    Log.e ( " ", "Ondraw right " +currentBounds.right);
    Log.e ( "Nrace ", "Ondraw bottom " +currentBounds.bottom);

2)我尝试过的第二种方式
    TextPaint tp = getPaint();
    String string = "haa";
    Rect currentBounds = new Rect ( );
    this.setTextSize(/* TypedValue.COMPLEX_UNIT_PX */ 10, /* fontPixelSize*Home.fltFontRatio */ 32);

    tp.getTextBounds(string, 0, string.length(), currentBounds );

    Log.e ( " ", "first Left " +currentBounds.left);
    Log.e ( " ", "Top" +currentBounds.top);
    Log.e ( " ", "right " +currentBounds.right);
    Log.e ( " ", "bottom " +currentBounds.bottom);

    this.setTextSize(/* TypedValue.COMPLEX_UNIT_PX */ 10, /* fontPixelSize*Home.fltFontRatio */ 10);

    tp.getTextBounds(string, 0, string.length(), currentBounds );

    Log.e ( " ", "Sefond Left " +currentBounds.left);
    Log.e ( " ", "Top" +currentBounds.top);
    Log.e ( " ", "right " +currentBounds.right);
    Log.e ( "", "bottom " +currentBounds.bottom);

在上述两种方法中,我试图找出给定文本大小的各种矩形大小。如果这不是一个好方法,请通过发布一些示例代码来建议我。简而言之,我必须找到适合各种字体大小的文本“TESTING”的各种矩形。

提前致谢。

最佳答案

我发现API的这一部分非常令人困惑,但是我认为我几乎理解了它是如何工作的。调用getTextBounds()将返回最小的矩形,该矩形将包围随后调用x = 0和y = 0的drawText()绘制的所有字符。这在API reference上用略有不同的词表示。 Paint中可能影响文本外观的所有内容都被考虑在内。这是一个例子:

Rect bounds = new Rect();

Paint paint = new Paint();
paint.setTextAlign(Align.LEFT);
paint.setTypeface(typeface);
paint.setTextSize(textSize);
paint.getTextBounds(text, 0, text.length(), bounds);

矩形具有此类奇异坐标的原因是,当您使用drawText()绘制文本时,x和y相对的原点取决于您选择的Paint的打印属性。例如,y相对于基线,基线既不在字体的上方也不在字体的下方,而是通常在中间的某个位置触碰到它。因此,边界矩形通常具有负的顶部和正的底部。负的顶部表示文本的顶部在基线之上(y减小,上升),而正的底部意味着文本的底部在基线之下(y增大,下降)。有趣的是,当您测量“Hi”之类的字符串时,底部可能为0,因为这些字符的基线部分以下没有。相反,当您测量“Hg”之类的字符串时,您可能会得到正底,因为g的值在基线以下。不过,我不确定如何估算水平位置。

如此说来,要绘制您已经计算出边界的文本,您可以执行以下操作:
canvas.drawText(text, -bounds.left, -bounds.top, paint);

这将在 Canvas 的左上角附近绘制文本。左上角的坐标为(0,0),因此在文本周围移动时只需添加所需的位移量即可:
canvas.drawText(text, -bounds.left + yourX, -bounds.top + yourY, paint);

另一个示例:如果您要创建一个包含文本的位图,并且想要完全适合可用空间,则可以执行以下操作:
Bitmap bitmap = Bitmap.createBitmap(bounds.width(), bounds.height(), Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(bitmap);
canvas.drawText(text, -bounds.left, -bounds.top, paint);

如果您想在左侧,右侧,顶部和底部分别留几个像素,可以说2,则可以执行以下操作:
Bitmap bitmap = Bitmap.createBitmap(bounds.width() + 4, bounds.height() + 4, Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(bitmap);
canvas.drawText(text, -bounds.left + 2, -bounds.top + 2, paint);

关于android - Android中的GetTextBounds,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5714600/

10-11 22:37