如何讓聯繫人頭像顯示聯繫人姓名的第一個漢字

在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)

通過這個改造後,咱們就可讓默認頭像顯示中文名字的第一個漢字了!

相關文章
相關標籤/搜索