Canvas drawText字体居中
Canvas drawText字体居中
在自定义view 中 drawtext 应用的很广泛,下面介绍以下里面的参数
常用的方法一般是:
drawText( String text, float x, float y, Paint paint)
注:1、text 就是要绘制的文本
2、x ,y 绘制文本时所在的 x 和y 的坐标
3、paint 画笔
下面着重说明一下 x 和y 的取值:
通常情况下,绘制文本是在一个矩形中绘制(rect),想要字体居中 直接取值 y=rext.getY(),其实文字不是居中的, 下面一张图可以很明确的显示出来(图片是别人博客截图过来的)
其中 矩形的中点就是 rect.getY(),而文字的绘制是从基线开始绘制的, 所以想要绘制文字在Y方向上居中,需要找到基线的坐标, 但问题是基线是什么? 下面还是先上一张图片(都是在网上截取的别人的)
要点如下:
1. 基准点是baseline
2. Ascent是baseline之上至字符最高处的距离
3. Descent是baseline之下至字符最低处的距离
4. Leading文档说的很含糊,其实是上一行字符的descent到下一行的ascent之间的距离
5. Top指的是指的是最高字符到baseline的值,即ascent的最大值
6. 同上,bottom指的是最下字符到baseline的值,即descent的最大值
其中基本的都是 以 baseline 为标准来划分的。
顺便说一下的取值的正负问题:ascent是负,descent是正,同样 top 是负,bottom是正
重点来了,获得正确的Y值:同样先来一张图片(自己画的)
主要是获得baseline 的位置,首先文字的自身所占的高度 与 rect 的高度中心重合,
得到中线和baseline的距离:
(Math.abs(ascent)+Math.abs(descent))/2-Math.abs(descent),
考虑正负值之后优化计算方式:
(fm.descent - fm.ascent) / 2- fm.descent或者 Math.abs(fm.ascent()) - (fm.descent() - fm.ascent()) / 2F。
其中fm=textPaint.getFontMetrics();只有设置textPaint的setTextSize之后才有意义。
之后或的Y值就简单了:
targetRect.centerY() + (fm.descent - fm.ascent) / 2- fm.descent ;
或者targetRect.centerY() + Math.abs(fm.ascent()) - (fm.descent() -fm.ascent()) / 2F;
还有一个值得一提就是: textPaint.setTextAlign();
有三个属性:
1.Paint.Align.CENTER
2.Paint.Align.LEFT
3.Paint.Align.RIGHT
其实意思就是 x值对应的 文本的位置,开始绘制文本
当我们将文本对齐方式设置为 CENTER 后就相当于告诉Android我们这个文本绘制的时候从文本的中点开始向两端绘制,如果设置为 LEFT 则从文本的左端开始往右绘制,如果为 RIGHT 则从文本的右端开始往左绘制
以上是canvas.drawText的所要讲解的全部内容