Android:Canvas中drawText的尺寸計算


主要思路:根據FontMetrica計算Text的高度,根據Rect計算Text的寬度。兩者與字體,字號有關系

參考文章:

http://blog.csdn.net/hursing/article/details/18703599   

http://blog.csdn.net/sirnuo/article/details/21165665

1. 計算高度不應該用Rect的原因:FontMetrica與Text內容無關;Rect與Text的內容相關,用Rect計算的話會麻煩一點。paint.getTextBounds()    paint.getFontMetricsInt()

2. 要正確理解FontMetrica的top,ascent,descent,bottom的含義。以上四個參數都是相對於baseLine而言的

3. 如上圖:Text在Y軸的范圍在:[baseLine+top,baseLine+bottom]

4. drawText(text, baseX, baseY, paint) 中對baseX,baseY的理解:baseY即為baseLine,baseX則取決於paint.setTextAlign(Align.LEFT)參數的設置。

5. 使用場景:Text水平,垂直都居中

package cc.makeblock.widget;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Paint.FontMetricsInt;
import android.graphics.Rect;
import android.graphics.Paint.Align;
import android.view.View;

public class TestTextBounds extends View {
	private static final String TAG = "TestTextBounds";
	public TestTextBounds(Context context) {
		super(context);
		setBackgroundColor(Color.GRAY);
	}

	@Override
	public void onDraw(Canvas canvas){
		super.onDraw(canvas);
		Paint mbPaint = new Paint(Paint.ANTI_ALIAS_FLAG);//防止鋸齒
		//mbPaint.setTypeface(diodeFont);
		mbPaint.setTextSize(120); //todo:text自適應view的寬高
		mbPaint.setTextAlign(Align.LEFT);  //從右邊開始draw
		String textString = "abcdefghijk";
		int textWidth = 0;
		int textHeight = 0;
		
		// 1.用FontMetrics對象計算高度
		FontMetricsInt fontMetrics = mbPaint.getFontMetricsInt(); 
		textHeight = fontMetrics.bottom-fontMetrics.top;//詳細:(baseY+bottom)-(baseY-top);

		//2.用bounds計算寬度
		Rect bounds = new Rect();  
		mbPaint.getTextBounds(textString, 0, textString.length(), bounds); 
		textWidth = bounds.right-bounds.left;

		//3.計算baseX,baseY
		int baseX = (this.getWidth()-textWidth)/2; //LEFT情況下的baseX
		//先計算top:top=baseY+fontMetrics.top
		int top = (this.getHeight()-textHeight)/2;
		int baseY = top-fontMetrics.top;

		//4.繪制白色背景
		mbPaint.setColor(Color.WHITE);
		//(int left, int top, int right, int bottom)
		Rect rect = new Rect(baseX, top, baseX+textWidth, top+textHeight);
		canvas.drawRect(rect, mbPaint);

		//5.繪制黑色text
		mbPaint.setColor(Color.BLACK);
		//奇葩的參數設置:
		//取決於mbPaint.setTextAlign(Align)的參數,默認是LEFT。
		//RIGHT:從右向左繪制
		canvas.drawText(textString, baseX, baseY, mbPaint);
		
		//6.划線
		int startX = baseX;
		int stopX = baseX+textWidth;
		
		mbPaint.setStrokeWidth(3);
		mbPaint.setColor(Color.RED);
		canvas.drawLine(startX, baseY+fontMetrics.top, stopX, baseY+fontMetrics.top, mbPaint);
		
		mbPaint.setColor(Color.BLUE);
		canvas.drawLine(startX, baseY+fontMetrics.ascent, stopX, baseY+fontMetrics.ascent, mbPaint);
		
		mbPaint.setColor(Color.YELLOW);
		canvas.drawLine(startX, baseY+fontMetrics.descent, stopX, baseY+fontMetrics.descent, mbPaint);
		
		mbPaint.setColor(Color.GREEN);
		canvas.drawLine(startX, baseY+fontMetrics.bottom, stopX, baseY+fontMetrics.bottom, mbPaint);
		
		mbPaint.setColor(Color.CYAN);
		canvas.drawLine(startX, baseY, stopX, baseY, mbPaint);
	}
}
private void setupCustomView6(){
		TestTextBounds diodeView = new TestTextBounds(context);
		RelativeLayout.LayoutParams relLayoutParams = new RelativeLayout.LayoutParams(700, 300);
		relLayoutParams.setMargins(500, 400, 0, 0);
		root_RelativeLayout.addView(diodeView,relLayoutParams);
}

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM