上一节介绍了一下Span,有些乱,这一节我们来讲讲Android 提供的各种Span的应用。

使用 Span 的步骤

  1. 定义你要显示的文本
  2. 定义你需要的Span
  3. 使用将要显示文字,构造一个SpannableString
  4. 调用SpannableStringsetSpan()方法设置spansetSpan()的参数会有设置文字的范围。
  5. 调用TextViewsetText()方法,显示SpannableString

修改字符文本格式时使用的CharacterStyle

当我们遇到在布局里无法处理的文本格式,我们就可以使用CharacterStyle

ClickableSpan:可设置文本局部点击,局部文字的颜色

ClickableSpan 同时继承了CharacterStyle和实现了UpdateAppearance

这个Span是第一节开头提到的问题的最好解决方式。
按照上面的步骤我们来使用 ClickableSpan实现局部点击,并且使点击的文字变色

    //1.定义需要显示的文字;使“《协议》”变色,并且给“《协议》”添加点击事件,final String protocol = "我已阅读并同意本《协议》";//2.定义你需要的`Span`ClickableSpan clickableSpan = new ClickableSpan() {@Overridepublic void onClick(View widget) { // 在这里实现点击事件showToast(protocol);}};//3.使用将要显示文字,构造一个`SpannableString`SpannableString spannableString = new SpannableString(protocol);//4.调用`SpannableString`的`setSpan()`方法设置`span`;`setSpan()`的参数会有设置文字的范围。int start = protocol.length() - 4;int end = protocol.length();spannableString.setSpan(new CustomClickableSpan(protocol), start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);//5.调用`TextView`的`setText()`方法,显示`SpannableString`mTextView.setText(spannableString);//6.这里比平常的Span多一步,要设置一下超链接,否则不会生效mTextView.setMovementMethod(LinkMovementMethod.getInstance());

效果图如下:

虽然上面实现了基本的点击功能,但是美工"《协议》"这两个字的颜色是蓝色,而且不想要下划线;所以还要进一步处理,这就需要看看ClickableSpan的内部是如何处理文字颜色了。它的源码如下:

public abstract class ClickableSpan extends CharacterStyle implements UpdateAppearance {public abstract void onClick(View widget);@Overridepublic void updateDrawState(TextPaint ds) {ds.setColor(ds.linkColor);ds.setUnderlineText(true);}
}

上面的代码显示,它在updateDrawState()方法里面,设置里字体的颜色和下划线。所以我们需要继承ClickableSpan重写一下这个方法,在这个方法里面,设置我们希望的颜色。代码如下:

private class CustomClickableSpan extends ClickableSpan {private String msg;public CustomClickableSpan(String msg) {this.msg = msg;}@Overridepublic void onClick(View widget) {showToast(msg);}@Overridepublic void updateDrawState(TextPaint ds) {//在这里设置需要的颜色和是否需要下滑线ds.setColor(getResources().getColor(R.color.color_blue));ds.setUnderlineText(false);}
}

我可以替换之前的第四步:

//4.调用`SpannableString`的`setSpan()`方法设置`span`;`setSpan()`的参数会有设置文字的范围。
int start = protocol.length() - 4;
int end = protocol.length();
spannableString.setSpan(new CustomClickableSpan(protocol), start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);

效果图如下:

这样就更换了颜色,去掉了下划线。

实现了TextView局部点击的问题,我们来说说其它的Span

AlignmentSpan.Standard 实现文字的左/右对齐,居中对齐

TextView 文字的对齐方式有三种,对应的是Layout.Alignment中的三个枚举常量

  1. TextView 默认是左对齐的,对应的参数是 Layout.Alignment.ALIGN_NORMAL
  2. 右对齐,即跟默认相反,对应的参数是 Layout.Alignment.ALIGN_OPPOSITE
  3. 居中对齐的,对应的参数是 Layout.Alignment.ALIGN_CENTER

下面我们按照最开始的步骤一步一步设置Span

 //1.定义需要显示的文字String text = "Sometimes I really doubt whether there is love between my parents. " +"Every day they are very busy trying to earn money in order to pay the high tuition for my brother and me. " +"They don't act in the romantic ways that I read in books or I see on TV.";//2.定义你需要的`Span`AlignmentSpan.Standard alignmentSpan = new AlignmentSpan.Standard(Layout.Alignment.ALIGN_OPPOSITE);//3.使用将要显示文字,构造一个`SpannableString`SpannableString spannableString = new SpannableString(text);//4.调用`SpannableString`的`setSpan()`方法设置`span`;`setSpan()`的参数会有设置文字的范围。spannableString.setSpan(alignmentSpan, 0, text.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);//5.调用`TextView`的`setText()`方法,显示`SpannableString`mTextView.setText(spannableString);

这里设置文字的对齐方式,是作用到段落上的,所以在设置 start 和 end 范围时要注意,设置几个范围的内的字符,是没有反应得。

上面代码的效果如图所示:

如果要实现居中对齐可在第2步定义Span的时候,把参数设置成 Layout.Alignment.ALIGN_CENTER

UnderlineSpan 实现文字下划线的功能

我们这里如要给TextView的文字加上下划线,只需要重复上面的5个步骤,并且替换第2步就Ok了。

//2.定义你需要的`Span`
UnderlineSpan underlineSpan = new UnderlineSpan();

然后把它UnderlineSpan的引用传给SpannableStringsetSpan()方法就Ok了。

StrikethroughSpan 实现删除线 功能

同样我只需要将定义 StrikethroughSpan ,然后将其引用传递给SpannableStringsetSpan()方法就Ok了。

//2.定义你需要的`Span`
StrikethroughSpan strikethroughSpan = new StrikethroughSpan();

以下如果没有特殊说明,我们都是重复上面的步骤,只是修改了第二步。

ImageSpan 替换指定位置跟指定长度的字符

//2.定义你需要的`Span`
ImageSpan imageSpan = new ImageSpan(this,R.drawable.ic_launcher);
//……省略第3步
//4.这里会把从20-30的字符替换为图片
spannableString.setSpan(imageSpan, 20, 30, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);

ImageSpan 还有多个构造方法,主要还有传入BitmapDrawable

SubscriptSpan 把字符变成下标

     //2.定义你需要的`Span`SubscriptSpan span = new SubscriptSpan();//3.使用将要显示文字,构造一个`SpannableString`SpannableString spannableString = new SpannableString(text);//4.将第19到第24个字符设成下标spannableString.setSpan(span, 19, 24, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);

SuperscriptSpan 把字符变成上角标

    //2.定义你需要的`Span`SuperscriptSpan  span = new SuperscriptSpan ();//3.使用将要显示文字,构造一个`SpannableString`SpannableString spannableString = new SpannableString(text);//4.将第19到第24个字符设成上角标spannableString.setSpan(span, 19, 24, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);

StyleSpan 设置文字的样式

StyleSpan 设置的内容相当于在 布局 里设置 android:textStyle

//2.定义一个StyleSpan,并且设置 文字为粗体
StyleSpan  span = new StyleSpan(Typeface.BOLD);

除了粗体,还有其它风格:
ITALIC 斜体
BOLD_ITALIC 粗斜体

TextView 默认的格式 NORMAL

TypefaceSpan 设置文字的文体,

参数为Android内置的文字字体家族。包含"normal",“sans”,“serif”,“monospace”,“sans-serif-light” 等

//2.定义你需要的`Span`
TypefaceSpan  span = new TypefaceSpan("serif");

TextAppearanceSpan 可以在 style文件里自定义文字的风格

//2.定义你需要的`Span`
TextAppearanceSpan   span = new TextAppearanceSpan (this,R.style.TextAppearanceSpan);

RelativeSizeSpan 设置指定文字相对于其它文字的大小

//2.这里设置的是指定范围内的文字是其他文字大小的2倍
RelativeSizeSpan relativeSizeSpan = new RelativeSizeSpan(2.0f);

相对的还有 AbsoluteSizeSpan,这个指定是文字的绝对大小,参数设置的是绝对的大小

//2.设置文字的绝对大小,并且设置单位为 dip
AbsoluteSizeSpan span = new AbsoluteSizeSpan(24, true);

ScaleXSpan 设置指定文字 在 x 轴方向缩放的大小

//2横向放大2倍;横向缩小应该小于 1.0f。
ScaleXSpan scaleXSpan = new ScaleXSpan(2.0f);

还剩下几个 Span,大家可自己尝试一下,看看能出现什么效果。

另外 在这行代码中

spannableString.setSpan(imageSpan, 20, 30, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);

最后一个参数,会在获取字符长度时用到。这里用到的是 Spanned.SPAN_EXCLUSIVE_EXCLUSIVE,表示不包含start位置的字符也不含end位置的字符。除了这个还有其他三个参数:

Spanned.SPAN_INCLUSIVE_EXCLUSIVE(包括start,不包括end)

Spanned.SPAN_EXCLUSIVE_INCLUSIVE(不包括start,包括end)

Spanned.SPAN_INCLUSIVE_INCLUSIVE(start、end 都包括)。

Span 介绍及使用(二)相关推荐

  1. 从Client应用场景介绍IdentityServer4(二)

    从Client应用场景介绍IdentityServer4(二) 原文:从Client应用场景介绍IdentityServer4(二) 本节介绍Client的ClientCredentials客户端模式 ...

  2. AIBlockChain:“知名博主独家讲授”人工智能创新应用竞赛【精选实战作品】之《基于计算机视觉、自然语言处理、区块链和爬虫技术的智能会议系统》软件系统案例的界面简介、功能介绍分享之二、会中智能

    AI&BlockChain:"知名博主独家讲授"人工智能创新应用竞赛[精选实战作品]之<基于计算机视觉.自然语言处理.区块链和爬虫技术的智能会议系统>软件系统案 ...

  3. 优秀的 Verilog/FPGA开源项目介绍(十二)- 玩FPGA不乏味

    优秀的 Verilog/FPGA开源项目介绍(十二)- 玩FPGA不乏味 Hello,大家好,之前给大家分享了大约一百多个关于FPGA的开源项目,涉及PCIe.网络.RISC-V.视频编码等等,这次给 ...

  4. 物联网方案介绍 - 智能水务—二次供水泵房物联网升级方案

    物联网方案介绍 - 智能水务-二次供水泵房物联网升级方案 1.  方案背景 目前城市的供水泵房,尤其是二次供水泵房,除了部分由自来水公司管理 外,多数由用水方负责建设管理,如物业公司.居委会.产权单位 ...

  5. c语言学习之基础知识点介绍(十二):结构体的介绍

    一.结构体的介绍 /* 语法:struct 结构体名{成员列表;};切记切记有分号!说明:成员列表就是指你要保存哪些类型的数据.注意:上面的语法只是定义一个新的类型,而这个类型叫做结构体类型.因为类型 ...

  6. Spring 使用介绍(十二)—— Spring Task

    一.概述 1.jdk的线程池和任务调用器分别由ExecutorService.ScheduledExecutorService定义,继承关系如下: ThreadPoolExecutor:Executo ...

  7. C#如何安全、高效地玩转任何种类的内存之Span的秉性特点(二)

    前言 读完上篇<C#如何安全.高效地玩转任何种类的内存之Span的本质(一)>,相信大家对span的本质应该非常清楚了.含着金钥匙出生的它,从小就被寄予厚望要成为.NET下编写高性能应用程 ...

  8. 通俗易懂,C#如何安全、高效地玩转任何种类的内存之Span的脾气秉性(二)

    前言 读完上篇<通俗易懂,C#如何安全.高效地玩转任何种类的内存之Span(一)>,相信大家对span的本质应该非常清楚了.含着金钥匙出生的它,从小就被寄予厚望要成为.NET下编写高性能应 ...

  9. ubc计算机二学位培养方案,UT/McGill/UBC CS二学位(主要介绍多大二学位了)

    感觉这个帖子已经被我更新成多大二学位信息贴了,楼主平常不看贴的,有问题进群里问啊. ------------------08/2019更新---------------- 在霸霸的鼓励下更新帖子,沉迷 ...

  10. Netty介绍及实战(二)之IO与NIO和多路复用与零拷贝

    Netty介绍及实战(一) 一.Netty到底是什么?什么是多路复用?什么叫做零拷贝? Netty是一个NIO客户端服务器框架,可以快速.轻松地开发协议服务器和客户端等网络应用程序.它极大地简化和简化 ...

最新文章

  1. 美专家:中国的机器人优势所引发的忧虑
  2. error C3861: “setw”: 找不到标识符
  3. 对象内存布局 (5)
  4. 进入到一个新的产品,如何开展测试工作
  5. Java检查异常、非检查异常、运行时异常、非运行时异常的区别
  6. WS2812B全彩灯板
  7. 在条码打印软件中如何绘制圆形
  8. Zoreto+坚果云+pdf expert(papership) 实现文献管理和批注同步
  9. FLINK 极客时间
  10. 【技能】前端技能列表
  11. 微信小程序正则表达式
  12. c#自定义事件以及与其他事件绑定
  13. 阿里云跨境游戏及电商网络加速方案(全球加速和CDN)
  14. FBA 街机游戏安卓盒子,游戏盒子实现双人对打,四人对打方案
  15. (一)计算机系统基础之冯诺依曼结构主要思想
  16. ios怎么引入masonry_IOS Masonry的基本使用
  17. 51nod3108 小明爱换钱
  18. 数学论文(优化方向)写作总结
  19. 搭建Tcloud云测平台第一步
  20. comsol和java_Comsol Java API

热门文章

  1. 服务器芯片组驱动,Intel芯片组INF驱动9.1.1.1027 For Windows7
  2. 计算机原理与体系结构王海瑞答案,袁梅
  3. itext7实现参数和图片替换
  4. 域名Whois查询API,域名Whois,域名历史Whois
  5. (一)线段树入门--补充与其他模板
  6. 凉鞋问题之贝叶斯公式
  7. java mp3合并_java合并MP3文件
  8. 配置安装最新的Vue脚手架
  9. Android 开启热点 适配8.0以上
  10. FIT/WeFIT 开发者冯华君采访