Android-drawText()详解
文章目录
- 全局声明
- canvas.drawText(string, baseLineX, baseLineY, paint)
- baseLineY=基线的Y;
- baseLineX=基线的X;
- 本篇以textSize=100为例
API:canvas.drawText(String text,int start,int end,float x,float y, paint); //截取字符串 然后绘制
基础了解
- 除了基线以外,如上图所示,另外还有四条线(通过FontMetrics可以获取到),分别是ascent,descent,top,bottom,他们的意义分别是:
- top: 可绘制的最高高度所在线
- ascent: 系统建议的,绘制单个字符时,字符应当的最高高度所在线
- descent:系统建议的,绘制单个字符时,字符应当的最低高度所在线
- bottom: 可绘制的最低高度所在线
[ascent,descent]与[top,bottom]的区别就是安全区与最大区域,但由于制式的不同,每个字体的显示区域并不一定一致,当遇到不一致时,就会裁剪。
获取FontMetrics
1 | paint.getFontMetricsInt(); |
FontMetricsInt: top=-106 ascent=-93 descent=24 bottom=28 leading=0
归纳重点
- TextSize的含义
- 经测试 平时paint.setTextSize的值=descent+bounds.top;
- 一个字的高度
- 一个字的高度 并不是textSize 而是top与bottom差值(代表绘制一个TextSize大小的字所需要的空间);
例如EditText里的字和光标发现高度不一致,光标比字高那么一点
- 一个字的高度 并不是textSize 而是top与bottom差值(代表绘制一个TextSize大小的字所需要的空间);
测量宽度:
通过paint(包括了 textSize),所以给定内容即可测量其宽度
1 | int width = (int) paint.measureText(content); |
测量所绘制的矩形范围:
通过paint(包括了 textSize),所以给定内容即可测量其宽度
1 | Rect bounds = new Rect(); |
bounds:Rect(4, -75 - 347, 21)
注意:这里仅仅是显示一个矩形范围,默认这里是baseLineX=0,baseLineY=0,LEFT模式;
setTextAlign
- Left(默认模式):baseLineX在 绘制矩形bounds的左边
- Center:baseLineX在 绘制矩形bounds的中间
- Right:baseLineX在 绘制矩形bounds的右边
如何把这个bounds移动到对应的字符显示位置呢?
1 | canvas.drawText(string, baseLineX, baseLineY, paint); |
这里的代码其实就是系统做的逻辑;
从默认的baseLineX=0,baseLineY=0,LEFT模式。转变到现在的值
drawText的工具封装
在内部类Text里
范例:
1 | DrawUtils.Text.with(canvas, content, 0, y, paint) |
Demo演示图-点击可进入代码
对应 align 与show方法的 范例
实例demo:zone-sdk项目运行后:->动画、surfaceView、绘图方面的研究->drawtext工具测试 进入即可看到;