android 簡訊字元轉表情顯示過程
android 的簡訊實現方式普通使用者適應的話需要長時間的使用才能習慣,將andorid的簡訊模式設定成我們常用的(一般人使用者)的習慣。在檢視字元轉圖片的過程中可以猜測出騰訊的QQ表情的原理應該是一樣的
只是在傳送非常用的表情時是將byte資料轉換為image.
- /***
- *
- * 此方法描述的是: 注意此方法在做表情轉換的準備了
- * @author:[email protected],[email protected]
- * @version: 2010-5-13 下午03:31:13
-
*/
- privatevoid bindCommonMessage(final MessageItem msgItem) {
- if (mDownloadButton != null) {
- mDownloadButton.setVisibility(View.GONE);
- mDownloadingLabel.setVisibility(View.GONE);
- }
-
// Since the message text should be concatenated with the sender's
- // address(or name), I have to display it here instead of
- // displaying it by the Presenter.
- mBodyTextView.setTransformationMethod(HideReturnsTransformationMethod.getInstance());
- // Get and/or lazily set the formatted message from/on the
-
// MessageItem. Because the MessageItem instances come from a
- // cache (currently of size ~50), the hit rate on avoiding the
- // expensive formatMessage() call is very high.
- CharSequence formattedMessage = msgItem.getCachedFormattedMessage();
- if (formattedMessage == null) { //肯定為null應為msgItem.formattedMessage從誕生來就沒被注意過一次
- formattedMessage = formatMessage(msgItem.mContact, msgItem.mBody, //重點到了
- msgItem.mSubject, msgItem.mTimestamp,
- msgItem.mHighlight);
- msgItem.setCachedFormattedMessage(formattedMessage);
- }
- mBodyTextView.setText(formattedMessage);
- if (msgItem.isSms()) {
- hideMmsViewIfNeeded();
- } else {
- Presenter presenter = PresenterFactory.getPresenter(
- "MmsThumbnailPresenter", mContext,
- this, msgItem.mSlideshow);
- presenter.present();
- if (msgItem.mAttachmentType != WorkingMessage.TEXT) {
- inflateMmsView();
- mMmsView.setVisibility(View.VISIBLE);
- setOnClickListener(msgItem);
- drawPlaybackButton(msgItem);
- } else {
- hideMmsViewIfNeeded();
- }
- }
- drawLeftStatusIndicator(msgItem.mBoxId);
- drawRightStatusIndicator(msgItem);
- }
- //------------------------------------------------------------------------------
- /***
- *
- * 此方法描述的是: 開始轉換了哦
- * @author:[email protected],[email protected]
- * @version: 2010-5-13 下午03:32:52
- */
- private CharSequence formatMessage(String contact, String body, String subject,
- String timestamp, String highlight) {
- CharSequence template = mContext.getResources().getText(R.string.name_colon); //遇到鬼了 <主題:<xliff:g id="SUBJECT">%s</xliff:g>>"
- SpannableStringBuilder buf = //把他當作StringBuffer只是它可以放的不是 String 而已他能放跟多型別的東西
- new SpannableStringBuilder(TextUtils.replace(template,
- new String[] { "%s" },
- new CharSequence[] { contact })); //替換成聯絡人
- boolean hasSubject = !TextUtils.isEmpty(subject); //主題
- if (hasSubject) {
- buf.append(mContext.getResources().getString(R.string.inline_subject, subject)); //buff先在是 聯絡人 主題 XXXX eg wuyi <主題:dsadasdsa> 我愛我家
- }
- if (!TextUtils.isEmpty(body)) {
- if (hasSubject) {
- buf.append(" - "); //如果內容有主題有就+ " - " eg wuyi <主題:sdsadsadsa> -
- }
- SmileyParser parser = SmileyParser.getInstance(); //獲得表情類了哦
- buf.append(parser.addSmileySpans(body)); //追查 急切關注中
- }
- if (!TextUtils.isEmpty(timestamp)) {
- buf.append("\n");
- int startOffset = buf.length();
- // put a one pixel high spacer line between the message and the time stamp as requested
- // by the spec.
- //把之間的資訊和時間戳的要求間隔一個畫素的高線
- //由規範
- buf.append("\n");
- buf.setSpan(new AbsoluteSizeSpan(3), startOffset, buf.length(),
- Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
- startOffset = buf.length();
- buf.append(timestamp);
- buf.setSpan(new AbsoluteSizeSpan(12), startOffset, buf.length(),
- Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
- // Make the timestamp text not as dark 改變某區域顏色 時間的地方為特殊顏色
- int color = mContext.getResources().getColor(R.color.timestamp_color);
- buf.setSpan(new ForegroundColorSpan(color), startOffset, buf.length(),
- Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
- }
- if (highlight != null) {
- int highlightLen = highlight.length();
- String s = buf.toString().toLowerCase();
- int prev = 0;
- while (true) {
- int index = s.indexOf(highlight, prev);
- if (index == -1) {
- break;
- }
- buf.setSpan(new StyleSpan(Typeface.BOLD), index, index + highlightLen, 0);
- prev = index + highlightLen;
- }
- }
- return buf;
- }
- //------------------------------------------------------------
- /**
- * Adds ImageSpans to a CharSequence that replace textual emoticons such
- * as :-) with a graphical version.
- *
- * @param text A CharSequence possibly containing emoticons
- * @return A CharSequence annotated with ImageSpans covering any
- * recognized emoticons.
- * 新增ImageSpans一個CharSequence的表情符號代替文字等 *如用圖形版本:-)。
- * 核心是把表情字元替換成ImageSpans的物件
- */
- public CharSequence addSmileySpans(CharSequence text) {
- SpannableStringBuilder builder = new SpannableStringBuilder(text);
- Matcher matcher = mPattern.matcher(text);
- while (matcher.find()) {
- int resId = mSmileyToRes.get(matcher.group());
- //注意下面的一塊有點不好理解哦 但是是核心
- builder.setSpan(new ImageSpan(mContext, resId), matcher.start(), matcher.end(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
- }
- return builder;
- }
總結:
android 在將字元轉化為表情影象其核心程式碼為
- 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 鍵是不管用的,此時 空格應該用  來表示; 如: <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圖片顯示過程