Android獲取文本的寬度和高度

(1)獲取文本的寬度

方法一: 測量文本所在的矩形區域,再計算矩形區域的寬

    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)獲取文本高度

首先來畫一張圖:

對應的代碼是:

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,它的計算結果和方法二求出的推薦高度一致。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章