zoukankan      html  css  js  c++  java
  • 如何让联系人头像显示联系人姓名的第一个汉字

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

    经过这个改造后,我们就可以让默认头像显示中文名字的第一个汉字了!

  • 相关阅读:
    前端下拉框
    使用Redis的有序集合实现排行榜功能
    python--list,str,dict,json,tuple互换用法实例
    微信支付
    C++创建及访问动态对象
    C++动态持久内存分配(new)
    C++函数与指针
    C++数组与指针
    C++指针基础
    MySQL再安装
  • 原文地址:https://www.cnblogs.com/Lefter/p/3804255.html
Copyright © 2011-2022 走看看