1、SpannableStringBuilder和SpannableString的区别类似与StringBuilder、String
2、SpannableStringBuilder可以拼接,而SpannableString不可拼接
SpannableStringBuilder和SpannableString主要通过使用setSpan(Object what, int start, int end, int flags)改变文本样式
start: 指定Span的开始位置 end: 指定Span的结束位置,并不包括这个位置。 flags:取值有如下四个 Spannable. SPAN_INCLUSIVE_EXCLUSIVE:前面包括,后面不包括,即在文本前插入新的文本会应用该样式,而在文本后插入新文本不会应用该样式 Spannable. SPAN_INCLUSIVE_INCLUSIVE:前面包括,后面包括,即在文本前插入新的文本会应用该样式,而在文本后插入新文本也会应用该样式 Spannable. SPAN_EXCLUSIVE_EXCLUSIVE:前面不包括,后面不包括 Spannable. SPAN_EXCLUSIVE_INCLUSIVE:前面不包括,后面包括 what: 对应的各种Span,不同的Span对应不同的样式。已知的可用类有: BackgroundColorSpan : 文本背景色 ForegroundColorSpan : 文本颜色 MaskFilterSpan : 修饰效果,如模糊(BlurMaskFilter)浮雕 RasterizerSpan : 光栅效果 StrikethroughSpan : 删除线 SuggestionSpan : 相当于占位符 UnderlineSpan : 下划线 AbsoluteSizeSpan : 文本字体(绝对大小) DynamicDrawableSpan : 设置图片,基于文本基线或底部对齐。 ImageSpan : 图片 RelativeSizeSpan : 相对大小(文本字体) ScaleXSpan : 基于x轴缩放 StyleSpan : 字体样式:粗体、斜体等 SubscriptSpan : 下标(数学公式会用到) SuperscriptSpan : 上标(数学公式会用到) TextAppearanceSpan : 文本外貌(包括字体、大小、样式和颜色) TypefaceSpan : 文本字体 URLSpan : 文本超链接 ClickableSpan : 点击事件
/** * 使用SpannableString设置样式——字体颜色 */ private void modemo() { SpannableString spannableString = new SpannableString("请关注彭老希,我会持续更新喔"); //需要更改的颜色值 ForegroundColorSpan colorSpan = new ForegroundColorSpan(Color.parseColor("#009ad6")); // 0 , 8 需要改变字体颜色的index 坐标位置 spannableString.setSpan(colorSpan, 0, 8, Spannable.SPAN_EXCLUSIVE_INCLUSIVE); //实现变色的文本视图 ((TextView)findViewById(R.id.mode1)).setText(spannableString); }
创建SpannableString的时候,传入需要显示的字符串。使用ForegroundColorSpan为文字设置颜色。
private fun setSpannableText( style : SpannableStringBuilder ,start:Int,end:Int ,start2:Int,end2:Int): SpannableStringBuilder{ //设置服务协议点击事件 val serviceAgreement: ClickableSpan = object : ClickableSpan() { override fun onClick(widget: View) { //往服务页面跳转 } override fun updateDrawState(ds: TextPaint) { super.updateDrawState(ds) ds.isUnderlineText = false ds.color = ContextCompat.getColor(applicationContext,R.color.color_009af1) } } //设置隐私政策点击事件 val privacyPolicy: ClickableSpan = object : ClickableSpan() { override fun onClick(widget: View) { //往服务页面跳转 } override fun updateDrawState(ds: TextPaint) { super.updateDrawState(ds) ds.isUnderlineText = false ds.color = ContextCompat.getColor(applicationContext,R.color.color_009af1) } } style.setSpan(serviceAgreement, start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE) style.setSpan(privacyPolicy, start2, end2, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE) return style }
var style = SpannableStringBuilder() style.append("我已阅读并同意《用户服务协议》及《隐私政策》") style = setSpannableText(style,7,15,16,22) //这一行必须要 readAgree.movementMethod = LinkMovementMethod.getInstance() //赋值 readAgree.text = style //设置高亮颜色透明,因为点击会变色 readAgree.highlightColor = ContextCompat.getColor(applicationContext,R.color.transparent)