Span的应用

Android中,使用TextView显示文本,但往往有一些特殊的文本样式,比如一段文本,中间某几个字颜色不同或者中间某几个字能点击等等,这些样式如果没有不同,就编写一个新的TextView,那么一段文字将使用很多的TextView去显示,那么,有没有可能使用一个TextView显示所有文字,而基于文字定义不同的样式呢。这就是Span的作用。

Span使用三部曲

Spanandroid提供的用于操作文本的样式的相关类。他能够精确地控制一段文本中具体某些文本的样式。基于Span将分为三遍博客去描述

  • Span使用之系统提供的Span基本样式
  • Span使用之利用系统Span样式实现模糊搜索,匹配变色的特殊UI效果
  • Span使用之利用自定义Span解析Html中特殊标签实现类似微博@效果

系统Span的基本使用

首先,看一下我们要实现的效果,该效果网上的例子很多,本篇博客也是基于网上的例子编写的。

如上效果,如果每一个特殊效果都是一个TextView,那么将编写很多的TextView,下面我们就开始利用Span实现如上效果。

编写SpannerTestActivity如下:

public class SpannerTestActivity extends AppCompatActivity {private TextView mText;@Overrideprotected void onCreate(@Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_spanner);mText = ((TextView) findViewById(R.id.text));// testSpanned()便是基于文本定义的样式mText.setText(testSpanned());}
}

关键方法便是testSpanned()方法,看一下实现

    public Spanned testSpanned() {SpannableString spanned = new SpannableString("测试文字字体大小一半两倍前景色背景色正常粗体斜体粗斜体下划线删除线x1x2电话邮件网站X轴综合");// ......省略return spanned;}

构造SpannableString对象,并返回。

SpannableStringString对象类似,同样可以作为文本设置到 setText()上,不过SpannableString可以通过setSpan()向文本上设置一些特殊样式。

setSpan()具体声明为setSpan(Object what, int start, int end, int flags)包含四个参数,参数分别为

  • what:设置的样式。
  • start:设置样式的文本开始索引。
  • end:设置样式的文本结束索引。
  • flags :指定样式的范围,当本文发生变化时,是否将样式应用到新增加的文本上。

看完声明,其实关键点便是what的类型,但参数声明上是object,那么what可以传入哪些值呢?

系统为我们提供了一些what的值,他们是CharacterStyle及其子类,下面将列举一些:

在上面的代码中,我们省略了设置样式的相关代码,具体代码如下:

// 设置字体(default,default-bold,monospace,serif,sans-serif)spanned.setSpan(new TypefaceSpan("monospace"), 0, 2, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);spanned.setSpan(new TypefaceSpan("serif"), 2, 4, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);// 设置字体大小,第二个参数表示是否是dp值,默认是pxspanned.setSpan(new AbsoluteSizeSpan(20), 4, 6, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);spanned.setSpan(new AbsoluteSizeSpan(20, true), 6, 8, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);// 相对大小 相对于默认字体的倍数spanned.setSpan(new RelativeSizeSpan(0.5f), 8, 10, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);spanned.setSpan(new RelativeSizeSpan(2f), 10, 12, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);// 设置字体的前景色 Magenta紫红spanned.setSpan(new ForegroundColorSpan(Color.MAGENTA), 12, 15, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);// 设置字体的背景色spanned.setSpan(new BackgroundColorSpan(Color.CYAN), 15, 18, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);// 设置字体的样式spanned.setSpan(new StyleSpan(Typeface.NORMAL), 18, 20, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);spanned.setSpan(new StyleSpan(Typeface.BOLD), 20, 22, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);spanned.setSpan(new StyleSpan(Typeface.ITALIC), 22, 24, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);spanned.setSpan(new StyleSpan(Typeface.BOLD_ITALIC), 24, 27, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);// 设置下划线spanned.setSpan(new UnderlineSpan(), 27, 30, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);// 设置删除线spanned.setSpan(new StrikethroughSpan(), 30, 33, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);// 设置下标spanned.setSpan(new SubscriptSpan(), 34, 35, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);// 设置上标spanned.setSpan(new SuperscriptSpan(), 36, 37, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);// 设置链接spanned.setSpan(new URLSpan("tel:1234556"), 37, 39, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);spanned.setSpan(new URLSpan("mailto:zziamhao@163.com"), 39, 41, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);spanned.setSpan(new URLSpan("http://www.baidu.com"), 41, 43, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);// 设置宽度的缩放,高度不变spanned.setSpan(new ScaleXSpan(2.0f), 43, 45, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);

将上面所有的代码组合到一起,便是实现了开始的那一段文字的效果。

细节不在讲述,提两个关键点。

首先是索引startend,记住顾前不顾后即可。

其次是flags,当文本变化时,对应索引是否应用样式,上面传入的都是同一种,可以传入如下几种,

  • Spanned.SPAN_EXCLUSIVE_EXCLUSIVE 前后都不包括
  • Spanned.SPAN_INCLUSIVE_EXCLUSIVE 前面包括,后面不包括
  • Spanned.SPAN_EXCLUSIVE_INCLUSIVE 后面包括,前面不包括
  • Spanned.SPAN_INCLUSIVE_INCLUSIVE 前后都包括

这个地方,很多人可能会有疑问,这里不再多做解释,可以将上面的TextView改变为EditText,手动修改一些文本看一下变化就一目了然了。

Span使用之系统提供的Span基本样式相关推荐

  1. html里span和div,HTML div和span

    块代码 和 1.. .ccwTest { font-family: '.PingFang SC';">; color:white; margin:18px; padding:16px; ...

  2. Swift - 访问通讯录联系人(使用系统提供的通讯录交互界面)

    1,通讯录访问介绍 通讯录(或叫地址簿,电话簿)是一个数据库,里面储存了联系人的相关信息.要实现访问通讯录有如下两种方式: (1)AddressBook.framework框架 : 没有界面,通过代码 ...

  3. 系统提供的按钮和图标

    为了打造一致的用户体验(也为了让您的工作更加轻松),iPhone OS提供了许多用于导航栏和工具栏的标准按钮,以及用于标签栏的图标. 本章介绍了可供您使用的标准图标和按钮,以及如何正确地使用它们.不论 ...

  4. QT中Widget去除系统提供工具以及系统默认边框

    1.直接去掉系统提供的窗口边框,不能移动和改变窗口的大小. this->setWindowFlags(Qt::FramelessWindowHint);//直接去掉系统提供的窗口边框,不能移动和 ...

  5. 利用系统提供的崩溃日志解Native层Bug

    2019独角兽企业重金招聘Python工程师标准>>> 对Android开发者来讲,尤其是使用NDK编写Native层代码的开发者,在编码过程中通常会碰到各种各样的问题.追踪问题的方 ...

  6. Windows Server 2008 没有磁盘清理工具的情况下使用系统提供的磁盘清理工具

    服务器C盘空间满的情况,首先处理了临时文件和有关的日志文件后空间还是不够用,清理C盘的方法有很多,分享一下如何在Windows Server 2008 没有磁盘清理工具的情况下使用系统提供的磁盘清理工 ...

  7. UIView封装动画--iOS利用系统提供方法来做关键帧动画

    iOS利用系统提供方法来做关键帧动画 ios7以后才有用. /*关键帧动画options:UIViewKeyframeAnimationOptions类型*/[UIView animateKeyfra ...

  8. 数据库审计系统提供服务器,数据库审计系统通用解决方案

    背景需求: 根据对其业务系统.数据中心的数据库系统的威胁与风险分析,用户数据库安全需求主要集中在以下方面:对一般操作行为如数据库的登录.注销动作,特定的操作如对数据表的插入.删除.修改,执行特定的存贮 ...

  9. jquery获取span标签下的第一个span子标签内容

    看了几本jquery的书之后,觉得对jQuery的dom操作部分应该是比较熟悉了,但是当正式用到的时候又忽然觉得什么也不知道,还得上网来搜,遇到的问题就是获取span标签下的第一个span标签中的内容 ...

最新文章

  1. html5表单验证没有效果,HTML5表单验证特性(知识点小结)
  2. vs设置语言后引用dll的一个错误
  3. SSH学习-Hibernate对象生命周期管理
  4. 连续 3 天,企业容器应用实战营上海站来啦!
  5. sketch浮动布局_使用智能布局和调整大小在Sketch中创建更好的可重用符号
  6. 中国企业飞鸽传书市场
  7. Aspect的简单方法拦截
  8. C#中的控制台进度条
  9. 从0 开始 WPF MVVM 企业级框架实现与说明 ---- 第十讲 WPF 系统MainWindow
  10. jQuery操作cookie 的方法
  11. poj 1860 bellman 求正环
  12. Spring相关面试题总结
  13. Maven的安装和适配使用教程-保姆级
  14. c++ packaged_task
  15. 装修店铺营销活动策划?
  16. leetcode(力扣)刷题题解网站
  17. failed to connect to ‘192.168.31.157:5555‘: Connection refused
  18. 大学计算机实验教程实验报告2.2,大学计算机实验2实验报告.doc
  19. TMS320F280049C 学习笔记11 控制率加速器 CLA 例程
  20. 跨浏览器书签同步(Floccus + WebDav)

热门文章

  1. 2021年书单-产品相关
  2. 卷积神经网络 损失函数,卷积计算公式 神经网络
  3. Kubernetes Pod 获取真实 IP 地址
  4. 关于MFC中读取EXCEL文件的操作
  5. zynq实现视频动态字符叠加OSD,提供2套工程源码和技术支持
  6. 20171119 - 2.01x - Week 4
  7. matlab/simulink 风电一次调频四机两区系统,双馈风机调频,永磁同步直驱风机调频都适用
  8. 【CQOI2017】bzoj4815 小Q的表格
  9. 【转】yuv文件显示与测试
  10. tf.gradients