1. 程式人生 > >android 簡訊字元轉表情顯示過程

android 簡訊字元轉表情顯示過程

android 的簡訊實現方式普通使用者適應的話需要長時間的使用才能習慣,將andorid的簡訊模式設定成我們常用的(一般人使用者)的習慣。在檢視字元轉圖片的過程中可以猜測出騰訊的QQ表情的原理應該是一樣的

只是在傳送非常用的表情時是將byte資料轉換為image.

  1. /*** 
  2.      *  
  3.          * 此方法描述的是:   注意此方法在做表情轉換的準備了 
  4.          * @author:[email protected],[email protected] 
  5.          * @version: 2010-5-13 下午03:31:13 
  6.      */
  7.     privatevoid 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.         // Get and/or lazily set the formatted message from/on the
  17.         // MessageItem. Because the MessageItem instances come from a
  18.         // cache (currently of size ~50), the hit rate on avoiding the
  19.         // expensive formatMessage() call is very high.
  20.         CharSequence formattedMessage = msgItem.getCachedFormattedMessage();  
  21.         if (formattedMessage == null) { //肯定為null應為msgItem.formattedMessage從誕生來就沒被注意過一次
  22.             formattedMessage = formatMessage(msgItem.mContact, msgItem.mBody,   //重點到了
  23.                                              msgItem.mSubject, msgItem.mTimestamp,  
  24.                                              msgItem.mHighlight);  
  25.             msgItem.setCachedFormattedMessage(formattedMessage);  
  26.         }  
  27.         mBodyTextView.setText(formattedMessage);  
  28.         if (msgItem.isSms()) {  
  29.             hideMmsViewIfNeeded();  
  30.         } else {  
  31.             Presenter presenter = PresenterFactory.getPresenter(  
  32.                     "MmsThumbnailPresenter", mContext,  
  33.                     this, msgItem.mSlideshow);  
  34.             presenter.present();  
  35.             if (msgItem.mAttachmentType != WorkingMessage.TEXT) {  
  36.                 inflateMmsView();  
  37.                 mMmsView.setVisibility(View.VISIBLE);  
  38.                 setOnClickListener(msgItem);  
  39.                 drawPlaybackButton(msgItem);  
  40.             } else {  
  41.                 hideMmsViewIfNeeded();  
  42.             }  
  43.         }  
  44.         drawLeftStatusIndicator(msgItem.mBoxId);  
  45.         drawRightStatusIndicator(msgItem);  
  46.     }  
  47. //------------------------------------------------------------------------------
  48. /*** 
  49.      *  
  50.          * 此方法描述的是:   開始轉換了哦 
  51.          * @author:[email protected],[email protected] 
  52.          * @version: 2010-5-13 下午03:32:52 
  53.      */
  54.     private CharSequence formatMessage(String contact, String body, String subject,  
  55.                                        String timestamp, String highlight) {  
  56.         CharSequence template = mContext.getResources().getText(R.string.name_colon); //遇到鬼了     <主題:<xliff:g id="SUBJECT">%s</xliff:g>>"
  57.         SpannableStringBuilder buf =                   //把他當作StringBuffer只是它可以放的不是 String 而已他能放跟多型別的東西
  58.             new SpannableStringBuilder(TextUtils.replace(template,  
  59.                 new String[] { "%s" },  
  60.                 new CharSequence[] { contact })); //替換成聯絡人
  61.         boolean hasSubject = !TextUtils.isEmpty(subject); //主題
  62.         if (hasSubject) {  
  63.             buf.append(mContext.getResources().getString(R.string.inline_subject, subject)); //buff先在是 聯絡人 主題 XXXX      eg wuyi <主題:dsadasdsa> 我愛我家
  64.         }  
  65.         if (!TextUtils.isEmpty(body)) {  
  66.             if (hasSubject) {  
  67.                 buf.append(" - "); //如果內容有主題有就+ " - "    eg wuyi <主題:sdsadsadsa> - 
  68.             }  
  69.             SmileyParser parser = SmileyParser.getInstance(); //獲得表情類了哦
  70.             buf.append(parser.addSmileySpans(body)); //追查 急切關注中
  71.         }  
  72.         if (!TextUtils.isEmpty(timestamp)) {  
  73.             buf.append("\n");  
  74.             int startOffset = buf.length();  
  75.             // put a one pixel high spacer line between the message and the time stamp as requested
  76.             // by the spec.
  77.             //把之間的資訊和時間戳的要求間隔一個畫素的高線
  78.             //由規範
  79.             buf.append("\n");  
  80.             buf.setSpan(new AbsoluteSizeSpan(3), startOffset, buf.length(),  
  81.                     Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);  
  82.             startOffset = buf.length();  
  83.             buf.append(timestamp);  
  84.             buf.setSpan(new AbsoluteSizeSpan(12), startOffset, buf.length(),  
  85.                     Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);  
  86.             // Make the timestamp text not as dark 改變某區域顏色   時間的地方為特殊顏色
  87.             int color = mContext.getResources().getColor(R.color.timestamp_color);  
  88.             buf.setSpan(new ForegroundColorSpan(color), startOffset, buf.length(),  
  89.                     Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);  
  90.         }  
  91.         if (highlight != null) {  
  92.             int highlightLen = highlight.length();  
  93.             String s = buf.toString().toLowerCase();  
  94.             int prev = 0;  
  95.             while (true) {  
  96.                 int index = s.indexOf(highlight, prev);  
  97.                 if (index == -1) {  
  98.                     break;  
  99.                 }  
  100.                 buf.setSpan(new StyleSpan(Typeface.BOLD), index, index + highlightLen, 0);  
  101.                 prev = index + highlightLen;  
  102.             }  
  103.         }  
  104.         return buf;  
  105.     }  
  106. //------------------------------------------------------------
  107. /** 
  108.      * Adds ImageSpans to a CharSequence that replace textual emoticons such 
  109.      * as :-) with a graphical version. 
  110.      *  
  111.      * @param text A CharSequence possibly containing emoticons 
  112.      * @return A CharSequence annotated with ImageSpans covering any 
  113.      *         recognized emoticons. 
  114.      * 新增ImageSpans一個CharSequence的表情符號代替文字等     *如用圖形版本:-)。 
  115.      * 核心是把表情字元替換成ImageSpans的物件 
  116.      */
  117.     public CharSequence addSmileySpans(CharSequence text) {  
  118.         SpannableStringBuilder builder = new SpannableStringBuilder(text);  
  119.         Matcher matcher = mPattern.matcher(text);  
  120.         while (matcher.find()) {  
  121.             int resId = mSmileyToRes.get(matcher.group());  
  122.             //注意下面的一塊有點不好理解哦 但是是核心
  123.             builder.setSpan(new ImageSpan(mContext, resId), matcher.start(), matcher.end(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);  
  124.         }  
  125.         return builder;  
  126.     }  

總結:

android 在將字元轉化為表情影象其核心程式碼為

  1. builder.setSpan(new ImageSpan(mContext, resId), matcher.start(), matcher.end(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);  

原理過程是先匹配到表情字元然後通過new ImageSpan(上下文,表情地址)繪製出一個ImageView然後替換掉表情字元。

相關推薦

android 簡訊字元表情顯示過程

android 的簡訊實現方式普通使用者適應的話需要長時間的使用才能習慣,將andorid的簡訊模式設定成我們常用的(一般人使用者)的習慣。在檢視字元轉圖片的過程中可以猜測出騰訊的QQ表情的原理應該是一樣的 只是在傳送非常用的表情時是將byte資料轉換為image.

Android 啟動、繪制、顯示過程

使用 launcher exec 布局文件 activity mtr class ati AC Activity 啟動過程: startActivity()-> Instrumentation.execStartActivity()-> Binder->A

android 界面顯示過程分析

2d繪圖 produce play str 開發 rap 消費者 sum 合數 android 系統提供了一系列的繪圖渲染api,這些api支持2D繪圖和3D繪圖;那麽理解這些api是如何工作的,還是十分重要的。應用開發者最常用的就是Canvas和OpenGL,Canva

老羅 Android應用程式資源的查詢過程分析

原文地址  http://blog.csdn.net/luoshengyang/article/details/8806798   轉載請說明     我們知道,在Android系統中,每一個應用程式一般都會配置很多資源,用來適配不同密

Android頁面跳過程中值的傳遞

MainActivity.java部分程式碼 Intent intent = new Intent(MainActivity.this,ScowlViewActivity.class);//實現MainActivity向ScowlViewActivity跳轉 Bundle bundle

Android實現圖片ascii碼字元圖的一些嘗試

z2IN.png 抖音上炫程式碼的不少,有些真的讓人歎為觀止,作為一個androider,當我看到下面這段舞蹈的時候,終於忍不住了,想要通過android實現一樣的效果。 jilejingtu.gif 這麼好玩的東西,為啥就沒有大佬做呢,原因可能有兩個,

android 匹配限定的字元比如表情、中英文、符號

public class FilterUtil { //過濾表情正則表示式 public static final String EMOJI = "[\ud83c\udc00-\ud83

android string.xml 譯、特殊字元問題

在編輯 string.xml 檔案的時候,字元之間的空格用 Space 鍵是能顯示出效果的的,但是字元後面如果需要新增空格,直接 Space 鍵是不管用的,此時 空格應該用 &#160;來表示; 如: <string name="score">Sc

關於base64編碼解碼(Android編碼,JS解碼,案例為解決安卓端H5頁面的emoji表情顯示問題)

1、前言: Base64是網路上最常用的用於傳輸8Bit位元組程式碼的編碼方式之一,比如開發中用於傳遞引數、現代瀏覽器中的<img />標籤直接通過Base64字串來渲染圖片,以及用於郵件中等等。Base64編碼在RFC2045中定義為:Base64內容傳送

android 點選按鈕實現頁面跳顯示以選擇資訊

感覺今天所學的 radio listcheckbox spinner 基礎內容都比較簡單 目前只寫了單選的資訊顯示。checkBox 和 Spinner 還沒實現 原始碼如下 (注意要寫第二個Activity的清單 即新增Activity02的activity標籤)

adt Android studio 字元問題

剛來新公司,竟然有人還在用adt開發,受了adt兩週的罪之後強烈要求轉成as,遇到了一個問題: 1、字元異常問題,應該就是編碼問題,用了notePad++拷過來拷過去,但是並不能解決,最後還是依靠強大

Android studio 獲取手機簡訊內容並輸出顯示

初學Android studio 需要做一個功能,獲取簡訊內容輸出到顯示屏上。 使用Android studio版本:3.2  JDK版本: jdk1.8.0_151   首先在清單檔案新增許可權,獲取簡訊讀寫許可權 <uses-permission an

[修正] Firemonkey Android 文字斜粗體顯示不全的問題

tty height log bounds com tab div nag 技術 問題:Firemonkey Android 平臺顯示斜粗體文字時,文字右方會有顯示不全的問題。 修正代碼: 請將 FMX.FontGlyphs.Android.pas 復制到自己的工程目錄

記錄一次配置http跳https的過程

http https 網站跳轉 公司最近搞了一個數據運營平臺,這個平臺會以web界面的形式把各個數據展示出來,這個項目是我們一個經理的重點關照項目。把平臺模塊部署完畢並且啟動之後,又把這個平臺服務器的外網IP綁定到alkaid.lechange.com這個域名上,在瀏覽器裏輸入https://al

Android TV 選中高亮顯示

add 頁面 androi radi ren att set lose main 1、開發Android TV APP, 使用遙控器選中按鈕或者選著其它菜單 如果沒有高亮顯示,就看不出選中哪個按鈕或者菜單 2、在drawable 添加 border_red.xml 設置選中

-Linux啟動過程詳解(inittab、rc.sysinit、rcX.d、rc.local)

dha mage 模塊 都是 交換 如何配置 mas 完全 打開 http://blog.chinaunix.net/space.php?uid=10167808&do=blog&id=26042 1)BIOS自檢2)啟動Grub/Lilo3)加載內

Android實現在線更新的過程案例

客戶端 cati 重新 2.0 對話框 environ lis exc root 一、更新軟件的準備 在線更新軟件的話需要我們有簽名的應用,我們需要把簽過名之後的軟件放入到服務器中,我的如下: 其中apk是有簽名的更新版本! updateinfo.html代碼如下: {"

Android Studio 第七十九期 - Android 支付寶數字遞增顯示

src ati com change tree 遞增 studio bsp nbsp 代碼已經整理好,效果如下圖: 地址:https://github.com/geeklx/myapplication2018/tree/master/p023_zhif

android 仿微信表情雨下落!

block private www 事件觸發 dog ase 之間 apk ces 文章鏈接:https://mp.weixin.qq.com/s/yQXn-YjEFSW1X7A7CcuaVg 眾所周知,微信聊天中我們輸入一些關鍵詞會有表情雨下落,比如輸入「生日快樂」「

Jpeg圖片顯示過程

技術 idt href src back isp 文件 png bubuko Jpeg圖片顯示過程