`
hyongbai
  • 浏览: 15287 次
文章分类
社区版块
存档分类
最新评论

android TextView Html格式 一起显示 图片 文字

 
阅读更多

一、[Android实例]实现TextView里的文字有不同颜色

转eoe:http://www.e<wbr>oeandroid.co<wbr>m/thread-449<wbr>6-1-1.html</wbr></wbr></wbr>

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<wbr>.javaeye.com<wbr>/blog/712415</wbr></wbr>

我们知道要让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-<wbr>droid.blogsp<wbr>ot.com/2010/<wbr>06/textview-<wbr>with-html-co<wbr>ntent.html</wbr></wbr></wbr></wbr></wbr>英语好的朋友就直接看英文文档吧。

三、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中同样可以这样插入图片。

效果图:

在此感谢网上共享资料和经验的朋友们,虽然是比较簡単的功能,但网上的文献对我的帮助还是有很大的。

android的短信实现方式普通用户适应的话需要长时间的使用才能习惯,将andorid的短信模式设置成我们常用的(一般人用户)的习惯。在查看字符转图片的过程中可以猜测出腾讯的QQ表情的原理应该是一样的

只是在传送非常用的表情时是将byte数据转换为image.

转载请注明:QQ:273733055ppwuyi@sohu.com

/***
*
*
此方法描述的是:注意此方法在做表情转换的准备了
* @author:wujun@cqghon<wbr>g.com</wbr>,ppwuyi@sohu.<wbr>com</wbr>
* @version: 2010-5-13
下午03:31:13
*/
private void 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:wujun@cqghong.com,ppwuyi@sohu.com
* @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); //
遇到鬼了 &lt;主题:<xliff:g id="SUBJECT">%s</xliff:g>&gt;"
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然后替换掉表情字符。

五、文档

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

Since: API Level 1

Returns displayable styled text from the provided HTML string. Any <img> tags in the HTML will use the specified ImageGetter to request a representation of the image (use null if you don't want this) and the specified TagHandler to handle unknown tags (specify null if you don't want this).

This uses TagSoup to handle real HTML, including all of the brokenness found in the wild.

分享到:
评论

相关推荐

    Android textview 文字中间加上图片

    总结,Android中的TextView不仅可以显示纯文本,还可以通过HTML、SpannableString或SpannableStringBuilder等方式插入图片,实现文字与图片的混合显示。需要注意的是,处理好图片的大小、位置以及与文字的关系,以...

    Android TextView加载Html中文字、图片

    本文将深入探讨如何在Android的TextView中正确加载包含文字和图片的HTML内容,并解决图片显示为小方块的常见问题。 首先,我们要了解Android中的TextView默认并不支持HTML解析和渲染。为了使TextView能够处理HTML,...

    Android-TextView-富文本-html图片显示.rar

    针对这种情况,Android 提供了支持富文本(Rich Text)的功能,允许在 `TextView` 中渲染 HTML 格式的内容,包括文字、图片、链接等。本教程将详细介绍如何在 `TextView` 中使用 HTML 片段来实现文字和图片的混排,...

    Android的TextView中显示图片和图像的方法

    本文将详细介绍如何在Android的TextView中显示图片和图像。 首先,我们要理解Android系统提供的一些基本资源类型,包括Drawable资源,这是用来表示图像的主要方式。在Android工程中,图片通常存储在res/drawable...

    android Textview显示带html文本、图片

    2. **图片显示** 要在HTML文本中插入图片,可以使用`&lt;img&gt;`标签,但是`Html.fromHtml()`不支持加载网络图片。对于这种情况,可以使用第三方库,如`androidx.core.text.HtmlCompat`,它提供了更广泛的HTML标签支持,...

    Android的TextView使用Html来处理图片显示、字体样式、超链接等

    实现一下ImageGetter就可以让图片显示了: ImageGetter imgGetter = new Html.ImageGetter() { @Override public Drawable getDrawable(String source) { Drawable drawable = null; drawable = Drawable....

    安卓textView相关-android文字图片混排在一个TextView中显示文字穿插图片文字变色效果.rar

    TextView可以接受简单的HTML格式文本,通过`Html.fromHtml()`方法,我们可以将HTML字符串转换为Spanned对象,从而在TextView中显示富文本。例如,我们可以通过`&lt;img&gt;`标签插入图片,使用`&lt;font&gt;`标签改变文字颜色。 ...

    Android TextView实现垂直滚动效果的方法

    最后,对于更复杂的文本展示需求,比如HTML格式的文本或者包含图片,可以使用`WebView`代替`TextView`,因为`WebView`支持渲染HTML内容,同时也可以实现滚动效果。 总的来说,通过XML布局和适当的Java代码,开发者...

    android TextView 支持CSS样式

    在Android中,可以使用`Html.fromHtml()`方法将HTML字符串转换为可以在`TextView`中显示的格式。例如: ```java String html = "&lt;b&gt;Hello, World!&lt;/b&gt;"; TextView tv = (TextView) findViewById(R.id.text_view)...

    android textview图文混排

    在Android开发中,TextView是用于显示纯文本的基本组件,但有时候我们希望在文本中插入图片,实现图文混排的效果,让界面更加生动和丰富。本文将深入探讨如何在TextView中实现这一功能,主要使用Android内置的`Html`...

    android 可动态显示gif的TextView

    这是参考别人的显示gif的textview而写出来的,可同时显示gif和png还有文字,类似于QQ聊天时输入动态表情, 不足的是,由于各gif的频率不一致,在输入多个不同gif时,有些gif可能看起来会慢一些 参考:...

    题库类App中比较头疼的公式问题,TextView加载Html,图文混排,Svg图片加载

    1. **TextView加载Html**:在Android中,TextView通常用于显示纯文本,但通过加载Html,我们可以让TextView支持富文本格式,包括内嵌图片、链接、颜色等。使用`Html.fromHtml()`方法可以将Html字符串转换为Spanned...

    Android TextView 换行不对齐的问题

    然而,有时开发者会遇到一个棘手的问题,即`TextView`中的换行文字可能不会对齐,尤其是在多行显示时。这个问题通常表现为每一行的起始位置不一致,影响了整体布局的美观度。本文将深入探讨这个问题及其解决方案。 ...

    TextView加载html 图文混排 处理图片变形 图片点击缩放

    html文件常常是含有图片,如果需要在Textview中实现文字和图片的混排,需要使用ImageGetter。ImageGetter是Html类中一个接口,作用是给img标签获取图片内容,主要提供了一个getDrawable的方法。但很多情况下,需要...

    Android中TextView的常用效果实现

    在Android的TextView中,我们可以使用`Html.fromHtml()`方法将HTML格式的字符串转化为可显示的文本。例如,你可以设置字体颜色、大小、加粗、斜体等样式。以下是一个简单的示例: ```java String ...

    Android textView应用简单示例.zip

    在Android开发中,TextView是用于显示文本的基本组件,它在用户界面中扮演着重要的角色,不仅可以展示纯文本,还能处理格式化文本、链接、样式等。这个"Android textView应用简单示例.zip"压缩包提供了对TextView...

    Android中TextView显示插入的图片实现方法

    本文实例讲述了Android中TextView显示插入的图片实现方法。分享给大家供大家参考,具体如下: Android系统默认给TextView插入图片提供了三种方式: 1、ImageSpan 2、Html.ImageGetter 3、TextView....

    Android-一个利用RxJava在TextView和EditText上渲染的markdown解析器

    在Android应用开发中,尤其是在需要编辑或显示带有格式的文本时,Markdown解析器就显得尤为重要。本项目是一个专门针对Android平台的Markdown解析器,它利用了RxJava库来实现在TextView和EditText上的渲染功能。 ...

Global site tag (gtag.js) - Google Analytics