在android 4.4.3上面,聯繫人的頭像默認顯示首字母,可是不支持中文字符,以下圖:html
若是聯繫人名字的第一位是英文字符(a-z || A-Z),則默認頭像將顯示該首字母。android
若是支持中文時顯示第一個漢字,那就happy了。緩存
那就看看如何經過修改源代碼來實現這一小功能吧~app
咱們仍是先了解下聯繫人頭像加載的流程吧~異步
聯繫人頭像加載這個問題仍是頗有意思的,在Contacts中使用ContactPhotoManager類(嚴格來說是這個類的子類)來實現頭像的異步加載。ide
這個類還使用了LruCache來緩存圖片,至關的強大,對圖像的異步加載和緩存有興趣的同志們能夠看看。函數
以主頁面的聯繫人列表加載頭像爲例。大體的調用流程爲(只針對沒有設置頭像的聯繫人,即photoUri是null):ui
DefaultContactListAdapter->bindView()
ContactEntryListAdapter->buildQuickContact()
ContactEntryListAdapter->getDefaultImageRequestFromCursor()
ContactPhotoManagerImpl->loadPhoto()->provider:LetterTileDefaultImageProvider // 注意,使用的是DEFAULT_AVATAR對象
LetterTileDefaultImageProvider->applyDefaultImage()
LetterTileDefaultImageProvider->getDefaultImageForContact()
LetterTileDrawable->drawLetterTile()->firsr char:高spa
在drawLetterTile函數執行drawText以前會調用isEnglishLetter來判斷字符串的首字符是否爲英文字符,若是是,則將首字母畫上去;code
不然,使用默認頭像
private static boolean isEnglishLetter(final char c) { return ('A' <= c && c <= 'Z') || ('a' <= c && c <= 'z'); }
經過上面的流程解析,咱們能夠肯定,是isEnglishLetter函數致使在中文字符不被描畫。
嗯,那咱們就改造一下這個函數吧。不廢話,直接上代碼~
private static boolean isEnglishLetter(final char c) { return ('A' <= c && c <= 'Z') || ('a' <= c && c <= 'z') || isChineseLetter(c); }
private static boolean isChineseLetter(final char c) { return isChinese(String.valueOf(c)); }
至於isChinese函數的實現,代碼就不貼了,有興趣的能夠參考個人一篇判斷字符爲中文、日文、韓文的文章(http://www.cnblogs.com/Lefter/p/3804051.html)
通過這個改造後,咱們就可讓默認頭像顯示中文名字的第一個漢字了!