原創(chuàng)微信公眾號郭霖 WeChat ID: guolin_blog
對于通知欄的使用,Android各個版本其實都有比較大的調(diào)整掌挚,包括即將發(fā)布的Android 7.0版本,通知欄功能上又要有大動作止邮。那么新版本的通知欄API無法兼容老系統(tǒng)這就會是一個很頭疼的問題谨履。
為此Android在appcompat-v7庫中提供了一個NotificationCompat類來處理新老版本的兼容問題欢摄,我們在編寫通知功能時都使用NotificationCompat這個類來實現(xiàn),appcompat-v7庫就會自動幫我們做好所有系統(tǒng)版本的兼容性處理了笋粟。一段基本的觸發(fā)通知代碼如下所示:
NotificationManagermanager=(NotificationManager) getSystemService(NOTIFICATION_SERVICE);
NotificationCompat.Builderbuilder=newNotificationCompat.Builder(context);
Notificationnotification=builder.setContentTitle("這是通知標(biāo)題").setContentText("這是通知內(nèi)容").setWhen(System.currentTimeMillis()).setSmallIcon(R.mipmap.ic_launcher).setLargeIcon(BitmapFactory.decodeResource(
getResources(),R.mipmap.ic_launcher))
.build();manager.notify(1, notification);
可以看到怀挠,這里只是把我們平時使用的Notification.Builder改成了NotificationCompat.Builder而已,其他用法都是一模一樣的害捕,這樣我們的通知就具備各種Android版本的兼容性了绿淋。
注意看一下我們給通知設(shè)置的圖標(biāo),一個小圖標(biāo)尝盼、一個大圖標(biāo)吞滞,都是使用的R.mipmap.ic_launcher這張圖。其實很多app都使用的這種做法,即直接拿應(yīng)用程序的icon來作為通知的圖標(biāo)裁赠,好像這樣看上去也挺合理的殿漠。
現(xiàn)在我使用Android 6.0系統(tǒng)的Nexus 5手機(jī)運(yùn)行這個程序,并觸發(fā)上面那段通知邏輯佩捞,效果如圖下圖所示:
可以看到绞幌,通知欄上彈出了一個通知圖標(biāo)。然后我們將通知欄下拉展開一忱,效果如下圖所示:
效果好像還不錯的樣子莲蜘。但實際上,我現(xiàn)在是將項目的targetSdkVersion指定成了21以下掀潮,即低于5.0系統(tǒng)菇夸。如果將targetSdkVersion指定成21或者更高的話琼富,結(jié)果可能就不樂觀了:
defaultConfig { ? ?.... ? ?targetSdkVersion23
}
這里我們將targetSdkVersion指定成了23仪吧,然后重新運(yùn)行程序并觸發(fā)圖標(biāo)邏輯,效果如下圖所示:
恩鞠眉?這是什么鬼薯鼠,怎么通知圖標(biāo)變成白白的一個圓了。下拉之后的大圖效果如下:
好像下拉之后的大圖還算正常械蹋,不過大圖的右下角也有一個白白的圓出皇。
這到底是為什么呢?實際上哗戈,Android從5.0系統(tǒng)開始郊艘,對于通知欄圖標(biāo)的設(shè)計進(jìn)行了修改。現(xiàn)在Google要求唯咬,所有應(yīng)用程序的通知欄圖標(biāo)纱注,應(yīng)該只使用alpha圖層來進(jìn)行繪制,而不應(yīng)該包括RGB圖層胆胰。
說的好像很玄乎狞贱,什么叫作只使用alpha圖層來進(jìn)行繪制呢?其實通俗點(diǎn)來講蜀涨,就是讓我們的通知欄圖標(biāo)不要帶顏色就可以了瞎嬉。
恩?不帶顏色厚柳!那圖標(biāo)還怎么設(shè)計氧枣?但這就不是我們程序員應(yīng)該考慮的問題了,而是應(yīng)該交給項目的UI設(shè)計師來想辦法别垮,但我們需要將這個設(shè)計需求清楚地告訴設(shè)計師便监,因為他們通常并不知道Google的各種標(biāo)準(zhǔn)和要求。
那么我們來參考一下別的程序都是怎么設(shè)計通知欄圖標(biāo)的宰闰,這是支付寶的通知欄圖標(biāo):
下拉通知之后的效果是這樣的:
然后再看一下網(wǎng)易新聞的通知欄圖標(biāo):
下拉通知之后的效果是這樣的:
可以看出茬贵,它們的通知欄小圖都是沒有RGB色的簿透,圖標(biāo)是只有白色一種顏色,然后借助alpha圖層來繪制出一個logo的樣式解藻。
因此老充,按著這種設(shè)計要求,我將項目的通知欄圖標(biāo)改成了這個樣子:
這張圖只用于替換通知的小圖部分螟左,大圖仍然還是用原來的那樣圖就可以了》茸牵現(xiàn)在重新運(yùn)行一下程序,效果如下圖所示:
這樣看上去效果就好多了吧胶背?然后下拉通知欄之后的效果如下圖所示:
這里我們來仔細(xì)觀察一下這個下拉后的大圖巷嚣,其實前面大家應(yīng)該也已經(jīng)注意到了,只不過一直沒提钳吟,在大圖標(biāo)的右下角廷粒,還有一個比較小的圓圈,在這個圓圈中嵌套著我們設(shè)置的小圖標(biāo)红且。
這個功能是系統(tǒng)自動附加的一個功能坝茎,并不需要我們進(jìn)行任何的代碼設(shè)置,可以觀察一下暇番,支付寶嗤放、網(wǎng)易新聞也都是有這個功能的。但是如果我們再看仔細(xì)一點(diǎn)壁酬,你會發(fā)現(xiàn)網(wǎng)易的圖標(biāo)更好看一些次酌,因為系統(tǒng)給右下角的這個小圓圈默認(rèn)是設(shè)置成灰色的,和我們的整體色調(diào)并不搭配舆乔,而網(wǎng)易則將這個小圓圈改成了紅色岳服,因此總體視覺效果更好。
那么怎樣修改這個小圓圈的顏色呢蜕煌?其實非常簡單派阱,只需要在NotificationCompat.Builder中再多連綴一個setColor()方法就可以了,如下所示:
Notificationnotification=builder
.......setColor(Color.parseColor("#EAA935")) ? ? ? ?.build();
現(xiàn)在重新運(yùn)行一下程序斜纪,通知欄大圖的具體效果如下圖所示:
怎么樣贫母,現(xiàn)在的效果是不是更棒了?不過我不知道為什么微信會把圖片壓縮的這么模糊盒刚,我截的原圖都還是挺清晰的腺劣,因此如果大家想要直觀體驗到最佳的視覺效果,最好的辦法還是自己動手試一試因块。
但是這里我還要給大家提個醒橘原,上面的功能我使用Nexus手機(jī)和三星手機(jī)都測試過,結(jié)果都是正常的,但是使用小米手機(jī)測試就比較無語了趾断,MIUI系統(tǒng)直接無視我們設(shè)置的大圖和小圖拒名,一律使用應(yīng)用程序的icon來作為通知欄圖標(biāo),所以如果你是使用的小米手機(jī)芋酌,就測試不出來上述的各種效果了增显。其他手機(jī)的兼容性我還沒有試過,不過不管怎么樣脐帝,我們的代碼都是要這么寫的同云,至于那些定制過的系統(tǒng)該如何去解析展示,那是這些第三方廠商的事情堵腹,畢竟我們程序員也是控制不了的炸站。
當(dāng)然,如果你手上只有小米手機(jī)的話疚顷,也不要絕望旱易,還是可以使用Android模擬器來測試這個功能的。
完荡含。咒唆。。释液。。装处。误债。。妄迁。寝蹈。。登淘。箫老。。黔州。耍鬓。。流妻。牲蜀。。绅这。
文章原創(chuàng)作者GuoLin 書籍推薦
郭林大神原創(chuàng)android 書籍:《第一行代碼 android》