首页 > 系统 > Android > 正文

Android 字体高度的研究

2019-11-09 15:49:43
字体:
来源:转载
供稿:网友

Android自定义View绘制的时候,会有很多情况下要与字体打交道,涉及到字体宽度、高度的时候要特别注意一下几个概念,见图:

 

 

 

baseLine:一行文字的底线。

Ascent: 字符顶部到baseLine的距离。

Descent: 字符底部到baseLine的距离。

Leading: 字符行间距。

 

 

java代码 复制代码 收藏代码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       }   }  [java] view plain copypublic 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      }  }   

运行效果:

 

 

这是程序的输出结果:

 

得出结论: canvas drawText() 的startX是从左下角的baseline的底线开始绘画的,如果我们要得到字体的高度需要关注descent - ascent (ascent线在baseline上面,所以是负数)


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表