轉自: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該圖片將如下