`
z303729470
  • 浏览: 134062 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

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

 
阅读更多
转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中同样可以这样插入图片。

效果图:

[img]

[/img]

四、android 短信字符转表情显示过程
android 的短信实现方式普通用户适应的话需要长时间的使用才能习惯,将andorid的短信模式设置成我们常用的(一般人用户)的习惯。在查看字符转图片的过程中可以猜测出腾讯的QQ表情的原理应该是一样的只是在传送非常用的表情时是将byte数据转换为image.
以下代码摘录至android源码里面的MMS项目,其中的

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

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

/***
     *
         * 此方法描述的是:   注意此方法在做表情转换的准备了
         * @author:wujun@cqghong.com,ppwuyi@sohu.com
         * @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然后替换掉表情字符。




五、 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>
  • 大小: 20.5 KB
分享到:
评论

相关推荐

    TextView超链接自定义样式

    本篇将详细讲解如何在Android的`TextView`中实现超链接自定义样式,包括自定义字体颜色和去除超链接的下划线。 首先,让我们了解一下`TextView`中的`Links`。默认情况下,`TextView`会识别文本中的URL并自动将其...

    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自定义字体,风格,超链接等效果

    本文将详细讲解如何通过编程实现TextView的字体、颜色、行距、样式、独立样式、内部超链接以及与图片共存的效果。 首先,让我们关注字体的设置。在Android中,可以通过`setTypeface()`方法来改变TextView的字体。这...

    android textview 文字排版 换行

    5. **富文本显示**:`SpannableString`和`Spanned`允许在文本中插入样式,如颜色、字体大小、下划线等。 6. **动态加载长文本**:对于大量文本,可以使用`TextView`的`append()`方法动态加载,以避免一次性加载过多...

    Android 使用SpannableString在TextView中插入表情、超链接、文字变大、加粗Demo下载

    在Android开发中,文本展示是常见的需求之一,而TextView作为主要的文本展示控件,有时候我们需要在其中实现更丰富的展示效果,比如插入表情、添加超链接、改变文字大小和加粗等。本教程将深入讲解如何利用...

    TextView上超链接可以点击.zip

    在Android开发中,TextView是用于显示文本的基本组件。在许多应用中,我们可能需要在TextView中展示带有超链接的文本,比如帮助文档、用户协议等。`TextView`默认并不支持直接点击超链接,但通过一些技巧,我们可以...

    Android TextView 控件例子

    TextView可以显示超链接,只需在文本中使用HTML标签或使用`Linkify`类。例如: ```xml &lt;TextView android:autoLink="web" android:text="Visit &lt;a href="https://www.example.com"&gt;example.com&lt;/a&gt;" /&gt; ``` ...

    TextView_HTML

    当需要在`TextView`中处理字体样式、显示图片以及添加超链接时,我们可以利用`TextView`对HTML的支持来实现这些功能。本文将深入探讨如何在`TextView`中使用HTML以及相关源码分析。 1. **HTML支持** Android的`...

    TextView富文本显示

    除了这些基本标签,还可以使用CSS样式来控制文本的样式,但需要注意,不是所有的CSS属性都支持,如`margin`、`padding`等布局相关的属性无效。 为了使HTML标签效果生效,需要确保`TextView`的`android:...

    android TextView文字效果

    - 另外,可以使用XML属性`android:textSize`来静态定义字体大小,如`android:textSize="16sp"`,其中sp(scaled pixel)单位考虑了用户的字体缩放设置。 2. **文字粗细**: - 通过设置`setTypeface()`方法,我们...

    Android TextView

    在Android开发中,TextView是一个非常基础且重要的组件,它用于显示单行或多行文本。TextView在用户界面设计中扮演着信息展示的角色,可以是应用程序的标题、内容描述或者是按钮上的文字。下面我们将深入探讨Android...

    Android SpannableString设置超链接、颜色、字体等属性

    Android SpannableString设置超链接、颜色、字体等属性 在Android中,TextView是我们最常用的用来显示文本的控件。  一般情况下,TextView中的文本都是一个样式。那么如何对于TextView中各个部分的文本来设置字体...

    Android中TextView自动识别url且实现点击跳转

    AttributedString是iOS中的一种特殊字符串,可以用来设置文本的样式,包括颜色、字体大小、字体样式等。 4.自定义TextView的使用 我们可以通过继承UITextView来创建自定义的TextView,以便实现特定的功能。 5....

    android:TextView简单设置文本样式和超链接的方法

    除了颜色和字体样式外,TextView还支持其他样式,如字体大小、行间距、对齐方式等。例如,通过`setTextSize()`设置字体大小,通过`setGravity()`设置文本对齐方式: ```java myFirstTextView.setTextSize...

    Android TextView使用SpannableString设置复合文本的方法详解

    在Android开发中,TextView是用于显示文本的基本组件。然而,有时我们需要对文本进行更复杂的样式化,例如设置特定部分的背景色、添加点击事件、改变颜色等。这时,我们可以使用SpannableString类来实现这些需求。...

    可以显示富文本的TextView.zip

    这些方法可能用于处理如自定义样式、图片加载、点击事件监听等特殊情况,让开发者能更灵活地控制文本的显示效果和交互行为。 5. **应用场景**: - **新闻展示**:新闻内容往往包含标题、摘要、正文等部分,且格式...

    TextView超链接启动Activity,无下划线,可自定义颜色

    在Android开发中,TextView是用于显示文本的基本组件。在许多应用中,我们可能需要将TextView中的部分文字设置为超链接,以便用户点击后可以跳转到其他Activity或网页。本教程将详细介绍如何实现一个没有下划线且...

Global site tag (gtag.js) - Google Analytics