原創(chuàng)微信公眾號(hào)郭霖 WeChat ID: guolin_blog
對(duì)于通知欄的使用,Android各個(gè)版本其實(shí)都有比較大的調(diào)整,包括即將發(fā)布的Android 7.0版本,通知欄功能上又要有大動(dòng)作。那么新版本的通知欄API無(wú)法兼容老系統(tǒng)這就會(huì)是一個(gè)很頭疼的問(wèn)題。
為此Android在appcompat-v7庫(kù)中提供了一個(gè)NotificationCompat類來(lái)處理新老版本的兼容問(wèn)題,我們?cè)诰帉懲ㄖδ軙r(shí)都使用NotificationCompat這個(gè)類來(lái)實(shí)現(xiàn),appcompat-v7庫(kù)就會(huì)自動(dòng)幫我們做好所有系統(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);
可以看到,這里只是把我們平時(shí)使用的Notification.Builder改成了NotificationCompat.Builder而已,其他用法都是一模一樣的,這樣我們的通知就具備各種Android版本的兼容性了。
注意看一下我們給通知設(shè)置的圖標(biāo),一個(gè)小圖標(biāo)、一個(gè)大圖標(biāo),都是使用的R.mipmap.ic_launcher這張圖。其實(shí)很多app都使用的這種做法,即直接拿應(yīng)用程序的icon來(lái)作為通知的圖標(biāo),好像這樣看上去也挺合理的。
現(xiàn)在我使用Android 6.0系統(tǒng)的Nexus 5手機(jī)運(yùn)行這個(gè)程序,并觸發(fā)上面那段通知邏輯,效果如圖下圖所示:
可以看到,通知欄上彈出了一個(gè)通知圖標(biāo)。然后我們將通知欄下拉展開,效果如下圖所示:
效果好像還不錯(cuò)的樣子。但實(shí)際上,我現(xiàn)在是將項(xiàng)目的targetSdkVersion指定成了21以下,即低于5.0系統(tǒng)。如果將targetSdkVersion指定成21或者更高的話,結(jié)果可能就不樂(lè)觀了:
defaultConfig { ? ?.... ? ?targetSdkVersion23
}
這里我們將targetSdkVersion指定成了23,然后重新運(yùn)行程序并觸發(fā)圖標(biāo)邏輯,效果如下圖所示:
恩?這是什么鬼,怎么通知圖標(biāo)變成白白的一個(gè)圓了。下拉之后的大圖效果如下:
好像下拉之后的大圖還算正常,不過(guò)大圖的右下角也有一個(gè)白白的圓。
這到底是為什么呢?實(shí)際上,Android從5.0系統(tǒng)開始,對(duì)于通知欄圖標(biāo)的設(shè)計(jì)進(jìn)行了修改?,F(xiàn)在Google要求,所有應(yīng)用程序的通知欄圖標(biāo),應(yīng)該只使用alpha圖層來(lái)進(jìn)行繪制,而不應(yīng)該包括RGB圖層。
說(shuō)的好像很玄乎,什么叫作只使用alpha圖層來(lái)進(jìn)行繪制呢?其實(shí)通俗點(diǎn)來(lái)講,就是讓我們的通知欄圖標(biāo)不要帶顏色就可以了。
恩?不帶顏色!那圖標(biāo)還怎么設(shè)計(jì)?但這就不是我們程序員應(yīng)該考慮的問(wèn)題了,而是應(yīng)該交給項(xiàng)目的UI設(shè)計(jì)師來(lái)想辦法,但我們需要將這個(gè)設(shè)計(jì)需求清楚地告訴設(shè)計(jì)師,因?yàn)樗麄兺ǔ2⒉恢繥oogle的各種標(biāo)準(zhǔn)和要求。
那么我們來(lái)參考一下別的程序都是怎么設(shè)計(jì)通知欄圖標(biāo)的,這是支付寶的通知欄圖標(biāo):
下拉通知之后的效果是這樣的:
然后再看一下網(wǎng)易新聞的通知欄圖標(biāo):
下拉通知之后的效果是這樣的:
可以看出,它們的通知欄小圖都是沒(méi)有RGB色的,圖標(biāo)是只有白色一種顏色,然后借助alpha圖層來(lái)繪制出一個(gè)logo的樣式。
因此,按著這種設(shè)計(jì)要求,我將項(xiàng)目的通知欄圖標(biāo)改成了這個(gè)樣子:
這張圖只用于替換通知的小圖部分,大圖仍然還是用原來(lái)的那樣圖就可以了?,F(xiàn)在重新運(yùn)行一下程序,效果如下圖所示:
這樣看上去效果就好多了吧?然后下拉通知欄之后的效果如下圖所示:
這里我們來(lái)仔細(xì)觀察一下這個(gè)下拉后的大圖,其實(shí)前面大家應(yīng)該也已經(jīng)注意到了,只不過(guò)一直沒(méi)提,在大圖標(biāo)的右下角,還有一個(gè)比較小的圓圈,在這個(gè)圓圈中嵌套著我們?cè)O(shè)置的小圖標(biāo)。
這個(gè)功能是系統(tǒng)自動(dòng)附加的一個(gè)功能,并不需要我們進(jìn)行任何的代碼設(shè)置,可以觀察一下,支付寶、網(wǎng)易新聞也都是有這個(gè)功能的。但是如果我們?cè)倏醋屑?xì)一點(diǎn),你會(huì)發(fā)現(xiàn)網(wǎng)易的圖標(biāo)更好看一些,因?yàn)橄到y(tǒng)給右下角的這個(gè)小圓圈默認(rèn)是設(shè)置成灰色的,和我們的整體色調(diào)并不搭配,而網(wǎng)易則將這個(gè)小圓圈改成了紅色,因此總體視覺(jué)效果更好。
那么怎樣修改這個(gè)小圓圈的顏色呢?其實(shí)非常簡(jiǎn)單,只需要在NotificationCompat.Builder中再多連綴一個(gè)setColor()方法就可以了,如下所示:
Notificationnotification=builder
.......setColor(Color.parseColor("#EAA935")) ? ? ? ?.build();
現(xiàn)在重新運(yùn)行一下程序,通知欄大圖的具體效果如下圖所示:
怎么樣,現(xiàn)在的效果是不是更棒了?不過(guò)我不知道為什么微信會(huì)把圖片壓縮的這么模糊,我截的原圖都還是挺清晰的,因此如果大家想要直觀體驗(yàn)到最佳的視覺(jué)效果,最好的辦法還是自己動(dòng)手試一試。
但是這里我還要給大家提個(gè)醒,上面的功能我使用Nexus手機(jī)和三星手機(jī)都測(cè)試過(guò),結(jié)果都是正常的,但是使用小米手機(jī)測(cè)試就比較無(wú)語(yǔ)了,MIUI系統(tǒng)直接無(wú)視我們?cè)O(shè)置的大圖和小圖,一律使用應(yīng)用程序的icon來(lái)作為通知欄圖標(biāo),所以如果你是使用的小米手機(jī),就測(cè)試不出來(lái)上述的各種效果了。其他手機(jī)的兼容性我還沒(méi)有試過(guò),不過(guò)不管怎么樣,我們的代碼都是要這么寫的,至于那些定制過(guò)的系統(tǒng)該如何去解析展示,那是這些第三方廠商的事情,畢竟我們程序員也是控制不了的。
當(dāng)然,如果你手上只有小米手機(jī)的話,也不要絕望,還是可以使用Android模擬器來(lái)測(cè)試這個(gè)功能的。
完。。。。。。。。。。。。。。。。。。。。。
文章原創(chuàng)作者GuoLin 書籍推薦
郭林大神原創(chuàng)android 書籍:《第一行代碼 android》
