原文:https://blog.csdn.net/uyy203/article/details/54926753
Android自定義View繪制的時候,會有很多情況下要與字體打交道拼岳,涉及到字體寬度害捕、高度的時候要特別注意一下幾個概念别厘,見圖:
baseLine:一行文字的底線。
Ascent: 字符頂部到baseLine的距離。
Descent: 字符底部到baseLine的距離屯断。
Leading: 字符行間距脱拼。
public class TestOnDraw extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
MyView v = new MyView(this);
this.setContentView(v);
}
}
class MyView extends View
{
public MyView(Context context) {
super(context);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
Paint p = new Paint();
p.setColor(Color.WHITE);
p.setTextSize(50);
p.setAntiAlias(true);
FontMetrics fm = p.getFontMetrics();
System.out.println("top = "+ fm.top);
System.out.println("ascent = "+ fm.ascent);
System.out.println("descent = "+ fm.descent);
System.out.println("bottom = "+ fm.bottom);
System.out.println("leading = "+ fm.leading);
int textHeight = (int) (Math.ceil(fm.descent - fm.ascent) + 2);
System.out.println("textHeight = " + textHeight);
float width =500;
float baseline = 100f;
float offsetAscent = baseline + fm.ascent;
float offsetDescent = baseline +fm.descent;
float offsetTop = baseline + fm.top;
float offsetBottom = baseline + fm.bottom;
canvas.drawText("中國 bp Android", 0, baseline, p);
canvas.drawLine(0, baseline, width, baseline, p);//baseline
canvas.drawLine(0, offsetAscent, width, offsetAscent, p);//ascent
canvas.drawLine(0, offsetDescent, width, offsetDescent, p);//descent
canvas.drawLine(0, offsetTop, width, offsetTop, p);//top
canvas.drawLine(0, offsetBotton, width, offsetBottom, p);//bottom
}
}
public class TestOnDraw extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
MyView v = new MyView(this);
this.setContentView(v);
}
}
class MyView extends View
{
public MyView(Context context) {
super(context);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
Paint p = new Paint();
p.setColor(Color.WHITE);
p.setTextSize(50);
p.setAntiAlias(true);
FontMetrics fm = p.getFontMetrics();
System.out.println("top = "+ fm.top);
System.out.println("ascent = "+ fm.ascent);
System.out.println("descent = "+ fm.descent);
System.out.println("bottom = "+ fm.bottom);
System.out.println("leading = "+ fm.leading);
int textHeight = (int) (Math.ceil(fm.descent - fm.ascent) + 2);
System.out.println("textHeight = " + textHeight);
float width =500;
float baseline = 100f;
float offsetAscent = baseline + fm.ascent;
float offsetDescent = baseline +fm.descent;
float offsetTop = baseline + fm.top;
float offsetBottom = baseline + fm.bottom;
canvas.drawText("中國 bp Android", 0, baseline, p);
canvas.drawLine(0, baseline, width, baseline, p);//baseline
canvas.drawLine(0, offsetAscent, width, offsetAscent, p);//ascent
canvas.drawLine(0, offsetDescent, width, offsetDescent, p);//descent
canvas.drawLine(0, offsetTop, width, offsetTop, p);//top
canvas.drawLine(0, offsetBotton, width, offsetBottom, p);//bottom
}
}
運(yùn)行效果:
這是程序的輸出結(jié)果:
得出結(jié)論: canvas drawText() 的startX是從左下角的baseline的底線開始繪畫的瞒瘸,如果我們要得到字體的高度需要關(guān)注descent - ascent (ascent線在baseline上面,所以是負(fù)數(shù))