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

转载 2016年08月28日 16:06:19

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然后替换掉表情字符。

android 发送短信 判断号码规则 判断字符数70

public class duan extends Activity { /*声明变量一个Button与两个EditText*/ private Button mButton1; ...

android程序中使用ios表情字符

  • 2016年05月27日 15:29
  • 1.31MB
  • 下载

android观察者模式模拟短信改变过程

在java中,我们都知道有两个内置类型,一个是Observer接口,一个是Obserable实现类。Observer是观察者实现的接口,Observable是被观察者实现的类...

无法进入系统的三星Android手机恢复联系人、短信数据并重置手机的过程

领导的一台Samsung Grand DUOS(I9082)联通合约手机前一阵子突然坏了,按开机

Android 过滤特殊字符和emoji表情

网上有很多屏蔽特殊字符和表情的例子,用起来也很简单,比如: //判断搜索框内容是否包含特殊字符 String limitEx = "[`~!@#$%^&*()+=...
  • luckrr
  • luckrr
  • 2016年12月21日 14:32
  • 3177

android中字符替换成表情

在android中短信功能里面就自带了将字符替换成表情的功能,源码中主要的类是:SmileyParser.java /*  * Copyright (C) 2009 The A...

向android程序中加入ios的表情字符

废话少说,直接上效果图。 主要的文件有两个:emoji_ios7.txt和EmojiTransfer.java,前一个存储表情字符串,在andorid手机中打开可以看到,共907个。不过有些...

Android之UI学习篇四:EditText输入表情和特殊字符

大家都知道EditText可以输入数据,如何在EditText中来插入表情,以及实现只能输入规定格式的信息呢? 首先给大家看一下实现的效果: 界面如下: 当点击"添加表情"后,会...

(转)Android高仿微信表情输入与键盘输入(详细实现分析)

原地址:http://blog.csdn.net/javazejian/article/details/52126391 转载请注明出处(请尊重原创!谢谢~):  http://blog.c...
  • duyiqun
  • duyiqun
  • 2017年04月05日 11:55
  • 505
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:android 短信字符转表情显示过程
举报原因:
原因补充:

(最多只允许输入30个字)