1. 程式人生 > >動態更改textview的字型大小

動態更改textview的字型大小

最近app開發產品提出了一個需求是,需要動態更改TextView內容字型的大小,比如設定TextView只有一行,寬度只有200dp,內容超過這個之後就縮小字型顯示,只能能將字型都顯示完全;好吧,其實就是動態更改TextView的字型大小,當TextView的內容比較多時縮小顯示,當TextView的內容比較少時正常顯示。

具體的使用方式可以在其github網址上參考;

這裡看一下例子展示:
1)當文字字數比較少的時候:

2)當文字字數比較多的時候:

3)當文字字數再多的時候:

可以看出來:當文字沒有填充TextView完全時顯示的就是預設的字型,當文字能夠完全填充TextView並且一行顯示不下時,他會預設的縮小文字的字型,當文字再多時,他會預設在末尾省略。。。

原理:
檢視該開源專案的具體實現:

裡面的AutoTextView就是具體實現動態更改TextView字型大小的元件,大概看了一下原始碼,主要是自定義TextView並繼承系統的TextView,然後在繪製元件的時候根據getMaxLines方法獲取內容的行數若內容的行數大於1,則縮小文字的字型,然後在嘗試獲取getMaxLines方法,若內容的行數還是大於1,則據悉縮小文字的字型,直到內容能夠一行顯示或者是字型縮小大一定的大小,這時候若縮小到一定的大小還是不能一行顯示,則尾部省略。。。

產品中有一個需求是根據TextVIew顯示的內容的大小設定字型大小:
[html] view plain copy 在CODE上檢視程式碼片派生到我的程式碼片
// 優惠券金額為三位數時,更改字型大小
if (couponAmunt.length() >= 3) {
holder.favourItemPriceUnit.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 15);
holder.favourItemPrice.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 30);
} else {
holder.favourItemPrice.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 36);
holder.favourItemPriceUnit.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 18);
}
在幫TextView控制元件設定大小的時候,發現和在XML中用PX設定的不一樣;由於我們在設定字型大小的時候統一使用的是DP為單位,以前一直以為setTextSize(int size)這裡的size引數是以px為單位的,所以這裡使用的是setText(dp2px),但是現實的結果一直偏大,後來查詢該方法的原始碼:
[html] view plain copy 在CODE上檢視程式碼片派生到我的程式碼片
/**
* Set the default text size to the given value, interpreted as “scaled
* pixel” units. This size is adjusted based on the current density and
* user font size preference.
*
* @param size The scaled pixel size.
*
* @attr ref android.R.styleable#TextView_textSize
*/
@android.view.RemotableViewMethod
public void setTextSize(float size) {
setTextSize(TypedValue.COMPLEX_UNIT_SP, size);
}
才發現這裡使用的是SP為單位,所以後來查詢了一個它的過載方法:
setTextSize(int unit, int size)
第一個引數可設定如下靜態變數:
TypedValue.COMPLEX_UNIT_PX : Pixels
TypedValue.COMPLEX_UNIT_SP : Scaled Pixels
TypedValue.COMPLEX_UNIT_DIP : Device Independent Pixels