長(zhǎng)期以來,android碎片化極為嚴(yán)重,各種屏幕尺寸,分辨率,可以說是android開發(fā)者最為頭疼的問題,當(dāng)然,google也提出了各種適配方案,提供了各種分辨率的drawable文件夾,單位轉(zhuǎn)換(如dp,sp)等等,其實(shí)單位轉(zhuǎn)換都好說,圖片資源適配問題最為嚴(yán)重,如果弄好多套圖片資源,開發(fā)成本極高,apk大小也是個(gè)問題,實(shí)際上也很少這樣做,一般弄一套標(biāo)準(zhǔn)的圖片資源(xdpi)小手機(jī)上壓一下,大屏幕手機(jī)就稍微拉一下,導(dǎo)致做起來了的應(yīng)用看起來就像山寨的,但是也沒有更好的辦法,android5.0以后推出了vector Drawable不過因?yàn)榘姹鞠拗?,還不能用,目前開源社區(qū)也提供了往下兼容的庫,說真的,不好用,雖然使用矢量圖可以保證圖片不失真,換個(gè)顏色大小啥的,也是極其不靈活,還是會(huì)存在資源文件一堆堆的問題,Icon Font來了,android開發(fā)者的春天也就來了,不多說了,先來show兩張手機(jī)截圖。

上面的圖片,我沒有使用用過一張圖標(biāo)資源,點(diǎn)擊換膚的按鈕,背景圖標(biāo)會(huì)隨著一起更改,如果大家感興趣,我接著往下嘮。
什么是Icon Font?
顧名思義,Icon(圖標(biāo)),F(xiàn)ont(字體),可兩者之間有什么關(guān)系呢,為啥叫這名,我開始也很疑惑,我在github上看到Android-Iconics這個(gè)庫,就將demo下載下來運(yùn)行,效果不錯(cuò)

使用Icon Font能給我們帶來哪些好處,又存在哪些弊端呢?
利:
- 輕松解決圖標(biāo)資源適配問題,無論什么分辨率,圖片都是超級(jí)清晰的
- 輕松改變顏色,大小,背景,圓角,輪廓各種屬性
- apk大小,小,小,小
- 可實(shí)現(xiàn)跨平臺(tái),一套資源,web,ios,android都能用
- 資源維護(hù)很方便
弊:
- 需要自定義svg圖片,并將其轉(zhuǎn)換為ttf文件,圖標(biāo)制作成本比較高
總而言之,我覺著利是大于弊的,做完之后是一勞永逸的,而且大多數(shù)圖標(biāo)都不需要我們自己做,網(wǎng)上都有現(xiàn)成的,比如Android-Iconics就提供了很多的圖片資源,想要的一般都能從里面找到。
怎么樣使用Icon Font?
fontello為我們提供了將svg圖標(biāo)轉(zhuǎn)換為字體文件的方式,至于svg圖片的制作(我也不會(huì),我們UI做的用的AI矢量圖工具);前面的環(huán)節(jié)我不管了,就講講我們android 程序員該做的事情,可以參照Android-Iconics提供的Demo和文檔,我就說一下關(guān)鍵的環(huán)節(jié)
- 將ttf字體文件放在assets/fonts目錄下
- 在你的Application里面注冊(cè)字體文件
@Override
public void onCreate() {
super.onCreate();
Iconics.init(getApplicationContext());
//register custom fonts like this (or also provide a font definition file)
Iconics.registerFont(new CustomFont());
}
@Override
protected void attachBaseContext(Context base) {
super.attachBaseContext(IconicsContextWrapper.wrap(base));
}
- 重點(diǎn)看CustomFont類,在里面自定義你的Icon Font
public static enum Icon implements IIcon {
met_windy_rain_inv('\ue800'),
met_snow_inv('\ue801'),
met_snow_heavy_inv('\ue802'),
met_hail_inv('\ue803'),
met_clouds_inv('\ue804'),
met_clouds_flash_inv('\ue805'),
met_temperature('\ue806'),
met_compass('\ue807'),
met_na('\ue808'),
met_celcius('\ue809'),
met_fahrenheit('\ue80a'),
}
- 最后在xml文件或代碼中調(diào)用定義的Icon Font
<ImageView
android:layout_width="48dp"
android:layout_height="48dp"
app:ico_color="@color/md_red_A200"
app:ico_icon="gmd-plus-circle"
app:ico_size="48dp" />
new IconicsDrawable(this)
.icon(FontAwesome.Icon.faw_android)
.color(Color.RED)
.sizeDp(24)
想要了解更多,閱讀原文檔或者代碼,也希望大家多多關(guān)注我,還是那句話,好東西必須要分享 o.