自定义控件(28)---drawText、FontMetrics学习

来源:互联网 发布:淘宝买家一星需要几单 编辑:程序博客网 时间:2024/05/22 13:04

这几天发现单单绘制一个文字,是需要好多需要注意的地方,特地弄一个博客,摘摘代码,来学习下,博客内容转自
自定义控件之绘图篇( 五):drawText()详解

1、canvas.drawText()

    protected void onDraw(Canvas canvas) {          super.onDraw(canvas);          int baseLineX = 0 ;          int baseLineY = 200;             //画基线          Paint paint = new Paint();          paint.setColor(Color.RED);          canvas.drawLine(baseLineX, baseLineY, 3000, baseLineY, paint);         //写文字          paint.setColor(Color.GREEN);          paint.setTextSize(120); //以px为单位          canvas.drawText("harvic\'s blog", baseLineX, baseLineY, paint);      }  

效果图如下
这里写图片描述

2、paint.setTextAlign(Paint.Align.XXX);

我们知道,我们在drawText(text, x, y, paint)中传进去的源点坐标(x,y);其中,y表示的基线的位置。那x代表什么呢?从上面的例子运行结果来看,应当是文字开始绘制的地方。
并不是!x代表所要绘制文字所在矩形的相对位置。

paint.setTextAlign(Paint.Align.CENTER);
这里写图片描述

paint.setTextAlign(Paint.Align.RIGHT);
这里写图片描述

3、FontMetrics
这里写图片描述

除了基线以外,如上图所示,另外还有四条线,分别是ascent,descent,top,bottom,他们的意义分别是:

ascent: 系统建议的,绘制单个字符时,字符应当的最高高度所在线descent:系统建议的,绘制单个字符时,字符应当的最低高度所在线top: 可绘制的最高高度所在线bottom: 可绘制的最低高度所在线

FontMetrics来计算ascent,descent,top,bottom这些线的位置

ascent = ascent线的y坐标 - baseline线的y坐标;descent = descent线的y坐标 - baseline线的y坐标;top = top线的y坐标 - baseline线的y坐标;bottom = bottom线的y坐标 - baseline线的y坐标;

FontMetrics的这几个变量的值都是以baseline为基准的,对于ascent来说,baseline线在ascent线之下,所以必然baseline的y值要大于ascent线的y值,所以ascent变量的值是负的。
descent线在baseline线之下,所以必然descent线的y坐标要大于baseline线的y坐标,所以descent变量的值必然是正数。

ascent线Y坐标 = baseline线的y坐标 + fontMetric.ascent;
descent线Y坐标 = baseline线的y坐标 + fontMetric.descent;
top线Y坐标 = baseline线的y坐标 + fontMetric.top;
bottom线Y坐标 = baseline线的y坐标 + fontMetric.bottom;

ascent线Y坐标 - baseline线的y坐标 = fontMetric.ascent;
descent线Y坐标 - baseline线的y坐标 = fontMetric.descent;
top线Y坐标 - baseline线的y坐标 = fontMetric.top;
bottom线Y坐标 - baseline线的y坐标 = fontMetric.bottom;


4、字体的宽高、最小矩形
这里写图片描述

(1)、高度

Paint.FontMetricsInt fm = paint.getFontMetricsInt();  int top = baseLineY + fm.top;  int bottom = baseLineY + fm.bottom;  //所占高度  int height = bottom - top; 

(2)、宽度

Paint paint = new Paint();  //设置paint  paint.setTextSize(120); //以px为单位  //获取宽度  int width = (int)paint.measureText("harvic\'s blog");  

(3)、最小矩形

/**  * 获取指定字符串所对应的最小矩形,以(0,0)点所在位置为基线  * @param text  要测量最小矩形的字符串  * @param start 要测量起始字符在字符串中的索引  * @param end   所要测量的字符的长度  * @param bounds 接收测量结果  */ String text = "harvic\'s blog";  Paint paint = new Paint();  //设置paint  paint.setTextSize(120); //以px为单位  Rect minRect = new Rect();  paint.getTextBounds(text,0,text.length(),minRect);  Log.e("qijian",minRect.toShortString());  
protected void onDraw(Canvas canvas) {      super.onDraw(canvas);  String text = "harvic\'s blog";  int baseLineY = 200;  int baseLineX = 0 ;  //设置paint  Paint paint = new Paint();  paint.setTextSize(120); //以px为单位  paint.setTextAlign(Paint.Align.LEFT);  //画text所占的区域  Paint.FontMetricsInt fm = paint.getFontMetricsInt();  int top = baseLineY + fm.top;  int bottom = baseLineY + fm.bottom;  int width = (int)paint.measureText(text);  Rect rect = new Rect(baseLineX,top,baseLineX+width,bottom);  paint.setColor(Color.GREEN);  canvas.drawRect(rect,paint);  //画最小矩形  Rect minRect = new Rect();  paint.getTextBounds(text,0,text.length(),minRect);  minRect.top = baseLineY + minRect.top;  minRect.bottom = baseLineY + minRect.bottom;  paint.setColor(Color.RED);  canvas.drawRect(minRect,paint);  //写文字  paint.setColor(Color.BLACK);  canvas.drawText(text, baseLineX, baseLineY, paint);  }  

代码中。

Rect minRect = new Rect();  paint.getTextBounds(text,0,text.length(),minRect);  minRect.top = baseLineY + minRect.top;  minRect.bottom = baseLineY + minRect.bottom;  paint.setColor(Color.RED);  canvas.drawRect(minRect,paint); 

首先根据paint.getTextBounds()得到基线为y=0的最小矩形的各点坐标,然后根据基线得到其实际的top和bottom坐标;然后将其画出来即可

0 0
原创粉丝点击