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


在android 4.4.3上面,聯系人的頭像默認顯示首字母,但是不支持中文字符,如下圖:

如果聯系人名字的第一位是英文字符(a-z || A-Z),則默認頭像將顯示該首字母。

如果支持中文時顯示第一個漢字,那就happy了。

那就看看如何通過修改源代碼來實現這一小功能吧~

我們還是先了解下聯系人頭像加載的流程吧~

聯系人頭像加載這個問題還是很有意思的,在Contacts中使用ContactPhotoManager類(嚴格來講是這個類的子類)來實現頭像的異步加載。

這個類還使用了LruCache來緩存圖片,相當的強大,對圖像的異步加載和緩存有興趣的同志們可以看看。

以主頁面的聯系人列表加載頭像為例。大致的調用流程為(只針對沒有設置頭像的聯系人,即photoUri是null):

DefaultContactListAdapter->bindView()
  ContactEntryListAdapter->buildQuickContact()
    ContactEntryListAdapter->getDefaultImageRequestFromCursor()
      ContactPhotoManagerImpl->loadPhoto()->provider:LetterTileDefaultImageProvider // 注意,使用的是DEFAULT_AVATAR對象
        LetterTileDefaultImageProvider->applyDefaultImage()
          LetterTileDefaultImageProvider->getDefaultImageForContact()
            LetterTileDrawable->drawLetterTile()->firsr char:高

在drawLetterTile函數執行drawText之前會調用isEnglishLetter來判斷字符串的首字符是否為英文字符,如果是,則將首字母畫上去;

否則,使用默認頭像

    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)

經過這個改造后,我們就可以讓默認頭像顯示中文名字的第一個漢字了!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM