1.文字基线
文字“基线”就如同写英语字母用的“四线本” 。
在canvas利用drawText绘制文字时,也是有规则的,这个规则就是基线baseLine :给文字定了一条基准线,通过Paint.FontMetricsInt获取的top和bottom值就与基线有关。FontMetrics 基线上面的值为负数,基线下面的值为正数。
可见基线就是四线格中的第三条线!
也就是说,只要基线的位置定了,那文字的位置必然是定了的!
可以通过测试把top、bottom值打印出来,发现 top 为 - 317,bottom 为 82 ,因此可以计算出基线(偏移)为117。
这里的top和bottom的值,实际是基于基线而得。可理解为:以文字基线为准,向上平移317像素为绘制区域的顶,向下平移82像素为绘制区域的底(基线向上为负 向下为正)。
已知基线与绘制区顶相距317,与底相距82,可以得出绘制区高度为bottom - top:82 - (-317) = 399。
绘制区中线高度为(bottom - top)/ 2 : 399 / 2 = 199 (int)。
绘制区中线高度等价于中线与绘制区底之间的距离,这个距离减去 基线与绘制区底 之间的距离,就是中线与基线之间的距离 (bottom - top) / 2 - bottom : 199 - 82 = 117。
2.canvas.drawText
那这个值和我们在android中绘制文字有什么关系呢?
其实在drawText方法中,中传入的第三个参数Y的实际意义是文字的基线所在的位置!
public void drawText(String text, float x, float y, Paint paint)
上面这个构造函数是最常用的drawText方法,传进去一个String对象就能画出对应的文字。这里x、y两个参数需要非常注意,(x,y)是并不是绘制文字所在矩形的左上角的点。比如,要画"harvic's blog"这几个字,这个(x,y)坐标应当是下图中绿色小点的位置。
再强调一遍:y所代表的是基线的位置!
3.paint.setTextAlign(Paint.Align.XXX);
先看一张图:
我们知道,在drawText(text, x, y, paint)中传进去的源点坐标(x,y);其中,y表示的基线的位置。那x代表什么呢?从上面的例子运行结果来看,应当是文字开始绘制的地方。