TextView使用Html來處理圖片顯示、字體樣式、超鏈接等

一、[Android實例]實現TextView裏的文字有不同顏色

轉eoe:http://www.eoeandroid.com/thread-4496-1-1.html

1importandroid.text.Html;

2

3TextView t3 = (TextView) findViewById(R.id.text3);

4t3.setText(

5Html.fromHtml(

6"<b>text3:</b>  Text with a "+

7"<a href=\"http://www.google.com\">link</a> "+

8"created in the Java source code using HTML."));


二、TextView顯示html文件中的圖片

轉javaeye:http://da-en.javaeye.com/blog/712415

我們知道要讓TextView解析和顯示Html代碼。可以使用

1Spanned text = Html.fromHtml(source);

2tv.setText(text);


來實現,這個用起來簡單方便。

但是,怎樣讓TextView也顯示Html中<image>節點的圖像呢?


我們可以看到fromHtml還有另一個重構:

fromHtml(String source, Html.ImageGetter imageGetter, Html.TagHandler tagHandler)


實現一下ImageGetter就可以讓圖片顯示了:

01ImageGetter imgGetter = newHtml.ImageGetter() {

02@Override

03publicDrawable getDrawable(String source) {

04Drawable drawable = null;

05drawable = Drawable.createFromPath(source);  // Or fetch it from the URL

06// Important

07drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable

08.getIntrinsicHeight());

09returndrawable;

10}

11};


至於TagHandler,我們這裏不需要使用,可以直接傳null。

參考文檔:

http://tech-droid.blogspot.com/2010/06/textview-with-html-content.html英語好的朋友就直接看英文文檔吧。

三、Android---文字中插入表情

轉載自:http://blog.163.com/spf9190@126/blog/static/50207531201091545954587/

這段時間在做一個短信項目,需要實現短信中插入表情的功能,本一位非常困難,經過一段時間的研究,發現還是比較簡単的,現在總結如下。

以短信輸入框爲例,短信的輸入框是一個EditText,它的append方法不僅可以加入字符串,還可以添加HTML標記。以下就是使用HTML標記添加表情的具體操作。

  首先需要構建一個ImageGetter,作用是通過HTML標記獲得對應在res目錄下的圖片:

01ImageGetter imageGetter = newImageGetter() {

02@Override

03publicDrawable getDrawable(String source) {

04intid = Integer.parseInt(source);

05

06//根據id從資源文件中獲取圖片對象

07Drawable d = getResources().getDrawable(id);

08d.setBounds(0, 0, d.getIntrinsicWidth(),d.getIntrinsicHeight());

09returnd;

10}

11};


然後就可以直接往EditText視圖中添加

1inputLable.append(Html.fromHtml("<img src='"+clickedImageId+"'/>", imageGetter, null));


其中 Html.fromHtml("<img src='"+clickedImageId+"'/>"就是HTML的圖片標記,在Android中支持了部分HTML標記的使用(這方面我還在繼續研究),HTML標記必須被Html.fromHtml修飾。imageGetter即爲之前創建的ImageGetter類型的對象。

很簡單的幾句代碼就解決了問題,不僅在EditText中,在TextView中同樣可以這樣插入圖片。

效果圖:


四、android 短信字符轉表情顯示過程

android 的短信實現方式普通用戶適應的話需要長時間的使用才能習慣,將andorid的短信模式設置成我們常用的(一般人用戶)的習慣。在查看字符轉圖片的過程中可以猜測出騰訊的QQ表情的原理應該是一樣的只是在傳送非常用的表情時是將 byte數據轉換爲 image.

以下代碼摘錄至android源碼裏面的MMS項目,其中的

package com.android.mms.ui 裏的 MessageListItem.java

package com.android.mms.util 裏的 SmileyParser.java

001/***

002*

003* 此方法描述的是:   注意此方法在做表情轉換的準備了

004* @author:[email protected],[email protected]

005* @version: 2010-5-13 下午03:31:13

006*/

007privatevoidbindCommonMessage(finalMessageItem msgItem) {

008if(mDownloadButton != null) {

009mDownloadButton.setVisibility(View.GONE);

010mDownloadingLabel.setVisibility(View.GONE);

011}

012// Since the message text should be concatenated with the sender's

013// address(or name), I have to display it here instead of

014// displaying it by the Presenter.

015mBodyTextView.setTransformationMethod(HideReturnsTransformationMethod.getInstance());

016

017// Get and/or lazily set the formatted message from/on the

018// MessageItem. Because the MessageItem instances come from a

019// cache (currently of size ~50), the hit rate on avoiding the

020// expensive formatMessage() call is very high.

021CharSequence formattedMessage = msgItem.getCachedFormattedMessage();

022if(formattedMessage == null) { //肯定爲null應爲msgItem.formattedMessage從誕生來就沒被注意過一次

023formattedMessage = formatMessage(msgItem.mContact, msgItem.mBody,   //重點到了

024msgItem.mSubject, msgItem.mTimestamp,

025msgItem.mHighlight);

026msgItem.setCachedFormattedMessage(formattedMessage);

027}

028mBodyTextView.setText(formattedMessage);

029

030if(msgItem.isSms()) {

031hideMmsViewIfNeeded();

032} else{

033Presenter presenter = PresenterFactory.getPresenter(

034"MmsThumbnailPresenter", mContext,

035this, msgItem.mSlideshow);

036presenter.present();

037

038if(msgItem.mAttachmentType != WorkingMessage.TEXT) {

039inflateMmsView();

040mMmsView.setVisibility(View.VISIBLE);

041setOnClickListener(msgItem);

042drawPlaybackButton(msgItem);

043} else{

044hideMmsViewIfNeeded();

045}

046}

047

048drawLeftStatusIndicator(msgItem.mBoxId);

049drawRightStatusIndicator(msgItem);

050}

051//------------------------------------------------------------------------------

052

053/***

054*

055* 此方法描述的是:   開始轉換了哦

056* @author:[email protected],[email protected]

057* @version: 2010-5-13 下午03:32:52

058*/

059privateCharSequence formatMessage(String contact, String body, String subject,

060String timestamp, String highlight) {

061CharSequence template = mContext.getResources().getText(R.string.name_colon); //遇到鬼了     &lt;主題:<xliff:g id="SUBJECT">%s</xliff:g>&gt;"

062SpannableStringBuilder buf =                   //把他當作StringBuffer只是它可以放的不是 String 而已他能放跟多類型的東西

063newSpannableStringBuilder(TextUtils.replace(template,

064newString[] { "%s"},

065newCharSequence[] { contact })); //替換成聯繫人

066

067booleanhasSubject = !TextUtils.isEmpty(subject); //主題

068if(hasSubject) {

069buf.append(mContext.getResources().getString(R.string.inline_subject, subject)); //buff先在是 聯繫人 主題 XXXX      eg wuyi <主題:dsadasdsa> 我愛我家

070}

071

072if(!TextUtils.isEmpty(body)) {

073if(hasSubject) {

074buf.append(" - "); //如果內容有主題有就+ " - "    eg wuyi <主題:sdsadsadsa> -

075}

076SmileyParser parser = SmileyParser.getInstance(); //獲得表情類了哦

077buf.append(parser.addSmileySpans(body)); //追查 急切關注中

078}

079if(!TextUtils.isEmpty(timestamp)) {

080buf.append("\n");

081intstartOffset = buf.length();

082

083// put a one pixel high spacer line between the message and the time stamp as requested

084// by the spec.

085//把之間的信息和時間戳的要求間隔一個像素的高線

086//由規範

087buf.append("\n");

088buf.setSpan(newAbsoluteSizeSpan(3), startOffset, buf.length(),

089Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);

090

091startOffset = buf.length();

092buf.append(timestamp);

093buf.setSpan(newAbsoluteSizeSpan(12), startOffset, buf.length(),

094Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);

095// Make the timestamp text not as dark 改變某區域顏色   時間的地方爲特殊顏色

096intcolor = mContext.getResources().getColor(R.color.timestamp_color);

097buf.setSpan(newForegroundColorSpan(color), startOffset, buf.length(),

098Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);

099}

100if(highlight != null) {

101inthighlightLen = highlight.length();

102

103String s = buf.toString().toLowerCase();

104intprev = 0;

105while(true) {

106intindex = s.indexOf(highlight, prev);

107if(index == -1) {

108break;

109}

110buf.setSpan(newStyleSpan(Typeface.BOLD), index, index + highlightLen,0);

111prev = index + highlightLen;

112}

113}

114returnbuf;

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*/

129publicCharSequence addSmileySpans(CharSequence text) {

130SpannableStringBuilder builder = newSpannableStringBuilder(text);

131

132Matcher matcher = mPattern.matcher(text);

133while(matcher.find()) {

134intresId = mSmileyToRes.get(matcher.group());

135//注意下面的一塊有點不好理解哦但是是核心

136builder.setSpan(newImageSpan(mContext, resId), matcher.start(), matcher.end(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);

137}

138

139returnbuilder;

140}




總結:


    android 在將字符轉化爲表情圖像其核心代碼爲

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

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


五、

Android TextView 支持的HTML標籤

<a href="...">

<b>

<big>

<blockquote>

<br>

<cite>

<dfn>

<div align="...">

<em>

<font size="..." color="..." face="...">

<h1>

<h2>

<h3>

<h4>

<h5>

<h6>

<i>

<img src="...">

<p>

<small>

<strike>

<strong>

<sub>

<sup>

<tt>

<u>

原文出處:http://www.cnblogs.com/playing/archive/2011/03/17/1987033.html


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章