常见的设置字体颜色有:
1.在xml布局文件内:android:textColor="#9da4b3"
2.在代码里:
textView.setTextColor(ContextCompat.getColor(context, R.color.color_ffffff))
但是需求是不定的,有时候需要动态配置展示内容,或者对指定文本内容进行特殊处理,这时候我们就可以用到SpannableString 和 Html.fromHtml()
3.SpannableString:实现指定位置颜色,大小,特效,点击事件等等 ,详情点击下面链接: CheckBox复选框和SpannableStringhttps://blog.csdn.net/LoveFHM/article/details/108244239?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522164552601316780255285349%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=164552601316780255285349&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~first_rank_ecpm_v1~rank_v31_ecpm-1-108244239.nonecase&utm_term=Span&spm=1018.2226.3001.4450
4.Html.fromHtml() 因为需求是展示一条消息字符串,但是里面有三个占位符,部分内容展示效果不同,且长度不定,所以用Spannable就会有点麻烦,于是便想到了Html.fromHtml().
具体使用:
override fun init(data: ImMsgIn, chatType: Any) {
if (childCount == 0) {
addView(contentLayout)
}
val giftContent: String? = getGift(data)
tvContent.text = Html.fromHtml(giftContent)
tvContent.movementMethod = LinkMovementMethod.getInstance()
}
private fun getGift(data: ImMsgIn): String? {
val isOwner = data.getSelfUserId() == data.getOwnerId()
val senderName = data.getSenderName()
val giftName = data.getGiftName()
val changedSenderName = "<font color='#FEA30F'>$senderName</font>"
val changedGiftName = "<font color='#FEA30F'>$giftName</font>"
return if (!isOwner && data.getSenderId() != data.getSelfUserId())
String.format(resources.getString(R.string.im_ui_gift_other_to_owner, changedSenderName, changedGiftName, data.getGiftAmount().toString(), data.getGroupName()))
else if (!isOwner && data.getSenderId() == data.getSelfUserId()) {
String.format(resources.getString(R.string.im_ui_gift_me_to_owner, changedGiftName, data.getGiftAmount().toString(), data.getGroupName()))
} else if (isOwner) {
String.format(resources.getString(R.string.im_ui_gift_owner, changedGiftName, data.getGiftAmount().toString(), changedSenderName))
} else null
}
展示效果:
注意事项:1、之前我在代码里,用的是 String.format(resources.getString(R.string.im_ui_gift_other_to_owner, Html.fromHtml(changedSenderName), Html.fromHtml(changedGiftName), data.getGiftAmount().toString(), data.getGroupName())). 想的是先变身,再拼接,结果发现颜色设置无效。
2、所以,Html.fromHtml()这个方法,要在拼接后再使用这个方法。即上面代码的 tvContent.text = Html.fromHtml(giftContent)
3、当然,val changedSenderName = "<font color='#FEA30F'>$senderName</font>" 可以在这里面对字体可以有更多的设置(粗体,大小,超链接),而Html.fromHtml(giftContent) 返回的其实也是个Spanned对象。
4、以下是android中提供的各种span及用途:(可能不完全,可以去看看源码)
BackgroundColorSpan 背景色
ClickableSpan 文本可点击,有点击事件
ForegroundColorSpan 文本颜色(前景色)
MaskFilterSpan修饰效果,如模糊(BlurMaskFilter)、浮雕(EmbossMaskFilter)
MetricAffectingSpan 父类,一般不用
RasterizerSpan 光栅效果
StrikethroughSpan 删除线(中划线)
SuggestionSpan 相当于占位符
UnderlineSpan 下划线
AbsoluteSizeSpan 绝对大小(文本字体)
DynamicDrawableSpan 设置图片,基于文本基线或底部对齐。
ImageSpan 图片
RelativeSizeSpan 相对大小(文本字体)
ReplacementSpan 父类,一般不用
ScaleXSpan 基于x轴缩放
StyleSpan 字体样式:粗体、斜体等
SubscriptSpan 下标(数学公式会用到)
SuperscriptSpan 上标(数学公式会用到)
TextAppearanceSpan 文本外貌(包括字体、大小、样式和颜色)
TypefaceSpan 文本字体
URLSpan 文本超链接
6月21日补充:如果发现设置了颜色无效,可以试试以下方法
1. 设置字体颜色的时候,颜色值需要转义符,如代码所示:
val timeshareName = "<font color=\"#22BB3B\">${timeShare?.name}</font>"
2.不要透明度, 我之前用的FF22BB3B发现颜色无效,把FF去掉后,颜色显示正常了
3.Html.fromHtml()过期(出现在Android7.0以后),只需要在传一个参数flags,其中flags可选两个参数:
Html.FROM_HTML_MODE_COMPACT:html块元素之间使用一个换行符分隔
Html.FROM_HTML_MODE_LEGACY:html块元素之间使用两个换行符分隔