Android Text设置神器之SpanableString

el/2024/4/19 23:13:25

TextView在Android中几乎是再常见不过的控件了,几乎遍布在各个角落里,对TextView并没有什么技术点来做分析,但是有时候可能会需要你在项目中处理一些特殊字体,比如下划线,横穿线,亦或者是为TextView部分字体设置点击或者颜色背景等等,这点需求虽然不是什么难事,但是选不好解决方法真的会可能会让你折腾好久。说了这么多无非就是开篇引个题,下面为大家介绍SpanableString哈。

里面需要具体分析的技术点并不是太多,我先给大家贴上源码,看看google是怎么定义这么一个东东的。

 
  1. /**

  2. * This is the class for text whose content is immutable but to which

  3. * markup objects can be attached and detached.

  4. * For mutable text, see {@link SpannableStringBuilder}.

  5. */

 

上面这段内容摘自安卓SpanableString源码里面的注释,大体意思就是说

这是一个内容和标记都可以更改的文本类

其实源码内容并不是太多,感兴趣的话可以去查看下源码

源码关键的两个方法

 
 
  1. public void setSpan(Object what, int start, int end, int flags) {}

  2.  
  3. public void removeSpan(Object what) {}

  4.  

我先带大家简单使用下这个控件,然后在来分析,其实说到这里有一个小细节开篇的时候忘记跟大家提起了,就是看到SpanableString,其实还有SpanableStringBuilder,其用法类似,大家可以类比String跟StringBuilder来区别,我在此不多解释了,就像你会有String肯定也会使用StringBuilder,我就不在做重复的解释了,下面先来具体举个例子带大家认识下这个东东。

 

 
  1. SpannableString spannableString = new SpannableString("转点软件技术工作室技术分享专题");

  2. ForegroundColorSpan colorSpan = new ForegroundColorSpan(Color.parseColor("#009ad6"));

  3. spannableString.setSpan(colorSpan, 0, 3, Spannable.SPAN_EXCLUSIVE_INCLUSIVE);

  4. ((TextView)findViewById(R.id.mode1)).setText(spannableString);

  5.  

 

通过上述代码就可以实现开篇提到的给部分字体设置颜色的效果,那趁着大家现在对SpanableString有个大概的认识之后我先简单分析下流程,然后再把其他使用方法给大家总结下。

我个人是吧SpanableString理解成一个特殊的字符串,不同于String的是他可以在上面做出一些花哨的东西,示例代码中分四步完成了这一操作。

1.先是new出一个SpanableString对象,并为其初始化一个字符串,

2.然后通过span的方式生成一个colorSpan对象,这里的span可以设置成其他任何你想设置的形式,比如开篇提到的下划线或者上划线,点击事件都可以,对应于不同的span对象,稍后我整理给大家。

3.为SpanableString设置span。setSpan的四个参数稍后我结合源码分析给大家。

4.为textView设置特殊样式的字体。

 

具体分析:

从上面的步骤中大家也看出了,其实设置特殊样式的关键步骤在第2步,下面我先为大家整理里具体都可以设置那些特殊样式:

常用到的Span大致如下

BackgroundColorSpan : 文本背景色

ForegroundColorSpan : 文本颜色

MaskFilterSpan : 修饰效果,如模糊(BlurMaskFilter)浮雕

RasterizerSpan : 光栅效果

StrikethroughSpan : 删除线

SuggestionSpan : 相当于占位符

UnderlineSpan : 下划线

AbsoluteSizeSpan : 文本字体(绝对大小)

DynamicDrawableSpan : 设置图片,基于文本基线或底部对齐。

ImageSpan : 图片

RelativeSizeSpan : 相对大小(文本字体)

ScaleXSpan : 基于x轴缩放

StyleSpan : 字体样式:粗体、斜体等

SubscriptSpan : 下标(数学公式会用到)

SuperscriptSpan : 上标(数学公式会用到)

TextAppearanceSpan : 文本外貌(包括字体、大小、样式和颜色)

TypefaceSpan : 文本字体

URLSpan : 文本超链接

ClickableSpan : 点击事件

其用法大家可以套用示例代码中的样子,无非是具体的Span类型不同,用法一致。

 

现在我解释刚刚在第三步中说到的setSpan的用法,以及4个参数具体代表的含义,先给大家贴上setSpan的源码。

 
  1. public void setSpan(Object what, int start, int end, int flags) {

  2. super.setSpan(what, start, end, flags);

  3. }


上述源码是我直接从SpanableString类中摘取出来的,

第一个参数  Object what:这个what就是上面分享的各种Span的类型,大家根据需要自己指定。

第二个第三个参数 int start int end:这两个参数是Span开始跟结束的位置。

第四个参数: int flag 参数用4中类型,分别代表的意思为span开始结束的位置包含或者不包含start 、end,

flags的取值如下:

Spannable. SPAN_INCLUSIVE_EXCLUSIVE:前面包括,后面不包括,即在文本前插入新的文本会应用该样式,而在文本后插入新文本不会应用该样式

Spannable. SPAN_INCLUSIVE_INCLUSIVE:前面包括,后面包括,即在文本前插入新的文本会应用该样式,而在文本后插入新文本也会应用该样式

Spannable. SPAN_EXCLUSIVE_EXCLUSIVE:前面不包括,后面不包括

Spannable. SPAN_EXCLUSIVE_INCLUSIVE:前面不包括,后面包括


好了,看到这里我想你应该已经掌握了具体怎么设置特殊并且花哨的textview了,其他各种Span的设置,代码大同小异我就不重复贴代码带大家演示了,有一个小细节需要大家注意下,我贴上代码算是提醒下大家吧,在设置ClickableSpan的时候千万别忘了setMovementMethod。示例代码如下:

 
  1. SpannableString spannableString = new SpannableString("转点软件技术工作室技术分享");

  2. ClickableSpan clickableSpan = new ClickableSpan() {

  3. @Override

  4. public void onClick(View widget) {

  5. //TODO 点击事件在此处理

  6. System.out.println("转点软件被点击了.....");

  7. }

  8. };

  9. spannableString.setSpan(clickableSpan,0,3, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);

  10. textView.setText(spannableString);

  11. textView.setMovementMethod(LinkMovementMethod.getInstance()); //为TextView设置完Span后,别忘了setMovementMethod

  12.  

http://www.ngui.cc/el/5181716.html

相关文章

Recyclerview内部的bug:IndexOutOfBoundsException: Inconsistency detected

错误日志 java.lang.IndexOutOfBoundsException: Inconsistency detected. Invalid item position 15(offset:15).state:25 android.support.v7.widget.RecyclerView{8dfa7c VFE...... ........ 15,15-795,1584 #7f090068 app:id/classics_list}, adapter:com.huishoubao.nqy.a…

Android客户端修改加载的h5页面样式

为什么要修改 有的网页在你设置了WebView的WebSetting的时候,在手机端的显示会比较满意,但是部分网页以及部分手机就算你设置了WebSetting,但是在显示的时候还是会有问题,比如网页顶部的标题字体太大,当显示到手机的时候字体出现了重叠,影响用户体验效果。 如何修改 W…

Transition:Activity过渡、共享元素动画

本文原项目地址为:https://github.com/lgvalle/Material-Animations 在文章最后,有我自己对着这个项目手敲的一份。 代码基本一模一样,只有略微的修改,加了一些注释,以及将其中大多数英文翻译成了中文。 此篇 API 均为…

ModeMVC:在activity中堆代码就叫做MVC吗?

首先,看看这是不是自己 现在Android编程中如果在你没有特别认真设计框架,没有认真考虑面向对象的六大原则对编程重要性的时候,我们一般都是认为自己使用的是MVC的框架模式。但是你使用的真的是MVC吗?还是只是单纯的在activity中堆…

Android饼状图绘制

效果图 代码 https://github.com/269138004/PieChartsView 说明 有时间再补充

Android canvas.save()与canvas.restore()的使用总结

含义 canvas.save(); 画布将当前的状态保存 canvas.restore(); 画布取出原来所保存的状态 使用 canvas.save();与canvas.restore();一般结合使用,.save()函数在前,.restore()函数在后,用来保证在这两个函数之间所做的操作不会对原来在c…

一个小Demo来理解关于IPC(进程间通信)中的aidl

项目地址: Server端代码:Server端代码链接 Client端代码:Client端代码链接 1、IPC的基本要求 IPC(Inter-Process Communication)进程间通信是要在两个相互独立的进程之间进行信息的传递,在Android中每个进程都会被分配一个独立的虚拟机,以及内存空间,还会有自己的App…

AtomicBoolean的介绍与使用

AtomicBoolean是java.util.concurrent.atomic包下的原子变量,这个包里面提供了一组原子类。其基本的特性就是在多线程环境下,当有多个线程同时执行这些类的实例包含的方法时,具有排他性,即当某个线程进入方法,执行其中…

android 手机分辨率与DPI对照表

分辨率对应DPI ldpi QVGA (240320) mdpi HVGA (320480) hdpi WVGA (480800),FWVGA (480854) xhdpi 720P(1280*720) xxhdpi 1080p(1920*1080 ) xxxhdpi 4K(38402160) 手机常见分辨率: 4:3 VGA 640*…

GridLayoutManager中setSpanSizeLookup()的基本操作,实现布局多样化

效果图 上面布局格式为1-2-1-2,你可以使用itemtype做多布局,但是还有一种更简单的方法就是使用GridLayoutManager的setSpanSizeLookup()函数 代码如下 适配器和布局文件的代码就不贴出了,只贴出关键代码 private void initView() {recyclerView = findViewById(R.id.