/**
* @param textView TextView
* @param colorId 目标颜色
* @param colorContent 需要改变颜色的文字
* @param what 设置变色文字的点击事件
*/
fun changeColor(
textView: TextView?,
colorId: Int,
vararg colorContent: String,
onColorTextClick: Array<OnColorTextClick>? = null,
hasBold: Boolean = false
) {
//先把所有的文字都加入SpannableString
val spannableString = SpannableString(textView?.text.toString())
//几种颜色值
colorContent.forEachIndexed { index, colorString ->
if (onColorTextClick != null) {
//设置点击事件
setSpan(
spannableString,
//对应几种点击监听
onColorTextClick[index],
spannableString.toString(),
colorString,
Spanned.SPAN_INCLUSIVE_INCLUSIVE
)
}
// 变色
setSpan(
spannableString,
ForegroundColorSpan(getResColor(colorId)),
spannableString.toString(),
colorString,
Spanned.SPAN_INCLUSIVE_INCLUSIVE
)
if (hasBold) {
// 加粗
setSpan(
spannableString,
StyleSpan(Typeface.BOLD),
spannableString.toString(),
colorString,
Spanned.SPAN_INCLUSIVE_INCLUSIVE
)
}
}
// 去掉点击之后的高亮背景
textView?.highlightColor = getResColor(android.R.color.transparent)
textView?.text = spannableString
textView?.movementMethod = LinkMovementMethod.getInstance()
}
/**
* ss:SpannableString 总的string转成的
* what 第一个方法传递下来的是点击监听,第二个传递下来的是颜色值
* 第三个是加粗,你也可以跟着设计传递其它的。
* 所以,最后就是总的SpannableString里面通过setSpan方法
* 然后设置传递下来的what,从target里面获取到开始和结束的索引
* 最后就是flag
*/
private fun setSpan(
ss: SpannableString,
what: Any,
source: String,
target: String,
flag: Int
): SpannableString {
val index = source.indexOf(target)
if (index != -1) {
ss.setSpan(what, index, index + target.length, flag)
}
return ss
}