Android获取文本的宽度和高度

(1)获取文本的宽度
图片.png

方法一: 测量文本所在的矩形区域,再计算矩形区域的宽

    Rect rect = new Rect();
    mPaint.getTextBounds(text,0,text.length(), rect);
    canvas.drawRect(rect, mPaint);
    float textWidth1 = rect.width();
    Log.d("aaa", "textWidth1:"+textWidth1);

求出矩形的宽度:982.0,上图中的矩形边框就是文本的矩形区域,其特点是紧贴着文字,没有多余的空间。

方法二: 通过Paint的measureText方法直接测量文本宽度

    float textWidth2 = mPaint.measureText(text);
    Log.d("aaa", "textWidth2:"+textWidth2);
    canvas.drawLine(0, rect.bottom + 20, textWidth2, rect.bottom + 20, mPaint);

求出矩形的宽度:1012.0,比前者稍微大一点,因为前者的矩形区域紧贴文字,没有多余的空间。而通过measureText计算出的宽度会加上开始和结尾的空间,这个空间就是文字和文字之间的空间,为了美观而存在。如上图矩形下面的一条直线就是文字的宽度。

方法三: 计算出每个文字的宽度,最后计算总和

    float[] textWidths = new float[text.length()];
    mPaint.getTextWidths(text, textWidths);
    float textWidth1 = 0;
    for(int i=0;i<textWidths.length;i++){
        textWidth1 = textWidth1 + textWidths[i];
    }
    Log.d("aaa", "textWidth1:"+textWidth1);

求出矩形的宽度:1012.0,和方式二结果一致。

方法四: 通过Layout.getDesiredWidth来获取

    TextPaint textPaint = new TextPaint();
    textPaint.setTextSize(280);
    textPaint.setColor(Color.BLUE);
    textPaint.setStrokeWidth(8);
    textPaint.setAntiAlias(true);
    textPaint.setStyle(Paint.Style.FILL);
    float textWidth1 = Layout.getDesiredWidth(text,textPaint);
    Log.d("aaa", "textWidth1:"+textWidth1);

求出矩形的宽度:1012.0,和方式二、方式三结果一致。

(2)获取文本高度

首先来画一张图:

图片.png

对应的代码是:

private void init(){
    mPaint = new Paint();
    mPaint.setColor(Color.BLUE);
    mPaint.setAntiAlias(true);
    mPaint.setStrokeWidth(8);
    mPaint.setTextSize(280);
    //mPaint.setTextAlign(Paint.Align.CENTER);
    mPaint.setStyle(Paint.Style.FILL);
}

@Override
protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);

    canvas.translate(200, 400);

    mPaint.setColor(Color.parseColor("#65A21F"));

    canvas.drawLine(-200, 0, canvas.getWidth() - 200, 0, mPaint);
    canvas.drawLine(0, -400, 0, canvas.getHeight() - 400, mPaint);

    mPaint.setColor(Color.BLACK);
    mPaint.setStrokeWidth(2);
    mPaint.setStyle(Paint.Style.STROKE);

    Rect rect = new Rect();
    mPaint.getTextBounds(text,0,text.length(), rect);
    canvas.drawRect(rect, mPaint);
    float textHeight1 = rect.height();
    Log.d("aaa", "textHeight1:"+textHeight1);

    float textWidth = mPaint.measureText(text);//获取文本的宽度

    Paint.FontMetrics fontMetrics = mPaint.getFontMetrics();

    mPaint.setStyle(Paint.Style.FILL);
    mPaint.setStrokeWidth(2);


    mPaint.setColor(Color.RED);
    canvas.drawLine(0, fontMetrics.ascent, mPaint.measureText(text), fontMetrics.ascent, mPaint);
    mPaint.setTextSize(50);
    canvas.drawText("ascent", textWidth, fontMetrics.ascent, mPaint);

    mPaint.setColor(Color.parseColor("#6EAD24"));
    canvas.drawLine(0, fontMetrics.bottom, textWidth, fontMetrics.bottom, mPaint);
    mPaint.setTextSize(50);
    canvas.drawText("bottom", textWidth, fontMetrics.bottom + 30, mPaint);

    mPaint.setColor(Color.parseColor("#13AA9C"));
    canvas.drawLine(0, fontMetrics.descent, textWidth, fontMetrics.descent, mPaint);
    mPaint.setTextSize(50);
    canvas.drawText("descent", textWidth, fontMetrics.descent, mPaint);

    mPaint.setColor(Color.parseColor("#9C17B3"));
    canvas.drawLine(0, 0, textWidth, 0, mPaint);
    mPaint.setTextSize(50);
    canvas.drawText("baseline", textWidth, fontMetrics.leading, mPaint);

    mPaint.setColor(Color.parseColor("#DF3A72"));
    canvas.drawLine(0, fontMetrics.top, textWidth, fontMetrics.top, mPaint);
    mPaint.setTextSize(50);
    canvas.drawText("top", textWidth, fontMetrics.top, mPaint);

    mPaint.setTextSize(280);
    mPaint.setColor(Color.BLUE);
    mPaint.setStrokeWidth(8);
    mPaint.setStyle(Paint.Style.FILL);

    canvas.drawText(text, 0, 0, mPaint);

}

方法一: 测量文本所在的矩形区域,再计算矩形区域的高

    Rect rect = new Rect();
    mPaint.getTextBounds(text,0,text.length(), rect);
    canvas.drawRect(rect, mPaint);
    float textHeight1 = rect.height();
    Log.d("aaa", "textHeight1:"+textHeight1);

求出矩形的高度: 277.0,上图中的矩形边框就是文本的矩形区域,其特点是紧贴着文字,没有多余的空间。

方法二: 通过getFontMetrics()getFontMetricsInt()返回测量数据

主要有5个测量数据:

Top: baseline到文本顶部的最大的距离
Ascent: baseline到文本顶部到推荐距离
Descent: baseline到文本底部到推荐距离
Bottom: baseline到文本底部到最大距离
Leading: 两行文本之间推荐到额外距离,一般为0。

    Paint.FontMetrics fontMetrics = mPaint.getFontMetrics();

    float height1 = fontMetrics.descent - fontMetrics.ascent;
    Log.d("aaa", "文本的推荐高度:"+height1);
    float height2 = fontMetrics.bottom - fontMetrics.top;
    Log.d("aaa", "文本的最大高度:"+height2);

文本的推荐高度: 328.125
文本的最大高度: 371.60156

方法三: 通过getFontSpacing实现

    float height3 = mPaint.getFontSpacing();
    Log.d("aaa", "文本的高度:"+height3); 

求出文本的高度为:328.125,它的计算结果和方法二求出的推荐高度一致。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容