关闭

android 短信字符转表情显示过程

107人阅读 评论(0) 收藏 举报
分类:

android 的短信实现方式普通用户适应的话需要长时间的使用才能习惯,将andorid的短信模式设置成我们常用的(一般人用户)的习惯。在查看字符转图片的过程中可以猜测出腾讯的QQ表情的原理应该是一样的

只是在传送非常用的表情时是将byte数据转换为image.

[java] view plain copy
  1. /*** 
  2.      *  
  3.          * 此方法描述的是:   注意此方法在做表情转换的准备了 
  4.          * @author:wujun@cqghong.com,ppwuyi@sohu.com 
  5.          * @version: 2010-5-13 下午03:31:13 
  6.      */  
  7.     private void bindCommonMessage(final MessageItem msgItem) {  
  8.         if (mDownloadButton != null) {  
  9.             mDownloadButton.setVisibility(View.GONE);  
  10.             mDownloadingLabel.setVisibility(View.GONE);  
  11.         }  
  12.         // Since the message text should be concatenated with the sender's  
  13.         // address(or name), I have to display it here instead of  
  14.         // displaying it by the Presenter.  
  15.         mBodyTextView.setTransformationMethod(HideReturnsTransformationMethod.getInstance());  
  16.   
  17.         // Get and/or lazily set the formatted message from/on the  
  18.         // MessageItem. Because the MessageItem instances come from a  
  19.         // cache (currently of size ~50), the hit rate on avoiding the  
  20.         // expensive formatMessage() call is very high.  
  21.         CharSequence formattedMessage = msgItem.getCachedFormattedMessage();  
  22.         if (formattedMessage == null) { //肯定为null应为msgItem.formattedMessage从诞生来就没被注意过一次  
  23.             formattedMessage = formatMessage(msgItem.mContact, msgItem.mBody,   //重点到了  
  24.                                              msgItem.mSubject, msgItem.mTimestamp,  
  25.                                              msgItem.mHighlight);  
  26.             msgItem.setCachedFormattedMessage(formattedMessage);  
  27.         }  
  28.         mBodyTextView.setText(formattedMessage);  
  29.   
  30.         if (msgItem.isSms()) {  
  31.             hideMmsViewIfNeeded();  
  32.         } else {  
  33.             Presenter presenter = PresenterFactory.getPresenter(  
  34.                     "MmsThumbnailPresenter", mContext,  
  35.                     this, msgItem.mSlideshow);  
  36.             presenter.present();  
  37.   
  38.             if (msgItem.mAttachmentType != WorkingMessage.TEXT) {  
  39.                 inflateMmsView();  
  40.                 mMmsView.setVisibility(View.VISIBLE);  
  41.                 setOnClickListener(msgItem);  
  42.                 drawPlaybackButton(msgItem);  
  43.             } else {  
  44.                 hideMmsViewIfNeeded();  
  45.             }  
  46.         }  
  47.   
  48.         drawLeftStatusIndicator(msgItem.mBoxId);  
  49.         drawRightStatusIndicator(msgItem);  
  50.     }  
  51. //------------------------------------------------------------------------------  
  52.   
  53. /*** 
  54.      *  
  55.          * 此方法描述的是:   开始转换了哦 
  56.          * @author:wujun@cqghong.com,ppwuyi@sohu.com 
  57.          * @version: 2010-5-13 下午03:32:52 
  58.      */  
  59.     private CharSequence formatMessage(String contact, String body, String subject,  
  60.                                        String timestamp, String highlight) {  
  61.         CharSequence template = mContext.getResources().getText(R.string.name_colon); //遇到鬼了     <主题:<xliff:g id="SUBJECT">%s</xliff:g>>"  
  62.         SpannableStringBuilder buf =                   //把他当作StringBuffer只是它可以放的不是 String 而已他能放跟多类型的东西  
  63.             new SpannableStringBuilder(TextUtils.replace(template,  
  64.                 new String[] { "%s" },  
  65.                 new CharSequence[] { contact })); //替换成联系人  
  66.   
  67.         boolean hasSubject = !TextUtils.isEmpty(subject); //主题  
  68.         if (hasSubject) {  
  69.             buf.append(mContext.getResources().getString(R.string.inline_subject, subject)); //buff先在是 联系人 主题 XXXX      eg wuyi <主题:dsadasdsa> 我爱我家  
  70.         }  
  71.   
  72.         if (!TextUtils.isEmpty(body)) {  
  73.             if (hasSubject) {  
  74.                 buf.append(" - "); //如果内容有主题有就+ " - "    eg wuyi <主题:sdsadsadsa> -   
  75.             }  
  76.             SmileyParser parser = SmileyParser.getInstance(); //获得表情类了哦  
  77.             buf.append(parser.addSmileySpans(body)); //追查 急切关注中  
  78.         }  
  79.         if (!TextUtils.isEmpty(timestamp)) {  
  80.             buf.append("\n");  
  81.             int startOffset = buf.length();  
  82.   
  83.             // put a one pixel high spacer line between the message and the time stamp as requested  
  84.             // by the spec.  
  85.             //把之间的信息和时间戳的要求间隔一个像素的高线  
  86.             //由规范  
  87.             buf.append("\n");  
  88.             buf.setSpan(new AbsoluteSizeSpan(3), startOffset, buf.length(),  
  89.                     Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);  
  90.   
  91.             startOffset = buf.length();  
  92.             buf.append(timestamp);  
  93.             buf.setSpan(new AbsoluteSizeSpan(12), startOffset, buf.length(),  
  94.                     Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);  
  95.             // Make the timestamp text not as dark 改变某区域颜色   时间的地方为特殊颜色  
  96.             int color = mContext.getResources().getColor(R.color.timestamp_color);  
  97.             buf.setSpan(new ForegroundColorSpan(color), startOffset, buf.length(),  
  98.                     Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);  
  99.         }  
  100.         if (highlight != null) {  
  101.             int highlightLen = highlight.length();  
  102.   
  103.             String s = buf.toString().toLowerCase();  
  104.             int prev = 0;  
  105.             while (true) {  
  106.                 int index = s.indexOf(highlight, prev);  
  107.                 if (index == -1) {  
  108.                     break;  
  109.                 }  
  110.                 buf.setSpan(new StyleSpan(Typeface.BOLD), index, index + highlightLen, 0);  
  111.                 prev = index + highlightLen;  
  112.             }  
  113.         }  
  114.         return buf;  
  115.     }  
  116.   
  117. //------------------------------------------------------------  
  118.   
  119. /** 
  120.      * Adds ImageSpans to a CharSequence that replace textual emoticons such 
  121.      * as :-) with a graphical version. 
  122.      *  
  123.      * @param text A CharSequence possibly containing emoticons 
  124.      * @return A CharSequence annotated with ImageSpans covering any 
  125.      *         recognized emoticons. 
  126.      * 添加ImageSpans一个CharSequence的表情符号代替文字等     *如用图形版本:-)。 
  127.      * 核心是把表情字符替换成ImageSpans的对象 
  128.      */  
  129.     public CharSequence addSmileySpans(CharSequence text) {  
  130.         SpannableStringBuilder builder = new SpannableStringBuilder(text);  
  131.   
  132.         Matcher matcher = mPattern.matcher(text);  
  133.         while (matcher.find()) {  
  134.             int resId = mSmileyToRes.get(matcher.group());  
  135.             //注意下面的一块有点不好理解哦 但是是核心  
  136.             builder.setSpan(new ImageSpan(mContext, resId), matcher.start(), matcher.end(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);  
  137.         }  
  138.   
  139.         return builder;  
  140.     }  

总结:

android 在将字符转化为表情图像其核心代码为

[java] view plain copy
  1. builder.setSpan(new ImageSpan(mContext, resId), matcher.start(), matcher.end(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);  

原理过程是先匹配到表情字符然后通过new ImageSpan(上下文,表情地址)绘制出一个ImageView然后替换掉表情字符。
0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:56978次
    • 积分:917
    • 等级:
    • 排名:千里之外
    • 原创:15篇
    • 转载:136篇
    • 译文:0篇
    • 评论:6条
    文章分类
    最新评论