zoukankan      html  css  js  c++  java
  • 字体在Android View中的输出 drawText

    Canvas 作为绘制文本时,使用FontMetrics对象,计算位置的坐标。
     
    public static class FontMetrics {   
          
        public float   top;   
          
        public float   ascent;   
          
        public float   descent;   
          
        public float   bottom;   
          
        public float   leading;   
    }  
    它的各基准线可以参考下图: 
     
    字体在Android <wbr>View中的输出 <wbr>drawText
    字体在Android <wbr>View中的输出 <wbr>drawText

     
    上图其实是通过代码画出来的,具体代码如下:
     
      
    mPaint.reset();   
    mPaint.setColor(Color.WHITE);   
    mPaint.setTextSize(80);   
    // FontMetrics对象    
    FontMetrics fontMetrics = mPaint.getFontMetrics();   
    String text = "abcdefg";   
    // 计算每一个坐标    
    float textWidth = mPaint.measureText(text);   
    float baseX = 30;   
    float baseY = 700;   
    float topY = baseY + fontMetrics.top;   
    float ascentY = baseY + fontMetrics.ascent;   
    float descentY = baseY + fontMetrics.descent;   
    float bottomY = baseY + fontMetrics.bottom;   
    // 绘制文本    
    canvas.drawText(text, baseX, baseY, mPaint);   
    // BaseLine描画    
    mPaint.setColor(Color.RED);   
    canvas.drawLine(baseX, baseY, baseX + textWidth, baseY, mPaint);   
    mPaint.setTextSize(20);   
    canvas.drawText("base", baseX + textWidth, baseY, mPaint);   
    // Base描画    
    canvas.drawCircle(baseX, baseY, 5, mPaint);   
    // TopLine描画    
    mPaint.setColor(Color.LTGRAY);   
    canvas.drawLine(baseX, topY, baseX + textWidth, topY, mPaint);   
    canvas.drawText("top", baseX + textWidth, topY, mPaint);   
    // AscentLine描画    
    mPaint.setColor(Color.GREEN);   
    canvas.drawLine(baseX, ascentY, baseX + textWidth, ascentY, mPaint);   
    canvas.drawText("ascent", baseX + textWidth, ascentY + 10, mPaint);   
    // DescentLine描画    
    mPaint.setColor(Color.YELLOW);   
    canvas.drawLine(baseX, descentY, baseX + textWidth, descentY, mPaint);   
    canvas.drawText("descent", baseX + textWidth, descentY, mPaint);   
    // ButtomLine描画    
    mPaint.setColor(Color.MAGENTA);   
    canvas.drawLine(baseX, bottomY, baseX + textWidth, bottomY, mPaint);   
    canvas.drawText("buttom", baseX + textWidth, bottomY + 10, mPaint);  
    相信通过以上程序,能够很好的理解topLine,buttomLine,baseLine,ascentLine,descentLine。 
     
    另外:Paint类有两个方法
     
      
    public native float ascent();   
       
      
    public native float descent();  
    ascent():the distance above the baseline(baseline以上的height) 
     
    descent():the distance below the baseline(baseline以下的height)
     
    所以ascent() + descent() 可以看成文字的height。
     
    到此为止,怎么获取文字的height和width都已经揭晓了:
  • 相关阅读:
    [转] 余国藩:人文学科何以不是科学
    [openssl][nginx] 使用openssl模拟ssl/tls客户端测试nginx stream
    [openssl] 使用openssl生成证书
    [bluez] linux下蓝牙鼠标的延迟问题
    很好的一篇文章讲epoll
    [ipsec][strongswan] VirtualPN隧道网络加速FEC(forward error correction)
    [ipsec][crypto] ike/ipsec与tls的认证机制比较
    [ipsec][crypto] 有点不同的数字证书到底是什么
    [ike][ipsec] child sa rekey机制的细节分析
    [dev][nginx] 在阅读nginx代码之前都需要准备什么
  • 原文地址:https://www.cnblogs.com/exmyth/p/4715404.html
Copyright © 2011-2022 走看看