前言

  SpannableString,是google提供用来处理富文本的功能类.支持很多文本内容的效果变化.另外,它也是Android实现富文本编辑器的关键.

关键API详解

     String content ="先帝创业未半而中道崩殂,今天下三分,益州疲弊,此诚危急存亡之秋也。";
SpannableString spannableString = new SpannableString(content);
spannableString.setSpan(new ForegroundColorSpan(Color.parseColor("#FFFF0C00"))
, content.indexOf("创业")
, content.indexOf("而中")
, Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
mTextView.setText(spannableString);

这是一个简单使用的demo,我们用这个demo来讲解一些关键点.

这行代码的关键是setSpan(Object what, int start, int end, int flags)方法,这个方法在后面的文字处理将会一直使用到. setSpan有四个参数我们一个一个来讲解:

第一个参数 Object what 这个参数主要是提供你需要改变字符串的效果实现类,后续会一一讲解并且给出效果图

第二个参数 int start 这个参数是需要改变的字符串的起始位置

第三个参数 int end 这个参数是需要改变的字符串的结束位置

第四个参数 int flags 是一些字符串新增效果的影响范围,您可以参考这篇博客https://www.jianshu.com/p/1956e15c9a27这位大神讲解的十分详细了.本着就算是看懂了也要敲一敲代码记录的想法,下面也会说明一下常用的4种方法

public static final int SPAN_INCLUSIVE_EXCLUSIVE = SPAN_MARK_MARK;

在前面/范围内增加字符,新增字符会跟随效果.

在后面增加字符,新增字符不会跟随效果

效果图:

public static final int SPAN_INCLUSIVE_INCLUSIVE = SPAN_MARK_POINT;

在前面/范围内/后面增加字符,新增字符会跟随效果.

效果图:

public static final int SPAN_EXCLUSIVE_EXCLUSIVE = SPAN_POINT_MARK;

在范围内增加字符,新增字符会跟随效果.

在前面/后面增加字符,新增字符不会跟随效果

效果图:

public static final int SPAN_EXCLUSIVE_INCLUSIVE = SPAN_POINT_POINT;

在范围内/后面增加字符,新增字符会跟随效果.

在前面增加字符,新增字符不会跟随效果.

效果图:

代码里还有一些其他的常量,但是测试后其他都是这四种基本里一样的效果.也实在是没看懂google的注释.....

文字颜色

以下代码将一段文字变成红色

        String content ="先帝创业未半而中道崩殂,今天下三分,益州疲弊,此诚危急存亡之秋也。";
SpannableString spannableString = new SpannableString(content);
spannableString.setSpan(new ForegroundColorSpan(Color.parseColor("#FFFF0C00"))
, content.indexOf("创业")
, content.indexOf("而中")
, Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
mTextView.setText(spannableString);

ForegroundColorSpan 注意这个类是关键,他实现文字颜色改变.

效果图:

文字背景颜色

        String content ="先帝创业未半而中道崩殂,今天下三分,益州疲弊,此诚危急存亡之秋也。";
SpannableString spannableString = new SpannableString(content);
spannableString.setSpan(new BackgroundColorSpan(Color.parseColor("#FFFF0C00"))
, content.indexOf("创业")
, content.indexOf("而中")
, Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
mTextView.setText(spannableString);

BackgroundColorSpan 注意这个类是关键,他实现文字背景颜色改变.

效果图:

字体

        String content ="先帝创业未半而中道崩殂,今天下三分,益州疲弊,此诚危急存亡之秋也。";
SpannableString spannableString = new SpannableString(content);
spannableString.setSpan(new TypefaceSpan("sans-serif") //new TypefaceSpan(Typeface.SANS_SERIF) 或者使用这个方法
, content.indexOf("创业")
, content.indexOf("而中")
, Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
mTextView.setText(spannableString);

效果图(系统自带的演示字体效果不明显):

字体大小

        String content ="先帝创业未半而中道崩殂,今天下三分,益州疲弊,此诚危急存亡之秋也。";
SpannableString spannableString = new SpannableString(content);
spannableString.setSpan(new AbsoluteSizeSpan(50)
, content.indexOf("创业")
, content.indexOf("而中")
, Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
mTextView.setText(spannableString);

效果图:

粗体

        String content ="先帝创业未半而中道崩殂,今天下三分,益州疲弊,此诚危急存亡之秋也。";
SpannableString spannableString = new SpannableString(content);
spannableString.setSpan(new StyleSpan(Typeface.BOLD)
, content.indexOf("创业")
, content.indexOf("而中")
, Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
mTextView.setText(spannableString);

效果图:

斜体

        String content ="先帝创业未半而中道崩殂,今天下三分,益州疲弊,此诚危急存亡之秋也。";
SpannableString spannableString = new SpannableString(content);
spannableString.setSpan(new StyleSpan(Typeface.ITALIC)
, content.indexOf("创业")
, content.indexOf("而中")
, Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
mTextView.setText(spannableString);

效果图:

粗体和斜体

        String content ="先帝创业未半而中道崩殂,今天下三分,益州疲弊,此诚危急存亡之秋也。";
SpannableString spannableString = new SpannableString(content);
spannableString.setSpan(new StyleSpan(Typeface.BOLD_ITALIC)
, content.indexOf("创业")
, content.indexOf("而中")
, Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
mTextView.setText(spannableString);

另外还有一个Typeface.NORMAL  正常值就不演示了

效果图:

删除线

        String content ="先帝创业未半而中道崩殂,今天下三分,益州疲弊,此诚危急存亡之秋也。";
SpannableString spannableString = new SpannableString(content);
spannableString.setSpan(new StrikethroughSpan()
, content.indexOf("创业")
, content.indexOf("而中")
, Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
mTextView.setText(spannableString);

效果图:

下划线

        String content ="先帝创业未半而中道崩殂,今天下三分,益州疲弊,此诚危急存亡之秋也。";
SpannableString spannableString = new SpannableString(content);
spannableString.setSpan(new UnderlineSpan()
, content.indexOf("创业")
, content.indexOf("而中")
, Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
mTextView.setText(spannableString);

效果图:

上标

        String content ="先帝创业未半而中道崩殂,今天下三分,益州疲弊,此诚危急存亡之秋也。";
SpannableString spannableString = new SpannableString(content);
spannableString.setSpan(new SuperscriptSpan()
, content.indexOf("创业")
, content.indexOf("而中")
, Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
mTextView.setText(spannableString);

效果图:

下标

        String content ="先帝创业未半而中道崩殂,今天下三分,益州疲弊,此诚危急存亡之秋也。";
SpannableString spannableString = new SpannableString(content);
spannableString.setSpan(new SubscriptSpan()
, content.indexOf("创业")
, content.indexOf("而中")
, Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
mTextView.setText(spannableString);

效果图:

插入图片

        String content ="先帝创业未半而中道崩殂,今天下三分,益州疲弊,此诚危急存亡之秋也。";
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher);
ImageSpan span = new ImageSpan(bitmap);
SpannableString spannableString = new SpannableString(content);
spannableString.setSpan(span
, 0
, 1
, Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
mTextView.setText(spannableString);

或者

        String content ="先帝创业未半而中道崩殂,今天下三分,益州疲弊,此诚危急存亡之秋也。";
Drawable drawable = getResources().getDrawable(R.mipmap.ic_launcher, null); //读取图片
drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight());//设置边界 图片显示范围
ImageSpan span = new ImageSpan(drawable, ImageSpan.ALIGN_BASELINE);//ImageSpan.ALIGN_BASELINE 是对齐方式,这个是基线对齐
SpannableString spannableString = new SpannableString(content);
spannableString.setSpan(span
, 0
, 1
, Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
mTextView.setText(spannableString);

效果图:

点击事件

        mTextView.setMovementMethod(LinkMovementMethod.getInstance());//这是关键,只有TextView添加这个后才能有点击事件
mTextView.setHighlightColor(getResources().getColor(R.color.fontRed, null));//修改点击后的背景色
String content ="先帝创业未半而中道崩殂,今天下三分,益州疲弊,此诚危急存亡之秋也。";
ClickableSpan clickableSpan = new ClickableSpan() {
@Override
public void onClick(@NonNull View widget) {
Toast.makeText(MainActivity.this, "你点击了创业未半", Toast.LENGTH_SHORT).show();
} @Override
public void updateDrawState(@NonNull TextPaint ds) {
//改变选中文字的颜色或者样式,注意这里的TextPaint 其实是Paint,可以参考Paint的绘制添加其他效果.
ds.setColor(Color.RED);
// super.updateDrawState(ds);
}
};
SpannableString spannableString = new SpannableString(content);
spannableString.setSpan(clickableSpan
, content.indexOf("创业")
, content.indexOf("而中")
, Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
mTextView.setText(spannableString);

setMovementMethod是重中之重,只有设置了才能有 点击功能

效果图:

超链接

电话

        mTextView.setMovementMethod(LinkMovementMethod.getInstance());//这是关键,只有TextView添加这个后才能有点击事件
mTextView.setHighlightColor(getResources().getColor(R.color.fontRed, null));//修改点击后的背景色
String content ="先帝创业未半而中道崩殂,今天下三分,益州疲弊,此诚危急存亡之秋也。";
SpannableString spannableString = new SpannableString(content);
spannableString.setSpan(new URLSpan("tel:10086")
, content.indexOf("创业")
, content.indexOf("而中")
, Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
mTextView.setText(spannableString);

注意!使用超链接,依然要设置setMovementMethod,另外URLSpan也是可以重写点击事件的.

效果图:

与使用Intent的超链接类似,也是支持几个通用的超链接,都需要你输入正确的前缀

  • mailto:123456@qq.com
  • http://www.baidu.com
  • sms:123456
  • mms:123456
  • geo: 38.899533,-77.036476

其他Span

  上面的span只是一些常用的span演示,但是其实还有更多的span可以选择和使用,他们都在这个目录中.在这个目录下还有以下这些span.如果后续有时间我会一一实验使用这些span以判断他们的功能.

放弃富文本效果,提取文本

之前有端时间苦恼怎么提取不带富文本格式的文本,因为源代码的有很多方法并没有注释,所以蛋疼了很久..,后面突然发现,直接使用toString()方法就行

spannableString.toString()

END

Android开发 SpannableString开发详解的更多相关文章

  1. 【转】【Android UI设计与开发】之详解ActionBar的使用,androidactionbar

    原文网址:http://www.bkjia.com/Androidjc/895966.html [Android UI设计与开发]之详解ActionBar的使用,androidactionbar 详解 ...

  2. 【Android 应用开发】Ubuntu 下 Android Studio 开发工具使用详解 (旧版本 | 仅作参考)

    . 基本上可以导入项目开始使用了 ... . 作者 : 万境绝尘 转载请注明出处 : http://blog.csdn.net/shulianghan/article/details/21035637 ...

  3. Android开发–Intent-filter属性详解

    Android开发–Intent-filter属性详解 2011年05月09日 ⁄ Andriod ⁄ 暂无评论 ⁄ 被围观 1,396 views+ 如果一个 Intent 请求在一片数据上执行一个 ...

  4. 【Android 应用开发】Ubuntu 下 Android Studio 开发工具使用详解

    . 基本上可以导入项目开始使用了 ... . 作者 : 万境绝尘 转载请注明出处 : http://blog.csdn.net/shulianghan/article/details/21035637 ...

  5. p2p网贷项目开发全过程技术详解,应用框架是ci2.2

    p2p网贷项目开发全过程技术详解,应用框架是ci2.2 很标准的mvc开发代码,代码也很简单,方便二次开发 这篇文章会不断更新

  6. Spark Streaming揭秘 Day28 在集成开发环境中详解Spark Streaming的运行日志内幕

    Spark Streaming揭秘 Day28 在集成开发环境中详解Spark Streaming的运行日志内幕 今天会逐行解析一下SparkStreaming运行的日志,运行的是WordCountO ...

  7. VS2010开发程序打包详解

    VS2010开发程序打包详解 转自:http://blog.sina.com.cn/s/blog_473b385101019ufr.html 首先打开已经完成的工程,如图: 下面开始制作安装程序包. ...

  8. SpringMVC【开发Controller】详解

    前言 本文主要是讲解在Controller中的开发,主要的知识点有如下: 编码过滤器 使用注解开发 注解@RequestMapping详解 业务方法接收参数 字符串转日期 重定向和转发 返回JSON ...

  9. Linux驱动开发必看详解神秘内核(完全转载)

    Linux驱动开发必看详解神秘内核 完全转载-链接:http://blog.chinaunix.net/uid-21356596-id-1827434.html   IT168 技术文档]在开始步入L ...

  10. loadrunner 脚本开发- web_url函数详解

    脚本开发- web_url函数详解 by:授客 QQ:1033553122   加载指定url的web页面(GET请求) C语言函数 int web_url( const char *StepName ...

随机推荐

  1. JVM内核-原理、诊断与优化学习笔记(六):类装载器

    文章目录 class装载验证流程 class装载验证流程 class装载验证流程 -加载 class装载验证流程 -链接 验证 链接 -> 验证 文件格式的验证 元数据验证(class文件简单语 ...

  2. POJ2406-Power Strings-KMP循环节/哈希循环节

    Given two strings a and b we define a*b to be their concatenation. For example, if a = "abc&quo ...

  3. 剑指offer——37复杂链表的复制

    题目描述 输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head.(注意,输出结果中请不要返回参数中的节点引用,否 ...

  4. 剑指offer——17数值的整数次方

    题目描述 给定一个double类型的浮点数base和int类型的整数exponent.求base的exponent次方.   保证base和exponent不同时为0   一般解法: 直接相乘: cl ...

  5. 《软件调试修炼之道》Part 1(CH1~5)读书笔记 PB16110698 第八周(~4.26)

    编程中,调试几乎是必不可少的,一劳永逸.一次完成预想功能而完全不出bug的情况凤毛麟角,出现bug→调试→再出现bug→再调试……基本是软件工程中的常态.可以说,软件调试是每个coder的必修课,而& ...

  6. mac NTFS 关于错误-36,rm Input/output error

    当传输文件时出现Mac错误代码36 当我向一个U盘或存储卡里传输文件时,出现了Mac Error Code36,我该如何解决? Mac,传输文件,错误代码36,U盘,卡片 Mac OS X Snow ...

  7. JS函数 函数的作用,可以写一次代码,然后反复地重用这个代码。

    什么是函数 函数的作用,可以写一次代码,然后反复地重用这个代码. 如:我们要完成多组数和的功能. var sum; sum = 3+2; alert(sum); sum=7+8 ; alert(sum ...

  8. 关于pip安装较慢的问题解决

    在 ~/.pip/ 下创建文件 pip.conf(如果还没有的话),并填入以下内容: [global] timeout = 6000 index-url = http://pypi.douban.co ...

  9. hdu6393 Traffic Network in Numazu 树链剖分

    题目传送门 题意:给出n个点n条边的无向带权图,再给出两种操作,操作1是将第x条边的边权修改为y,操作2是询问点x到点y的最短路径. 思路:如果是n个点n-1条边,题目就变成了树,修改边权和询问最短路 ...

  10. VisualGDB使用随笔

    VisualGDB是目前我遇到的在Windows下开发Linux应用程序最好用的软件,它不仅可以直接在VS环境中编译Linux程序,还可以直接对Linux程序进行调试,极大的方便了Windows程序员 ...