Android 富文本 SpannableStringBuilder 探究

这篇具有很好参考价值的文章主要介绍了Android 富文本 SpannableStringBuilder 探究。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


前言

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

一、SpannableStringBuilder 是什么?

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

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

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

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

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

stringbuilder android,Demo,功能,android,java接着再看 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<T> type):获取从 start 到 end 之间的文本中所有类型为 type 的样式。

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

stringbuilder android,Demo,功能,android,java最后 我们看下主要的两个方法,这两个方法为富文本提供了实现

public SpannableStringBuilder append(CharSequence text) {}

该方法的作用是将一个字符序列 text 追加到 SpannableStringBuilder 实例的末尾,并返回追加后的 SpannableStringBuilder 对象
stringbuilder android,Demo,功能,android,javapublic void setSpan(Object what, int start, int end, int flags) {}

通过翻译可知
用指定的对象标记指定的文本范围。标志确定当文本为。插入到跨度范围的开始或结束处。
stringbuilder android,Demo,功能,android,java

二、使用步骤

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() 方法设置文本的模糊效果。
/**
 * 自定义span 文本模糊
 */
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://www.toymoban.com/news/detail-703098.html

到了这里,关于Android 富文本 SpannableStringBuilder 探究的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Flutter中为控件添加交互,带你一起探究Android事件分发机制

    ), ); } } 代码运行效果如图: 2.父widget管理widget的状态 对于父widget来说,管理状态并告诉其子widget何时更新通常是最有意义的。 例如,IconButton允许您将图标视为可点按的按钮。 IconButton是一个无状态的小部件,因为我们认为父widget需要知道该按钮是否被点击来采取相应的处理

    2024年04月11日
    浏览(42)
  • Android 10(Q) 以上普通 APP 隐藏应用图标问题探究及解决方案

    aosp 版本 10.0 系统 aosp 版本 13.0 系统 APP AndroidManifest.xml 中通过 activity-alias 配置带 LAUNCHER 属性 category,并且 android:enabled=“true” 10.0 系统中可安装后正常显示 icon,通过 setComponentEnabledSetting 隐藏 icon 成功,桌面上不留下 app 相关任何图标 13.0 系统中可安装后正常显示 icon,通过

    2024年01月22日
    浏览(37)
  • 【Android Studio程序开发】文本显示 -- 设置文本的颜色

    除了设置文字大小,文字颜色也经常需要修改,毕竟Android默认的灰色文字不够醒目。在Java代码中调 用setTextColor方法即可设置文本颜色,具体在Color类中定义了12种颜色,详细的取值说明见下表 比如以下代码便将文本视图的文字颜色改成了绿色: ( 完整代码见下文) 可是X

    2023年04月10日
    浏览(47)
  • Android获取文本的宽度和高度

    方法一:先绘制文本所在的矩形区域,再获取矩形区域的宽度 上述方法由于矩形边框紧贴文字,所有没有多余的空间。 方法二:通过Paint的 measureText 方法直接测量文本宽度 此方法计算出的宽度会加上开始和结尾的空间,这个空间就是文字和文字之间的空间,为了美观而存在

    2024年02月09日
    浏览(51)
  • Android对接华为AI - 文本识别

    在开发应用前: 1、需要在AppGallery Connect中配置相关信息,包括:注册成为开发者和创建应用。 2、使用ML Kit云侧服务(端侧服务可不开通)需要开发者在AppGallery Connect上打开ML Kit服务开关。 工程根目录build.gradle文件 app module下的build.gradle依赖华为基础SDK包与语言识别模型包:

    2024年02月03日
    浏览(34)
  • Android 之 TextView (文本框)详解

    学习完Android中的六大布局,从本节开始我们来一个个讲解Android中的UI控件,本节给大家带来的UI控件是:TextView(文本框),用于显示文本的一个控件,另外声明一点,我不是翻译API文档,不会一个个属性的去扣,只学实际开发中常用的,有用的,大家遇到感觉到陌生的属性可以

    2024年02月09日
    浏览(39)
  • android 富文本编辑器有哪些

    android 富文本编辑器有哪些 有许多优秀的开源富文本编辑器插件可用于Android平台,下面列举几个常用的: RichEditorView:这是一个基于Web技术的富文本编辑器插件,有多种编辑功能与选项。 Android Rich Text Editor:这是一个轻量级的富文本编辑器插件,支持加粗、斜体、下划线等

    2024年02月15日
    浏览(43)
  • Android App开发超实用实例 | OpenCV在Android手机实现在图像上添加文本

     OpenCV是一个基于BSD许可(开源)发行的跨平台计算机视觉库,它可以运行在Linux、Windows、Android和Mac OS等操作系统上。OpenCV原本由一系列 C 函数和少量 C++ 类构成,同时提供了Python等其他语言的接口,它实现了图像处理和计算机视觉方面的很多通用算法。下面这个实例演示了使用

    2024年02月03日
    浏览(47)
  • Android如何自定义输入文本对话框?

      笔者研究的课题涉及到安卓软件开发,在开发过程中,发现普通的显示消息对话框一般可以调用android自带包实现,而要通过文本框输入交互,则无法轻易实现。在查阅网络资料后,实现了自定义输入文本对话框的功能,本文记录实现自定义输入文本对话框的过程。   

    2024年02月13日
    浏览(42)
  • Android 蓝牙通信(通过 BluetoothSocket 传输文件/文本)

    前言 :Android 蓝牙通信,通过BluetoothSocket方式建立长连接并传输文本或文件。前段时间有个项目的功能需求是:AR眼镜通过蓝牙的方式连接北斗设备,当北斗设备收到文本/语音/图片消息时转发到AR眼镜上,AR眼镜也可以发送文本/语音/图片数据到北斗设备上并转发到指定的目标

    2024年04月14日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包