Android 解決字型隨系統調節而變化的問題
阿新 • • 發佈:2018-12-31
- 看了標題也許不太清楚,所以先上兩張 滴滴 的截圖,對比一下:
1.png.jpeg
2.png.jpeg
-
應該可以明顯的看到,第一張圖中紅色框中的“分鐘”兩個字顯示不完整,原因就是:1、使用者在設定中調節了字型大小,2、紅色框佈局中TextView使用的是單位為“sp”,並且佈局寬高也是固定的。
-
在這裡引入一個知識點:關於sp文件的描述為:
Scale-independent Pixels – This is like the dp unit, but it is also scaled by the user’s font size preference. It is recommend you use this
“Android sp單位除了受螢幕密度影響外,還受到使用者的字型大小影響,通常情況下,建議使用sp來跟隨使用者字型大小設定。除非一些特殊的情況,不想跟隨系統字型變化的,可以使用dp”。按照這麼說,佈局寬高固定寫死的地方應該統一用dp顯示字型,因為一旦使用者在設定中調大字型,寬高寫死的佈局顯示就亂了。
做個簡單的例子,先驗證一下:
- 同樣的佈局程式碼
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="18sp"
android:text="Hello World! in SP" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="18dp"
android:text="Hello World! in DP" />
-
調節設定中顯示字型大小
4.png.jpeg -
執行後顯示樣式
3.png.jpeg
3、好了,回到標題要解決的問題,如果要像微信一樣,所有字型都不允許隨系統調節而發生大小變化,要怎麼辦呢?利用Android的Configuration類中的fontScale屬性,其預設值為1,會隨系統調節字型大小而發生變化,如果我們強制讓其等於預設值,就可以實現字型不隨調節改變,在工程的Application或BaseActivity中新增下面的程式碼:
@Override
public void onConfigurationChanged(Configuration newConfig) {
if (newConfig.fontScale != 1)//非預設值
getResources();
super.onConfigurationChanged(newConfig);
}
@Override
public Resources getResources() {
Resources res = super.getResources();
if (res.getConfiguration().fontScale != 1) {//非預設值
Configuration newConfig = new Configuration();
newConfig.setToDefaults();//設定預設
res.updateConfiguration(newConfig, res.getDisplayMetrics());
}
return res;
}
4、總結,兩種方案解決這個問題:
一是佈局寬高固定的情況下,字型單位改用dp表示;
二是通過3中的程式碼設定應用不能隨系統調節,在檢測到fontScale屬性不為預設值1的情況下,強行進行改變。
如有問題,還望提出意見,畢竟個人經驗有限。