Android中Paint字體的使用

轉自:http://chen2337.blog.163.com/blog/static/34039920201173335056/

一、Android中Paint字體屬性的設置:

在Android SDK中使用Typeface類來定義字體,可以通過常用字體類型名稱進行設置,如設置默認黑體:


Paint mp = new paint();
mp.setTypeface(Typeface.DEFAULT_BOLD)
常用的字體類型名稱還有:

  * Typeface.DEFAULT //常規字體類型

  * Typeface.DEFAULT_BOLD //黑體字體類型

  * Typeface.MONOSPACE //等寬字體類型

  * Typeface.SANS_SERIF //sans serif字體類型

  * Typeface.SERIF //serif字體類型

除了字體類型設置之外,還可以爲字體類型設置字體風格,如設置粗體:
Paint mp = new Paint();
Typeface font = Typeface.create(Typeface.SANS_SERIF, Typeface.BOLD);
p.setTypeface( font );
常用的字體風格名稱還有:

  * Typeface.BOLD //粗體

  * Typeface.BOLD_ITALIC //粗斜體

  * Typeface.ITALIC //斜體

  * Typeface.NORMAL //常規


但是有時上面那些設置在繪圖過程中是不起作用的,所以還有如下設置方式:
Paint mp = new Paint();
mp.setFakeBoldText(true); //true爲粗體,false爲非粗體
mp.setTextSkewX(-0.5f); //float類型參數,負數表示右斜,整數左斜
mp.setUnderlineText(true); //true爲下劃線,false爲非下劃線
mp.setStrikeThruText(true); //true爲刪除線,false爲非刪除線
Paint常用的方法還有:
mp.setTextSize(); //設置字體大小,int型,如12
mp.setStrokeWidth(w); //設置線寬,float型,如2.5f,默認繪文本無需設置(默認值好像爲0),但假如設置了,再繪製文本的時候一定要恢復到0
說明:對於中文粗體的設置,好像只能通過setFakeBoldText(true)來實現,儘管效果看起來不是很實在(字體中空效果)。實際發現,最後繪製的效果與手機硬件也有些關係,比如前面的繪圖測試程序,在HTC裏面黑體中文一行壓根沒顯示(英文和數字是正常的),而斜體一行倒顯示了,只是沒有斜體效果。魅族M9表現的很給力,可能是M9定製的Android系統裏面字體庫比較豐富吧!

public void onDraw(Canvas canvas)
{
      super.onDraw(canvas);
       Paint p = new Paint();
      String familyName = “宋體”;
      Typeface font = Typeface.create(familyName,Typeface.BOLD);
      p.setColor(Color.RED);
      p.setTypeface(font);
      p.setTextSize(22);
      canvas.drawText(mstrTitle,0,100,p);
}

 

二、Android獲取字體高度和設置行高

Java代碼
public int getFontHeight(float fontSize)  
{  
     Paint paint = new Paint();  
     paint.setTextSize(fontSize);  
     FontMetrics fm = paint.getFontMetrics();  
    return (int) Math.ceil(fm.descent - fm.top) + 2;  
}  
個人更傾向於以下方式獲取字體實際高度:
Java代碼
Math.ceil(fm.descent - fm.ascent)  
通過實際的截圖對文字高度的確定,後者更準確一些。

 

 有了字體高度信息,就可以添加行與行之間的空隙,調整行高。

Java代碼:
paint.setTextSize(fFontWidth);  
FontMetrics fm = paint.getFontMetrics();  
  
fFontHeight = (float)Math.ceil(fm.descent - fm.ascent);  
if(fFontHeight > fLineHeight)  
{  
     fMulValue = fLineHeight / fFontHeight;  
     fAddValue = -1;  
}  
else  
{  
     fMulValue = 1;  
     fAddValue = fLineHeight - fFontHeight;  
}  
textViewLeft.setTextSize(fFontWidth);  
textViewLeft.setLineSpacing(fAddValue, fMulValue);  
實踐驗證這種方式對多種分辨率的屏幕的適應性較強。

 

三、使用自定義字體

Typeface.createFromAsset(getContext().getAssets(),"fonts/samplefont.ttf");  

paint.setFlags(Paint.ANTI_ALIAS_FLAG)   //消除鋸齒

paint.measureText(String s) //取得字符串寬度 

Canvas 作爲繪製文本時,使用FontMetrics對象,計算位置的座標。

它的思路和java.awt.FontMetrics的基本相同。 

FontMetrics對象

它以四個基本座標爲基準,分別爲:

?FontMetrics.top
       ?FontMetrics.ascent
       ?FontMetrics.descent
       ?FontMetrics.bottom 

該圖片將如下 

發佈了50 篇原創文章 · 獲贊 10 · 訪問量 31萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章