转载:http://my.oschina.net/javagg/blog/27834
一、[Android实例]实现TextView里的文字有不同颜色
转eoe:http://www.eoeandroid.com/thread-4496-1-1.html
import android.text.Html;
TextView t3 = (TextView) findViewById(R.id.text3);
t3.setText(
Html.fromHtml(
"<b>text3:</b> Text with a " +
"<a href=\"http://www.google.com\">link</a> " +
"created in the Java source code using HTML."));
二、TextView显示html文件中的图片
转javaeye:http://da-en.javaeye.com/blog/712415
我们知道要让TextView解析和显示Html代码。可以使用
Spanned text = Html.fromHtml(source);
tv.setText(text);
来实现,这个用起来简单方便。
但是,怎样让TextView也显示Html中<image>节点的图像呢?
我们可以看到fromHtml还有另一个重构:
fromHtml(String source, Html.ImageGetter imageGetter, Html.TagHandler tagHandler)
实现一下ImageGetter就可以让图片显示了:
ImageGetter imgGetter = new Html.ImageGetter() {
@Override
public Drawable getDrawable(String source) {
Drawable drawable = null;
drawable = Drawable.createFromPath(source); // Or fetch it from the URL
// Important
drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable
.getIntrinsicHeight());
return drawable;
}
};
至于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目录下的图片:
ImageGetter imageGetter = new ImageGetter() {
@Override
public Drawable getDrawable(String source) {
int id = Integer.parseInt(source);
//根据id从资源文件中获取图片对象
Drawable d = getResources().getDrawable(id);
d.setBounds(0, 0, d.getIntrinsicWidth(),d.getIntrinsicHeight());
return d;
}
};
然后就可以直接往EditText视图中添加
inputLable.append(Html.fromHtml("<img src='"+clickedImageId+"'/>", imageGetter, null));
其中 Html.fromHtml("<img src='"+clickedImageId+"'/>"就是HTML的图片标记,在Android中支持了部分HTML标记的使用(这方面我还在继续研究),HTML标记必须被Html.fromHtml修饰。imageGetter即为之前创建的ImageGetter类型的对象。
很简单的几句代码就解决了问题,不仅在EditText中,在TextView中同样可以这样插入图片。
效果图:
![](https://i-blog.csdnimg.cn/blog_migrate/d88eb2392c3f8d01f675d991ff7a1f09.png)
android 的短信实现方式普通用户适应的话需要长时间的使用才能习惯,将andorid的短信模式设置成我们常用的(一般人用户)的习惯。在查看字符转图片的过程中可以猜测出腾讯的QQ表情的原理应该是一样的只是在传送非常用的表情时是将
byte数据转换为
image.
以下代码摘录至android源码里面的MMS项目,其中的
001 | package com.android.mms.ui 里的 MessageListItem.java |
002 | package com.android.mms.util 里的 SmileyParser.java |
005 | * 此方法描述的是: 注意此方法在做表情转换的准备了 |
006 | * @author:wujun@cqghong.com,ppwuyi@sohu.com |
007 | * @version: 2010-5-13 下午03:31:13 |
009 | private void bindCommonMessage( final MessageItem msgItem) { |
010 | if (mDownloadButton != null ) { |
011 | mDownloadButton.setVisibility(View.GONE); |
012 | mDownloadingLabel.setVisibility(View.GONE); |
017 | mBodyTextView.setTransformationMethod(HideReturnsTransformationMethod.getInstance()); |
022 | CharSequence formattedMessage = msgItem.getCachedFormattedMessage(); |
023 | if (formattedMessage == null ) { |
024 | formattedMessage = formatMessage(msgItem.mContact, msgItem.mBody, |
025 | msgItem.mSubject, msgItem.mTimestamp, |
027 | msgItem.setCachedFormattedMessage(formattedMessage); |
029 | mBodyTextView.setText(formattedMessage); |
030 | if (msgItem.isSms()) { |
031 | hideMmsViewIfNeeded(); |
033 | Presenter presenter = PresenterFactory.getPresenter( |
034 | "MmsThumbnailPresenter" , mContext, |
035 | this , msgItem.mSlideshow); |
037 | if (msgItem.mAttachmentType != WorkingMessage.TEXT) { |
039 | mMmsView.setVisibility(View.VISIBLE); |
040 | setOnClickListener(msgItem); |
041 | drawPlaybackButton(msgItem); |
043 | hideMmsViewIfNeeded(); |
046 | drawLeftStatusIndicator(msgItem.mBoxId); |
047 | drawRightStatusIndicator(msgItem); |
053 | * @author:wujun@cqghong.com,ppwuyi@sohu.com |
054 | * @version: 2010-5-13 下午03:32:52 |
056 | private CharSequence formatMessage(String contact, String body, String subject, |
057 | String timestamp, String highlight) { |
058 | CharSequence template = mContext.getResources().getText(R.string.name_colon); |
059 | SpannableStringBuilder buf = |
060 | new SpannableStringBuilder(TextUtils.replace(template, |
061 | new String[] { "%s" }, |
062 | new CharSequence[] { contact })); |
063 | boolean hasSubject = !TextUtils.isEmpty(subject); |
065 | buf.append(mContext.getResources().getString(R.string.inline_subject, subject)); |
067 | if (!TextUtils.isEmpty(body)) { |
071 | SmileyParser parser = SmileyParser.getInstance(); |
072 | buf.append(parser.addSmileySpans(body)); |
074 | if (!TextUtils.isEmpty(timestamp)) { |
076 | int startOffset = buf.length(); |
082 | buf.setSpan( new AbsoluteSizeSpan( 3 ), startOffset, buf.length(), |
083 | Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); |
084 | startOffset = buf.length(); |
085 | buf.append(timestamp); |
086 | buf.setSpan( new AbsoluteSizeSpan( 12 ), startOffset, buf.length(), |
087 | Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); |
089 | int color = mContext.getResources().getColor(R.color.timestamp_color); |
090 | buf.setSpan( new ForegroundColorSpan(color), startOffset, buf.length(), |
091 | Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); |
093 | if (highlight != null ) { |
094 | int highlightLen = highlight.length(); |
095 | String s = buf.toString().toLowerCase(); |
098 | int index = s.indexOf(highlight, prev); |
102 | buf.setSpan( new StyleSpan(Typeface.BOLD), index, index + highlightLen, 0 ); |
103 | prev = index + highlightLen; |
110 | * Adds ImageSpans to a CharSequence that replace textual emoticons such |
111 | * as :-) with a graphical version. |
113 | * @param text A CharSequence possibly containing emoticons |
114 | * @return A CharSequence annotated with ImageSpans covering any |
115 | * recognized emoticons. |
116 | * 添加ImageSpans一个CharSequence的表情符号代替文字等 *如用图形版本:-)。 |
117 | * 核心是把表情字符替换成ImageSpans的对象 |
119 | public CharSequence addSmileySpans(CharSequence text) { |
120 | SpannableStringBuilder builder = new SpannableStringBuilder(text); |
121 | Matcher matcher = mPattern.matcher(text); |
122 | while (matcher.find()) { |
123 | int resId = mSmileyToRes.get(matcher.group()); |
125 | builder.setSpan( new ImageSpan(mContext, resId), matcher.start(), matcher.end(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); |
总结:
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>