返回顶部
首页 > 资讯 > 移动开发 >Android 富文本 SpannableStringBuilder 探究
  • 535
分享到

Android 富文本 SpannableStringBuilder 探究

androidjava 2023-10-10 16:10:49 535人浏览 泡泡鱼
摘要

文章目录 前言一、SpannableStringBuilder 是什么?二、使用步骤1.示例代码2.参数对应start:样式生效的开始位置,包括该位置end: 样式结束的位置,不包括该位置fl

文章目录


前言

今天为什么要说 SpannableStringBuilder 这个类呢 ,这还要从之前悲催的项目经历说起,原型是这样子的,我们主要看文本,其余暂时忽略
在这里插入图片描述当你看到图,是不是感觉很熟悉,因为他就是个服务条款跟隐私政策一样的勾选提交功能,如果不出意外的话,TextView 文本拼接,然后再添加上点击事件跳转,大功告成,但往往这时候都会出意外,这个服务条款很隐私政策是接口动态获取的,可能是一个也可能是两个,但此时我告诉你一个 TextView 即可搞定是不是很神奇?来看下本章最终的实现效果
在这里插入图片描述
Demo 源码在文章最底部,欢迎 Star 或 Fork

一、SpannableStringBuilder 是什么?

Google 官方的介绍已经很直白了,翻译过来就是,这是用于内容和标记都可以更改的文本的类。是不是第一时间想到了富文本,没错,它就是 Android 中用于创建富文本的类,它是 Spannable 接口的实现类,可以在文本中添加样式、图片、超链接等效果。

SpannableStringBuilder 和 StringBuilder 类似,也是一个动态字符串类,支持插入和删除文本,但是它可以在文本中添加多种样式,
在这里插入图片描述
通过源码我们可以得知,SpannableStringBuilder 主要实现了 CharSequence 和 Spannable 接口,
在这里插入图片描述CharSequence 接口是在 Java 中定义的一个字符序列接口,它表示一个字符序列,可以是 String、StringBuilder、StringBuffer 等类型。CharSequence 接口是一个只读接口,提供了以下方法:

charAt(int index):返回指定位置的字符。length():返回字符序列的长度。subSequence(int start, int end):返回从 start 到 end-1 的字符序列子序列。toString():返回字符序列的字符串表示形式。

CharSequence 接口的作用是为了实现字符序列的多态。通过实现该接口,不同的字符序列类型可以使用相同的方法,从而方便编程和提高代码的可读性。例如,当方法需要一个 CharSequence 类型的参数时,可以传递任何实现了 CharSequence 接口的类的对象。

在 Android 中,CharSequence 接口被广泛使用。使用 CharSequence 接口可以使程序更加灵活,提高代码的可重用性。

在这里插入图片描述接着再看 Spannable 接口,通过 注释翻译过来就是标记对象可以指向的文本的接口,Spannable 接口定义了添加、移除、获取富文本样式的方法,

setSpan(Object what, int start, int end, int flags):添加一个样式 what 到 start 到 end 之间的文本中,flags 参数用于控制样式的行为。removeSpan(Object what):从文本中移除指定的样式 what。getSpans(int start, int end, Class type):获取从 start 到 end 之间的文本中所有类型为 type 的样式。

使用 Spannable 接口可以实现很多应用场景,例如:富文本编辑器、聊天应用中的表情符号、高亮搜索关键字等等。它可以帮助程序员实现更好的用户交互体验,提高应用的质量和可用性。

在这里插入图片描述最后 我们看下主要的两个方法,这两个方法为富文本提供了实现

public SpannableStringBuilder append(CharSequence text) {}

该方法的作用是将一个字符序列 text 追加到 SpannableStringBuilder 实例的末尾,并返回追加后的 SpannableStringBuilder 对象
在这里插入图片描述public void setSpan(Object what, int start, int end, int flags) {}

通过翻译可知
用指定的对象标记指定的文本范围。标志确定当文本为。插入到跨度范围的开始或结束处。
在这里插入图片描述

二、使用步骤

1.示例代码

        SpannableStringBuilder builder1 = new SpannableStringBuilder();        builder1.append("Hello World ! Do you like programming?"); // 添加普通文本        builder1.setSpan(new StyleSpan(Typeface.BOLD), 0, 5, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); // 加粗        builder1.setSpan(new ForegroundColorSpan(Color.RED), 6, 11, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); // 字体颜色        builder1.setSpan(new UnderlineSpan(), 12, 17, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); // 下划线        builder1.setSpan(new URLSpan("https://www.baidu.com"), 18, 28, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); // 超链接        builder1.setSpan(new ImageSpan(this, R.mipmap.icon_pair_number), 29, 34, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); // 图片        span1Tv.setText(builder1);

2.参数对应

start:样式生效的开始位置,包括该位置

end: 样式结束的位置,不包括该位置

 注意 :设置字符串前2个文字的样式为  start:0,end:2。而不是 end:1

flags:取值有如下四个

Spannable.SPAN_EXCLUSIVE_INCLUSIVE
  前面不包括,后面包括,在Span前面输入的字符不应用 span 的效果,在后面输入的字符应用Span效果。
Spannable.SPAN_INCLUSIVE_EXCLUSIVE
  前面包括,后面不包括,即在文本前插入新的文本会应用该样式,而在文本后插入新文本不会应用该样式
Spannable.SPAN_INCUjsIVE_INCLUSIVE
  前面包括,后面包括,即在文本前插入新的文本会应用该样式,而在文本后插入新文本也会应用该样式
Spannable.SPAN_EXCLUSIVE_EXCLUSIVE
  前面不包括,后面不包括,在 Span前后输入的字符前后都不应用 span 的效果

what:对应的各种Span

1 BackgroundColorSpan : 背景色
2 ForegroundColorSpan : 颜色
3 RasterizerSpan : 光栅
4 StrikethroughSpan : 删除线
5 SuggestionSpan : 占位符
6 UnderlineSpan : 下划线
7 AbsoluteSizeSpan : 文本字体
8 ImageSpan : 图片
9 ScaleXSpan : 基于x轴文本水平缩放
10 StyleSpan : 字体样式:粗体、斜体等
11 SubscriptSpan : 下标
12 SuperscriptSpan : 上标
13 TypefaceSpan : 字体样式
14 URLSpan : 超链接
15 ClickableSpan : 点击事件
16 AbsoluteSizeSpan 字体大小

3.SpannableStringBuilder 基础样式示例

1 加粗
builder.setSpan(new StyleSpan(Typeface.BOLD), start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
2 斜体
builder.setSpan(new StyleSpan(Typeface.ITALIC), start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
3 加粗并斜体
builder.setSpan(new StyleSpan(Typeface.BOLD_ITALIC), start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
4 删除线
builder.setSpan(new StrikethroughSpan(), start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
5 下划线
builder.setSpan(new UnderlineSpan(), start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
6 字体颜色
builder.setSpan(new ForegroundColorSpan(color), start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
7 背景颜色
builder.setSpan(new BackgroundColorSpan(color), start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
8 文本大小
builder.setSpan(new AbsoluteSizeSpan(sizeInPx), start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
9 超链接
builder.setSpan(new URLSpan(url), start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
10 图片
builder.setSpan(new ImageSpan(context, resourceId), start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
11 文本水平缩放
builder.setSpan(new ScaleXSpan(scale), start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
12 字体样式
builder.setSpan(new TypefaceSpan(typeface), start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
13 行高
builder.setSpan(new LineHeightSpan() {    @Override    public void chooseHeight(CharSequence text, int start, int end, int spanstartv, int v, Paint.FontMetricsInt fm) {        fm.descent += lineHeight - fm.bottom;        fm.bottom = lineHeight;    }}, start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
14 字符间距
builder.setSpan(new ScaleXSpan(spacing), start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);

三、SpannableStringBuilder 自定义样式

除了基础样式之外,您还可以自定义其它样式,例如:文本描边、文本模糊等等。只需要继承 CharacterStyle 类,并重写 updateDrawState() 方法即可。

自定义span 文本模糊
 在这个示例中,我们自定义了一个 BlurSpan 类型,用于设置文本模糊效果。它继承自 CharacterStyle 类,重写了 updateDrawState() 方法,在该方法中设置了文本的模糊效果。 在 updateDrawState() 方法中,我们首先创建了一个 BlurMaskFilter 对象,该对象用于设置模糊半径和模糊类型。然后,我们使用 setMaskFilter() 方法设置文本的模糊效果。
public class BlurSpan extends CharacterStyle {    private float mRadius;    public BlurSpan(float radius) {        this.mRadius = radius;    }    @Override    public void updateDrawState(TextPaint tp) {        tp.setMaskFilter(new BlurMaskFilter(mRadius, BlurMaskFilter.Blur.NORMAL));    }}
自定义span 文本背景颜色
在这个示例中,我们自定义了一个 CustomBackgroundColorSpan 类型,用于设置文本的背景颜色。它继承自 CharacterStyle 类,重写了 updateDrawState() 方法,在该方法中设置了文本的背景颜色。
public class CustomSpan extends CharacterStyle {    private int mBackgroundColor;    public CustomSpan(int backgroundColor) {        this.mBackgroundColor = backgroundColor;    }    @Override    public void updateDrawState(TextPaint tp) {        tp.bGColor = mBackgroundColor;    }}
自定义span 文本阴影
 在这个示例中,我们自定义了一个 ShadowSpan 类型,用于设置文本阴影效果。它继承自 CharacterStyle 类,重写了 updateDrawState() 方法,在该方法中设置了文本的阴影效果。 在 updateDrawState() 方法中,我们首先创建了一个阴影层,该层的半径、偏移量和颜色分别由 mRadius、mDx、mDy 和 mShadowColor 决定。然后,我们使用 setShadowLayer() 方法设置阴影效果。
public class ShadowSpan extends CharacterStyle {    private float mRadius;    private float mDx;    private float mDy;    private int mShadowColor;    public ShadowSpan(float radius, float dx, float dy, int shadowColor) {        this.mRadius = radius;        this.mDx = dx;        this.mDy = dy;        this.mShadowColor = shadowColor;    }    @Override    public void updateDrawState(TextPaint tp) {        tp.setShadowLayer(mRadius, mDx, mDy, mShadowColor);    }}
自定义span 文本描边
 在这个示例中,我们自定义了一个 StrokeSpan 类型,用于设置文本描边效果。它继承自 CharacterStyle 类,重写了 updateDrawState() 方法,在该方法中设置了文本的描边效果。 在 updateDrawState() 方法中,我们首先设置了文本的样式为描边样式,然后设置了描边宽度和描边颜色。
public class StrokeSpan extends CharacterStyle {    private float mStrokeWidth;    private int mStrokeColor;    public StrokeSpan(float strokeWidth, int strokeColor) {        this.mStrokeWidth = strokeWidth;        this.mStrokeColor = strokeColor;    }    @Override    public void updateDrawState(TextPaint tp) {        tp.setStyle(Paint.Style.STROKE);        tp.setStrokeWidth(mStrokeWidth);        tp.setColor(mStrokeColor);    }}

总结

总之,SpannableStringBuilder 是一种很方便的创建富文本的方式,可以让您在文本中添加各种样式和效果。

如果对你有所帮助的话,不妨 Star 或 Fork,青山不改,绿水长流 有缘江湖再见 ~

源码地址:RichTextDemo

来源地址:https://blog.csdn.net/X_sunmmer/article/details/131301718

--结束END--

本文标题: Android 富文本 SpannableStringBuilder 探究

本文链接: https://lsjlt.com/news/427486.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Android 富文本 SpannableStringBuilder 探究
    文章目录 前言一、SpannableStringBuilder 是什么?二、使用步骤1.示例代码2.参数对应start:样式生效的开始位置,包括该位置end: 样式结束的位置,不包括该位置fl...
    99+
    2023-10-10
    android java
  • Android实现EditText的富文本编辑
    前言本文是我之前写的这篇文章《Android图文混排-实现EditText图文混合插入上传》的升级版,除了在EditText实现了图片上传之外,还包含了视频上传、云盘文件上传、录音上传以及显示上传进度。目前应用于蜜蜂-集结号-任务模块。首先...
    99+
    2023-05-30
    android edittext 富文本编辑
  • Android显示富文本+夜间深色模式
    目录前言方案一:存在问题:方法二:富文本内容:演示效果:总结前言 在工作中有遇到这样的需求,需要把hmtl的富文本内容,进行深色模式适配。原先的富文本内容是在直接在webview上进...
    99+
    2024-04-02
  • MySQL存储富文本
    MySQL可以使用以下两种格式来存储富文本: 文本格式(Text):这是一种用于存储较短文本的数据类型,最大存储长度为65,535个字符。适合存储较小的文本,例如文章摘要、评论等。但是对于较长的富文...
    99+
    2023-10-01
    mysql 数据库
  • Android开发实现TextView显示丰富的文本
    本文实例讲述了Android开发实现TextView显示丰富的文本的方法。分享给大家供大家参考,具体如下: 如图,显示html的元素控件,点击连接实现上网,发email,拨号 ...
    99+
    2022-06-06
    android开发 Android
  • Android富文本实现的几种方式汇总
    目录Android富文本的实现的几种方式一,Html的方式实现1.1 占位符的处理1.2 Html的占位符1.3 自定义Html标签二,Span的几种实现方式2.1 java - S...
    99+
    2024-04-02
  • Android 中的注解深入探究
    本文系GDG Android Meetup分享内容总结文章 注解是我们经常接触的技术,Java有注解,Android也有注解,本文将试图介绍Android中的注解,以及Butt...
    99+
    2022-06-06
    注解 Android
  • php 富文本怎么转 html
    本文操作环境:windows7系统、PHP7.1版、DELL G3电脑php 富文本怎么转 htmlPHP 富文本转html、word、pdf文件下载富文本我这里使用的是layui,因为 它轻……至于富文本如何使用文档记载非常简单,有问题再...
    99+
    2016-11-04
    php 富文本 html
  • vue如何引入富文本
    在vue中引入vue-quill-editor富文本插件的方法:1.新建vue.js项目;2.使用npm安装vue-quill-editor依赖包;3.使用import方法引入vue-quill-editor;具体步骤如下:首先,在vue-...
    99+
    2024-04-02
  • php富文本如何转html
    本篇内容介绍了“php富文本如何转html”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!php富文本转html的方法:1、打开相应的代码文件...
    99+
    2023-06-25
  • django中使用tinymce 富文本
    1、首先去python的模块包的网站下载一个django-tinymce的包 https://pypi.python.org/pypi/django-tinymce/#downloads   官网下载地址   ...
    99+
    2023-01-31
    文本 django tinymce
  • Java Swing 组件库探究:打造丰富多样的用户界面
    Swing 组件 Swing 库提供了各种组件,可用于构建各种用户界面元素,包括: 容器: 组织和布局其他组件。例如 BorderLayout、FlowLayout 按钮: 用于触发操作的按压式元素。例如 JButton 标签: 显示文...
    99+
    2024-04-02
  • Android使用Span打造丰富多彩的文本详解
    目录1.引言2.SpannableStringBuilder的基本用法3.使用Span给文本添加效果3.1 AbsoluteSizeSpan3.2 BackgroundColorSp...
    99+
    2024-04-02
  • php:html富文本提取text普通文本内容
    ...
    99+
    2023-09-20
    php
  • 详解Android控件之DatePicker、TimePicker探究
    一、DatePicker继承自FrameLayout类,日期选择控件的主要功能是向用户提供包含年、月、日的日期数据并允许用户对其修改。如果要捕获用户修改日期选择控件中的数据事件...
    99+
    2022-06-06
    timepicker datepicker Android
  • Android控件之TextView的分析探究
      在android中,文本控件主要包括TextView控件和EditView控件,本节先对TextView控件的用法进行详细介绍。   &nbs...
    99+
    2022-06-06
    Android
  • Android源码探究之BaseDexClassLoader的使用
    目录前言一.dexPath(String)二.optimizedDirectory三.librarySearchPath四.parent五.总结前言 一共有4个参数,分来来讲。 1:...
    99+
    2022-11-13
    Android BaseDexClassLoader Android BaseDexClassLoader源码
  • 探究PHP中多态性的本质
    多态性是面向对象编程中一个非常重要的概念,它能够使得不同对象对同一个消息做出不同的响应。在PHP中,多态性的实现主要通过继承和接口实现。本文将探究PHP中多态性的本质,并通过具体的代码...
    99+
    2024-04-02
  • Golang 函数地址的本质探究
    函数地址在 go 中是指向函数值的指针,它包含函数机器代码的指针和该函数闭包变量的环境。其功能包括:存储函数地址,以便调用或传递;用于创建闭包,允许访问定义域之外的变量。 Go 语言函...
    99+
    2024-04-08
    golang 函数地址 作用域
  • Android App自动化性能测试探究
      前言   Android App的性能测试是移动测试过程中必不可少的一个环节。在我们项目组内,性能测试的过程是这样的,先设置测试场景,然后一边手工执行场景,一边通过工...
    99+
    2022-06-06
    性能 性能测试 app 测试 Android
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作