Android富文本总结

一、应用场景介绍

在Android应用开发中,有很多UI会画出一些特别炫酷的界面出来,其中一行文字里会有特殊的字会有其他颜色并加粗,着重说明,这样的我们可以用笨办法用几个TextView来链接,但设备适配是一个问题,因为有可能有颜色的那几个文字恰好在换行处怎么办。甚至可能一段文字里面会穿插一些图标,这又怎么办,那么今天我们的主角富文本编辑就很好解决了这一问题。

二、富文本SpannableString能做的事

为文本特定地方添加各种样式和事件,样式包括颜色,大小,背景,删除线,上下标,粗斜体,图片。事件包括点击事件,超链接等。核心代码为

val sb = SpannableString(content) //content表示文本内容
sb.setSpan(
	ForegroundColorSpan(specailColor), //span类型
 	startIndex, //span的起始index
 	endIndx, //span的结束index(一般为startIndex + replaceTxt.length)
 	Spannable.SPAN_EXCLUSIVE_EXCLUSIVE //span类型,设置startIndex和endIndex的开闭区间
)
textview.text = sb

特殊的:setSpan方法的最后一个参数flag取值有以下四种:
Spannable.SPAN_EXCLUSIVE_EXCLUSIVE:前后都不包括,即在指定范围的前面和后面插入新字符都不会应用新样式 (start,end)
Spannable.SPAN_EXCLUSIVE_INCLUSIVE:前面不包括,后面包括。即仅在范围字符的后面插入新字符时会应用新样式(start,end]
Spannable.SPAN_INCLUSIVE_EXCLUSIVE:前面包括,后面不包括。[start,end)
Spannable.SPAN_INCLUSIVE_INCLUSIVE:前后都包括。 [start,end]

三、简单的span应用示例

3.1、 文本颜色

val content = "这是一段文字,需要特殊颜色的内容"
val replaceTxt = "特殊颜色"
val sb = SpannableString(content) //content表示文本内容
val startIndex = content.indexOf(replaceTxt)
val endIndex = startIndex + replaceTxt.length
val specailColor = Color.parseColor("#0644a3")
sb.setSpan(
   ForegroundColorSpan(specailColor), //span类型 specailColor颜色
	startIndex, //span的起始index
	endIndx, //span的结束index(一般为startIndex + replaceTxt.length)
	Spannable.SPAN_EXCLUSIVE_EXCLUSIVE //span类型,设置startIndex和endIndex的开闭区间
)
textview.text = sb

3.2、 特殊文字点击

val content = "这是一段文字,需要点击效果的内容"
val replaceTxt = "点击效果"
val sb = SpannableString(content) //content表示文本内容
val startIndex = content.indexOf(replaceTxt)
val endIndex = startIndex + replaceTxt.length
val sb = SpannableString(content) //content表示文本内容
val clickSpan: ClickableSpan = object : ClickableSpan() {
    
    
           override fun onClick(widget: View) {
    
    
          			Toast.makeText(context, "点击$replaceTxt", Toast.LENGTH_SHORT).show()
           }
           
           override fun updateDrawState(ds: TextPaint) {
    
    
               ds.run {
    
     //这里可以动态设置点击区域字符的字体样式,比如颜色、字体、大小、下划线、删除线等
                   typeface = FontManager.getNumberFont()
                   color = ContextCompat.getColor(context, R.color.c_fe0000)
               }
           }
       }
sb.setSpan(
   clickSpan, //span类型
	startIndex, //span的起始index
	endIndx, //span的结束index(一般为startIndex + replaceTxt.length)
	Spannable.SPAN_EXCLUSIVE_EXCLUSIVE //span类型,设置startIndex和endIndex的开闭区间
)
textview.movementMethod = LinkMovementMethod.getInstance()  //点击需要设置,不然没有点击事件
// textview点击时会有一个高亮色,如果不需要可以设置highlightColor为透明色
textview.text = sb

3.3、文本字体大小

val sb = SpannableString(content) //content表示文本内容
sb.setSpan(
   AbsoluteSizeSpan(26,true), //第二个参数表示单位是否是dp
	startIndex, //span的起始index
	endIndx, //span的结束index(一般为startIndex + replaceTxt.length)
	Spannable.SPAN_EXCLUSIVE_EXCLUSIVE //span类型,设置startIndex和endIndex的开闭区间
)
textview.text = sb

3.4、文本中插入图标

val sb = SpannableString(content) //content表示文本内容
val d = getResources().getDrawable(R.mipmap.ic_launcher)
d.setBounds(0, 0, d.getIntrinsicWidth(), d.getIntrinsicHeight())
val span = ImageSpan(d, ImageSpan.ALIGN_BASELINE) //图标基于文本基线对齐 对齐方式默认底部对齐
sb.setSpan(
   span, //span类型
	startIndex, //span的起始index
	endIndx, //span的结束index(一般为startIndex + replaceTxt.length)
	Spannable.SPAN_EXCLUSIVE_EXCLUSIVE //span类型,设置startIndex和endIndex的开闭区间
)
textview.text = sb

四、SpannableStringBuilder与SpannableString

SpannableString只能设置一个span,如果一条内容中不同位置上有多个特殊效果,就无法得到实现。当然,同一个位置上多个特殊效果,我们可以重写Span的updateDrawState(ds: TextPaint) 方法。
SpannableStringBuilder则可以设置多个span,每个span可以设置在不同位置,也可以设置在同一位置上。
使用方式如下

val spb = SpannableStringBuilder(content)
spb.setSpan(span1, start, end, flag)
spb.setSpan(span2, start, end, flag)
textview.text = spb

特别的:SpannableStringBuilder中的内容可以通过append(text: String)添加, 添加新内容后需要注意内容的下标变化。

猜你喜欢

转载自blog.csdn.net/qq_39734865/article/details/95461325