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