在Android开发过程中,我们有时会需要TextView 显示各种格式的文本,包括字体颜色,大小,下划线,表情符号等等。对于这种需求,我们应该如何实现呢?答案是:SpannableString
我们可以通过SpannableString来实现各种格式的文本。它的使用非常简单,这里不多介绍了。直接看代码会更加的直观。

效果

我们先来看一下运行的效果。

代码如下

activity_main.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"tools:context="com.nxiangbo.spansdemo.MainActivity" ><TextView
        android:id="@+id/tv_content"android:layout_width="wrap_content"android:layout_height="wrap_content"android:padding="5dp"android:text="@string/content"/></RelativeLayout>

MainActivity.java

public class MainActivity extends Activity {private static final String TAG = "MainActivity";private TextView mText;private SpannableString mSpannableString;private String mContent;private static final String itallic = "三月七日沙湖道中遇雨。雨具先去,同行皆狼狈,余独不觉。已而遂晴,故作此 ";private static final String bold = "谁怕? 一蓑烟雨任平生";private static final String underline = "莫听穿林打叶声";private static final String subscript = "徐行";private static final String superscript = "轻胜马";private static final String backgroundCorlor = "料峭春风吹酒醒";private static final String foregroundColor = "微冷";private static final String relativeSize = "山头";private static final String maskFilter = "却相迎";private static final String scaleX = "回首";private static final String strikeThrough = "萧瑟处";private static final String blurMaskFilter = "归去";private static final String image = "苏轼";private static final String quote = "人间不可无一,难能有二";@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);mText = (TextView) findViewById(R.id.tv_content);mContent = getResources().getString(R.string.content);mSpannableString = new SpannableString(mContent);Log.e(TAG, mContent.length()+"mContent.length");setItallic(itallic);setBold(bold);setUnderLine(underline);setSubscript(subscript);setSuperscript(superscript);setBackgroundColor(backgroundCorlor);setForegroundColor(foregroundColor);setRelativeSize(relativeSize);setMaskFilter(maskFilter);setScaleX(scaleX);setStrikeThrough(strikeThrough);setBlurMaskFilter(blurMaskFilter);setImage(image);setQuote(quote);mText.setText(mSpannableString);}//将"苏轼"替换成一张图片@SuppressLint("NewApi")private void setImage(String text) {Object span = null;span = new ImageSpan(this,R.drawable.demo);WordPosition position = getWordPosition(text);int textStart = position.start;int textEnd = position.end;mSpannableString.setSpan(span, textStart, textEnd, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);}//将字体设置为模糊效果private void setBlurMaskFilter(String text) {Object span = null;span = new MaskFilterSpan(new BlurMaskFilter(5, BlurMaskFilter.Blur.OUTER));WordPosition position = getWordPosition(text);int textStart = position.start;int textEnd = position.end;mSpannableString.setSpan(span, textStart, textEnd, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);}//设置删除线private void setStrikeThrough(String text) {Object span = null;span = new StrikethroughSpan();WordPosition position = getWordPosition(text);int textStart = position.start;int textEnd = position.end;mSpannableString.setSpan(span, textStart, textEnd, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);}//设置字体在水平方向上放大两倍private void setScaleX(String text) {Object span = null;span = new ScaleXSpan(2.0f);WordPosition position = getWordPosition(text);int textStart = position.start;int textEnd = position.end;mSpannableString.setSpan(span, textStart, textEnd, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);}//设置字体为浮雕形式的private void setMaskFilter(String text) {Object span = null;span = new MaskFilterSpan(new EmbossMaskFilter(new float[] { 1, 5, 1 }, 0.4f, 6, 3.5f));WordPosition position = getWordPosition(text);int textStart = position.start;int textEnd = position.end;ForegroundColorSpan fg = new ForegroundColorSpan(Color.RED);StyleSpan style = new StyleSpan(android.graphics.Typeface.BOLD);mSpannableString.setSpan(fg, textStart, textEnd, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);mSpannableString.setSpan(style, textStart, textEnd, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);mSpannableString.setSpan(span, textStart, textEnd, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);}//设置字体大小的原来大两倍private void setRelativeSize(String text) {Object span = null;span = new RelativeSizeSpan(2.0f);WordPosition position = getWordPosition(text);int textStart = position.start;int textEnd = position.end;mSpannableString.setSpan(span, textStart, textEnd, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);}//设置前景颜色private void setForegroundColor(String text) {Object span = null;span = new ForegroundColorSpan(Color.BLUE);WordPosition position = getWordPosition(text);int textStart = position.start;int textEnd = position.end;mSpannableString.setSpan(span, textStart, textEnd, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);}//设置背景颜色private void setBackgroundColor(String text) {Object span = null;span = new BackgroundColorSpan(Color.YELLOW);WordPosition position = getWordPosition(text);int textStart = position.start;int textEnd = position.end;mSpannableString.setSpan(span, textStart, textEnd, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);}//设置黑体private void setBold(String text){Object span = null;span = new StyleSpan(android.graphics.Typeface.BOLD);WordPosition position = getWordPosition(text);int textStart = position.start;int textEnd = position.end;mSpannableString.setSpan(span, textStart, textEnd, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);}//设置斜体private void setItallic(String text){Object span = null;span = new StyleSpan(android.graphics.Typeface.ITALIC);WordPosition position = getWordPosition(text);int textStart = position.start;int textEnd = position.end;mSpannableString.setSpan(span, textStart, textEnd, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);}//设置引用private void setQuote(String text){Object span = null;span = new CustomQuoteSpan(Color.BLUE);WordPosition position = getWordPosition(text);int textStart = position.start;int textEnd = position.end;mSpannableString.setSpan(span, textStart, textEnd, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);}//设置下划线private void setUnderLine(String text){Object span = new UnderlineSpan();WordPosition position = getWordPosition(text);int textStart = position.start;int textEnd = position.end;mSpannableString.setSpan(span, textStart, textEnd, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);}//设置下标private void setSubscript(String text){Object span = new SubscriptSpan();WordPosition position = getWordPosition(text);int textStart = position.start;int textEnd = position.end;mSpannableString.setSpan(span, textStart, textEnd, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);}//设置上标private void setSuperscript(String text){Object span = new SuperscriptSpan();WordPosition position = getWordPosition(text);int textStart = position.start;int textEnd = position.end;mSpannableString.setSpan(span, textStart, textEnd, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);}private WordPosition getWordPosition(String text) {int start = mContent.indexOf(text);int end = start + text.length();return new WordPosition(start, end);}private static final class WordPosition {int start;int end;private WordPosition(int start, int end) {this.start = start;this.end = end;}@Overridepublic String toString() {return "WordPosition{" +"start=" + start +", end=" + end +'}';}}}

源码下载地址

参考文章

  1. Spans, a Powerful Concept.
  2. 【译】Spans,一个强大的概念(上篇文章的中文译文)

Android:SpannableString使用详解相关推荐

  1. Android Text文字详解

    Android Text文字详解 1.绘制文字 1.1 普通绘写文字 1.2 单独指定每个文字的位置 1.3 沿路径绘写文字 2.字体样式 2.1 Paint相关样式 2.2 Typeface字体样式 ...

  2. 《Android游戏开发详解》——第1章,第1.6节函数(在Java中称为“方法”更好)...

    本节书摘来自异步社区<Android游戏开发详解>一书中的第1章,第1.6节函数(在Java中称为"方法"更好),作者 [美]Jonathan S. Harbour,更 ...

  3. JMessage Android 端开发详解

    JMessage Android 端开发详解 目前越来越多的应用会需要集成即时通讯功能,这里就为大家详细讲一下如何通过集成 JMessage 来为你的 App 增加即时通讯功能. 首先,一个最基础的 ...

  4. 《Java和Android开发实战详解》——2.5节良好的Java程序代码编写风格

    本节书摘来自异步社区<Java和Android开发实战详解>一书中的第2章,第2.5节良好的Java程序代码编写风格,作者 陈会安,更多章节内容可以访问云栖社区"异步社区&quo ...

  5. Android事件流程详解

    Android事件流程详解 网络上有不少博客讲述了android的事件分发机制和处理流程机制,但是看过千遍,总还是觉得有些迷迷糊糊,因此特地抽出一天事件来亲测下,向像我一样的广大入门程序员详细讲述an ...

  6. Android Studio 插件开发详解二:工具类

    转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/78112856 本文出自[赵彦军的博客] 在插件开发过程中,我们按照开发一个正式的项 ...

  7. 《Android游戏开发详解》一2.16 区分类和对象

    本节书摘来异步社区<Android游戏开发详解>一书中的第2章,第2.16节,作者: [美]Jonathan S. Harbour 译者: 李强 责编: 陈冀康,更多章节内容可以访问云栖社 ...

  8. Android Framework系统服务详解

    Android Framework系统服务详解 操作环境 系统:Linux (Ubuntu 12.04) 平台:高通 Android版本:5.1 PS: 符号...为省略N条代码 一.大致原理分析 A ...

  9. android屏幕适配详解

    android屏幕适配详解 官方地址:http://developer.android.com/guide/practices/screens_support.html 一.关于布局适配建议 1.不要 ...

  10. Android LiveData组件详解以及LiveDataBus

    转载请标明出处:https://blog.csdn.net/zhaoyanjun6/article/details/99749323 本文出自[赵彦军的博客] 一.LiveData简介 LiveDat ...

最新文章

  1. 服务器到底长什么样子啊(#゚Д゚)?
  2. Transform数据权限浅析2之利用Java完成权限设置
  3. asp.net学习之ado.net(连接模式访问)
  4. linux netfilter 过滤数据包,Netfilter-iptabes报文过滤框架(一)
  5. Linux5观察doc目录并截屏,linux截屏命令
  6. 配对(套利)交易之二,符合配对规则回测
  7. mysql 驱动指令_Mysql的驱动包如何发送指令给MYSQL SERVER
  8. 360服务器自动获取设置,360推“史上最严重安全漏洞”自动检测工具 用户一键获取补丁...
  9. FreeRTOS-时间片轮转调度
  10. 分布式中间件实践之路
  11. 环境风险模型总结及实现方案
  12. php 队列创建,php 队列的实现方法
  13. 一文读懂什么是数据产品交易
  14. MNN Interpreter and Session
  15. 一个app开发周期是多久?快速开发才是主流
  16. python标准图形库——turtle
  17. 计算机在平面设计中的作用,计算机在平面设计中应用2篇.docx
  18. 计算机无法识别ipad2,win10系统无法识别iphone、ipad的修复方法
  19. 教程1-简易飞机大战-第二节
  20. 洛谷 P4281 [AHOI2008]紧急集合 / 聚会(树上倍增 LCA)

热门文章

  1. R语言实战-第十六章 聚类分析
  2. 二叉树 递归 java_递归实现二叉树 JAVA
  3. 题: 计算机网络常见故障 网络收集的
  4. rgb转16进制的色值
  5. maven创建自定义web工程模板
  6. linux 文件系统简析
  7. 西湖大学张岳老师NLP课程大纲
  8. Mysql数据库的主从同步配置
  9. pandorabox mysql_GitHub - gy-games/pandorabox: 基于非对称加密(RSA)的私密信息传递工具,数据由本地客户端进行加密、解密操作。...
  10. 基于百度AI的图像文字提取应用程序