1.文字绘制
<1>先确定文字起点x,y坐标
private int baseLineX=100;
private int baseLineY=300;
<2>绘制文字
(1)先绘制基线
canvas.drawLine(baseLineX,baseLineY,300,baseLineY,paint);
(2)绘制文字
注:setTextAlign设置文字区域与baseLineX的位置关系
paint.setTextAlign(Paint.Align.LEFT);
canvas.drawText("Asmargg",baseLineX,baseLineY,paint);
<3>根据基线位置计算出ascent、dscent、top、bottom四条线位置
float baseY=baseLineY;
Paint.FontMetrics fontMetrics=paint.getFontMetrics();
float ascentY=baseY+fontMetrics.ascent;
float dscentY=baseY+fontMetrics.descent;
float topY=baseY+fontMetrics.top;
float bottomY=baseY+fontMetrics.bottom;
<4>绘制top线
canvas.drawLine(baseLineX,topY,300,topY,paint);
<5>绘制bottom线
canvas.drawLine(baseLineX,bottomY,300,bottomY,paint);
<6>绘制ascent线
canvas.drawLine(baseLineX,ascentY,300,ascentY,paint);
<7>绘制dscent线
canvas.drawLine(baseLineX,dscentY,300,dscentY,paint);
<8>计算出绘制文字区域的宽高
(1)计算出绘制文字区域的宽度
float width=paint.measureText("Asmargg");
(2)计算出绘制文字的区域的高度
float height=bottomY-topY;
<9>根据矩形获取到文字区域的实际top、bottom坐标
int baseLineY=500;
String text="FestMMMggg";
paint.setTextSize(35);
canvas.drawText(text,100,baseLineY,paint);
Rect minrect=new Rect();
paint.getTextBounds(text,0,text.length(),minrect);
Log.d("177777","文字矩形左上和右下两点坐标="+minrect.toShortString());
//注:因为getTextBounds默认设置文字基线在y=0的位置,所以如果想要得到文字矩形的实际位置,需要将minrect向下平移baseLineY的距离
//所以实际的文字矩形的top和bottom位置为
//更改画笔颜色和字体大小
paint.setColor(Color.RED);
float topLine=minrect.top+baseLineY;
float bottomLine=minrect.bottom+baseLineY;
<10>实例
(1)已知文字左上角点为(100,100),知道文字内容和大小,绘制文字
int lstartX=100;
int lstartY=100;
int baseLineY=0;
String text="FsgK";
paint.setTextSize(35);
Paint.FontMetrics fontMetrics=paint.getFontMetrics();
//获取到基线位置
baseLineY= (int) (lstartY-fontMetrics.top);
//绘制
canvas.drawText(text,lstartX,baseLineY,paint);
(2)已知center位置为Y=100,起点x坐标为100,文字内容和文字大小,绘制文字 (注:center为top和bottom中间线),
float center=100;
float lstartX=100;
float baseLineY=0;
String text="FsgK";
paint.setTextSize(35);
Paint.FontMetrics metrics=paint.getFontMetrics();
baseLineY=center+(metrics.bottom-metrics.top)/2-metrics.bottom;
canvas.drawText(text,lstartX,baseLineY,paint);