Span使用之系统提供的Span基本样式

Span的应用

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

Span使用三部曲

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

系统Span的基本使用

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

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

编写SpannerTestActivity如下:

public class SpannerTestActivity extends AppCompatActivity {

    private TextView mText;

    @Override
    protected 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值,默认是px
        spanned.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:[email protected]"), 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,手动修改一些文本看一下变化就一目了然了。

时间: 2024-10-24 08:58:26

Span使用之系统提供的Span基本样式的相关文章

(原)SQL Server 系统提供功能的三个疑惑

本文目录列表: 1.SQL Server系统提供的部分疑惑概述2.系统函数调用时DEFAULT代替可选参数使用不统一3.队列字段列message_enqueue_time记录的是UTC日期时间 4.@@Pack_Received系统函数提示信息有错误 5.总结语6.参考清单列表 正文: 1.SQL Server系统提供的部分疑惑概述   近来工作之余一直在系统地学习和研究SQL Server 数据库引擎这一整块,发现了一些原来没有太注意的东西,感觉SQL Server 光数据库引擎这块就有很多要

系统提供的dispatch方法

系统提供的dispatch方法 为了方便地使用GCD,苹果提供了一些方法方便我们将block放在主线程或后台线程执行,或者延后执行.使用的例子如下所示: // 后台执行: dispatch_async(dispatch_get_global_queue(0, 0), ^{ // something }); // 主线程执行: dispatch_async(dispatch_get_main_queue(), ^{ // something }); // 一次性执行: static dispatc

iOS系统提供开发环境下命令行编译工具:xcodebuild

iOS系统提供开发环境下命令行编译工具:xcodebuild[3] xcodebuild 在介绍xcodebuild之前,需要先弄清楚一些在XCode环境下的一些概念[4]: Workspace:简单来说,Workspace就是一个容器,在该容器中可以存放多个你创建的Xcode Project, 以及其他的项目中需要使用到的文件. 使用Workspace的好处有: 1),扩展项目的可视域,即可以在多个项目之间跳转,重构,一个项目可以使用另一个项目的输出.Workspace会负责各个Project

Android 系统提供的主题

android.R.style 列举了系统提供的样式主题. 在 xml 文件中,作为属性值使用时,需要将主题名称中的 "_"(短横)改为 .(点). Theme The default theme for apps on API level 10 and lower. Theme_Black Variant on Theme that ensures the background is completely black. Theme_Black_NoTitleBar Variant o

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

1,通讯录访问介绍 通讯录(或叫地址簿,电话簿)是一个数据库,里面储存了联系人的相关信息.要实现访问通讯录有如下两种方式: (1)AddressBook.framework框架 : 没有界面,通过代码来获取所有联系人信息 (2)AddressBookUI.framework框架 : 通过系统提供的通讯录交互界面来访问(本文样例使用此方式) 2,联系人记录的属性 在一条联系人记录中,有很多属性,而这些属性又分为单值属性和多值属性. 单值属性是只有一个值的属性:如姓氏.名字.部门.备注等. 多值属性

android系统提供的几种颜色Color

记录一下android自带颜色. Constants public static final int BLACK Added in API level 1 Constant Value: -16777216 (0xff000000)        public static final int BLUE Added in API level 1 Constant Value: -16776961 (0xff0000ff)       public static final int CYAN Ad

Android该系统提供的服务--Vibrator(振子)

Android该系统提供的服务--Vibrator(振子) --转载请注明出处:coder-pig Vibrator简单介绍与相关方法: watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvY29kZXJfcGln/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" > 简单demo--设置频率不同的振动器 对于Vibrator用的最广泛的莫过于所谓的手

spring security 一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架

Spring Security是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架.它提供了一组可以在Spring应用上下文中 配置的Bean,充分利用了Spring IoC,DI(控制反转Inversion of Control ,DI:Dependency Injection 依赖注入)和AOP(面向切面编程)功能,为应用系统提供声明式的安全访问控制功能,减少了为企业系统安全控制编写大量重复代码的工作. Spring Security 的前身是 Acegi S

如何在Windows Server 2008 R2没有磁盘清理工具的情况下使用系统提供的磁盘清理工具

今天,刚好碰到服务器C盘空间满的情况,首先处理了临时文件和有关的日志文件后空间还是不够用,我知道清理C盘的方法有很多,但今天只分享一下如何在Windows Server 2008 R2没有磁盘清理工具的情况下使用系统提供的磁盘清理工具. 一.在Windows Server 2008 R2,右击C盘,选择属性,弹出下面的界面: 即没有下面清理C盘的工具: 那如何使用系统自带的清理工具呢. 二.驱动器的常规属性和 cleanmgr.exe 磁盘清理选项不是默认情况下出现在 Windows Serve