忌妒别人,不会给自己增加任何的好处,忌妒别人,也不可能减少别人的成就。
本讲内容:FontMetrics 字体测量类(有五个成员变量)
注意:Paint有一个唯一的子类TextPaint文本的画笔 就是专门为文本绘制量身定做的“笔”
public static class FontMetrics {
public float top;
public float ascent;
public float descent;
public float bottom;
public float leading;
}
在Android中,文字的绘制都是从Baseline基线处开始的,Baseline往上至字符最高处的距离我们称之为ascent(上坡度),Baseline往下至字符最底处的距离我们称之为descent(下坡度),而leading(行间距)则表示上一行字符的descent到该行字符的ascent之间的距离。因为TextView在绘制文本的时候考虑到了类似读音符号,而top的意思其实就是除了Baseline到字符顶端的距离外还应该包含这些符号的高度,bottom的意思也是一样。这就是为什么top和bottom总会比ascent和descent大一点的原因。而在TextView中我们可以通过xml设置其属性android:includeFontPadding="false"去掉一定的边距值但是不能完全去掉。
注:Baseline上方的值为负,下方的值为正
下面是自定义CustomTitleView.java文件:
public class CustomView extends View {
private Paint mPaint;// 画笔
private FontMetrics mFontMetrics;// 文本测量对象
public CustomView(Context context) {
super(context, null);
}
public CustomView(Context context, AttributeSet attrs) {
super(context, attrs);
initPaint();
}
private void initPaint() {
mPaint=new Paint(Paint.ANTI_ALIAS_FLAG);
mFontMetrics=mPaint.getFontMetrics();
System.out.println("ascent:\t"+mFontMetrics.ascent);
System.out.println("top:\t"+mFontMetrics.top);
System.out.println("leading:\t"+mFontMetrics.leading);
System.out.println("descent:\t"+mFontMetrics.descent);
System.out.println("bottom:\t"+mFontMetrics.bottom);
}
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
}
}
打印:(随着文字的大小会变化的)
ascent: -11.1328125
top: -12.673828
leading: 0.0
descent: 2.9296875
bottom: 3.2519531
只有一行文本所以leading恒为0
一、Paint类有两个方法
ascent(): 获得baseline以上的height
descent():获得baseline以下的height
所以获取文字的height和width分别是:
获取height : Math.abs(mPaint.ascent() + mPaint.descent())
获取width : mPaint.measureText(text)
示例一:文本居中画布(文字的绘制都是从Baseline基线处开始的)
下面是自定义CustomTitleView.java文件:
public class CustomView extends View {
private static final String TEXT = "world 你好!";
private Paint textPaint, linePaint;// 文本的画笔和中心线的画笔
private int baseX, baseY;// Baseline绘制的XY坐标
public CustomView(Context context) {
super(context, null);
}
public CustomView(Context context, AttributeSet attrs) {
super(context, attrs);
initPaint();
}
private void initPaint() {
textPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
textPaint.setTextSize(70);
textPaint.setColor(Color.BLACK);
linePaint = new Paint(Paint.ANTI_ALIAS_FLAG);
linePaint.setStyle(Paint.Style.STROKE);
linePaint.setStrokeWidth(1);
linePaint.setColor(Color.RED);
}
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
// 计算Baseline绘制的起点X轴坐标
baseX = (int) (canvas.getWidth() / 2 - textPaint.measureText(TEXT) / 2);
// 计算Baseline绘制的Y坐标(有点难理解,记住)
baseY = (int) ((canvas.getHeight() / 2) - ((textPaint.descent() + textPaint.ascent()) / 2));
canvas.drawText(TEXT, baseX, baseY, textPaint);
// 为了便于理解我们在画布中心处绘制一条中线
canvas.drawLine(0, canvas.getHeight() / 2, canvas.getWidth(),canvas.getHeight() / 2, linePaint);
}
}
Take your time and enjoy it