Android开发 SpannableString开发详解
前言
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.comhttp://www.baidu.comsms:123456mms:123456geo: 38.899533,-77.036476
其他Span
上面的span只是一些常用的span演示,但是其实还有更多的span可以选择和使用,他们都在
这个目录中.在这个目录下还有以下这些span.如果后续有时间我会一一实验使用这些span以判断他们的功能.

放弃富文本效果,提取文本
之前有端时间苦恼怎么提取不带富文本格式的文本,因为源代码的有很多方法并没有注释,所以蛋疼了很久..,后面突然发现,直接使用toString()方法就行
spannableString.toString()
END
Android开发 SpannableString开发详解的更多相关文章
- 【转】【Android UI设计与开发】之详解ActionBar的使用,androidactionbar
原文网址:http://www.bkjia.com/Androidjc/895966.html [Android UI设计与开发]之详解ActionBar的使用,androidactionbar 详解 ...
- 【Android 应用开发】Ubuntu 下 Android Studio 开发工具使用详解 (旧版本 | 仅作参考)
. 基本上可以导入项目开始使用了 ... . 作者 : 万境绝尘 转载请注明出处 : http://blog.csdn.net/shulianghan/article/details/21035637 ...
- Android开发–Intent-filter属性详解
Android开发–Intent-filter属性详解 2011年05月09日 ⁄ Andriod ⁄ 暂无评论 ⁄ 被围观 1,396 views+ 如果一个 Intent 请求在一片数据上执行一个 ...
- 【Android 应用开发】Ubuntu 下 Android Studio 开发工具使用详解
. 基本上可以导入项目开始使用了 ... . 作者 : 万境绝尘 转载请注明出处 : http://blog.csdn.net/shulianghan/article/details/21035637 ...
- p2p网贷项目开发全过程技术详解,应用框架是ci2.2
p2p网贷项目开发全过程技术详解,应用框架是ci2.2 很标准的mvc开发代码,代码也很简单,方便二次开发 这篇文章会不断更新
- Spark Streaming揭秘 Day28 在集成开发环境中详解Spark Streaming的运行日志内幕
Spark Streaming揭秘 Day28 在集成开发环境中详解Spark Streaming的运行日志内幕 今天会逐行解析一下SparkStreaming运行的日志,运行的是WordCountO ...
- VS2010开发程序打包详解
VS2010开发程序打包详解 转自:http://blog.sina.com.cn/s/blog_473b385101019ufr.html 首先打开已经完成的工程,如图: 下面开始制作安装程序包. ...
- SpringMVC【开发Controller】详解
前言 本文主要是讲解在Controller中的开发,主要的知识点有如下: 编码过滤器 使用注解开发 注解@RequestMapping详解 业务方法接收参数 字符串转日期 重定向和转发 返回JSON ...
- Linux驱动开发必看详解神秘内核(完全转载)
Linux驱动开发必看详解神秘内核 完全转载-链接:http://blog.chinaunix.net/uid-21356596-id-1827434.html IT168 技术文档]在开始步入L ...
- loadrunner 脚本开发- web_url函数详解
脚本开发- web_url函数详解 by:授客 QQ:1033553122 加载指定url的web页面(GET请求) C语言函数 int web_url( const char *StepName ...
随机推荐
- NX二次开发-UFUN批量操作图层状态UF_LAYER_set_many_layers_status
NX11+VS2013 #include <uf.h> #include <uf_ui.h> #include <uf_layer.h> UF_initialize ...
- NX二次开发-将信息窗口中的文本保存到文本文件中UF_UI_save_listing_window
#include <uf.h> #include <uf_ui.h> UF_initialize(); //打开信息窗口 UF_UI_open_listing_window() ...
- 全局唯一标识符(GUID,Globally Unique Identifier)
全局唯一标识符(GUID,Globally Unique Identifier)是一种由算法生成的二进制长度为128位的数字标识符.GUID主要用于在拥有多个节点.多台计算机的网络或系统中.在理想情况 ...
- MySQL数据库中,使用 group by 时,不重复字段如何拼接显示
就不写文字描述了,直接用图和sql来表述吧. 这是测试数据,表名为 person 现在,我想按照性别进行分组,也就是字段 sex ,同时能将分组后的姓名全部显示出来. sql 语句如下: SELECT ...
- 剑指offer——18打印从1到最大的n位数
题目: 输入数字n,按顺序打印出从1到最大的n位十进制数.比如输入3,则打印出1.2.3一直到最大的3位数999. 题解: 注意大数溢出问题,故使用字符串更靠谱 class Solution { pu ...
- 剑指offer——07用两个栈实现队列
题目描述 用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型. 题解: 有两个栈,stack1和stack2 push只在stack1上操作,pop只在stack2 ...
- 全球CMOS图像传感器厂商
近期,台湾地区的Yuanta Research发布报告,介绍了其对CMOS图像传感器(CIS)市场的看法,以及到2022年的前景预期. 从该研究报告可以看出,2018年全球CMOS图像传感器的市场规模 ...
- 网页设计师神器,快速生成网站配色、字型等风格的工具——Stylify Me
在设计网页时,最重要的一项便是网页的配色,颜色的使用在网页制作中起着非常关键的作用,不同的网站有着自己不同的风格,也有着自己不同的颜色.今天给大家介绍一个在线生成网站配色的工具——Stylify Me ...
- .Net Core JWT Bearer 的认证
关于JWT原理在这不多说,主要由三部分组成:Header.Payload.Signature,有兴趣自己上网了解. 1.首先创建.Net Core 一个Api项目 2.添加 JWT 配置 2.1 修改 ...
- 数据库MySQL--常见函数
例子文件:https://files.cnblogs.com/files/Vera-y/myemployees.zip 函数:将一组逻辑语句封装在函数体中,对外暴露函数名 调用:select 函数名( ...