Android - 文本后面添加标签
原理:
定义一个view-》设置标签相关信息-大小,颜色,背景 -》 转换为bitmap -》 ImageSpan 对象-》 spannableStringBuilder 对象设置
给文本赋值:TextView .text = spannableStringBuilder 对象
效果:
配合databinding实现:说明下面的 pd方法 为kt拓展函数 - 转为px
KT-先拓展标签方法
object TextViewAdapter {
//给标题 后面添加标签
@BindingAdapter("textTag")
@JvmStatic
fun adaptTextTag(view: TextView, value: String?) {
val text = value ?: "";
if (text.isEmpty()) return
val textList = text.split("@")
if (textList.size > 1) {
view.text = createTag(view, textList.get(0), textList.get(1))
} else {
view.text = text
}
}
@JvmStatic
private fun createTag(view: TextView, title: String, tag: String): SpannableStringBuilder {
val mContext = view.context
val content = title + tag
val colorStr = "#ffff3b56"
/**
* 创建TextView对象,设置drawable背景,设置字体样式,设置间距,设置文本等
* 这里我们为了给TextView设置margin,给其添加了一个父容器LinearLayout。不过他俩都只是new出来的,不会添加进任何布局
*/
val layout = LinearLayout(mContext)
val textView = TextView(mContext)
textView.text = tag
textView.background = mContext.resources.getDrawable(R.drawable.bg_msg_label)
textView.textSize = 10f
textView.setTextColor(Color.parseColor(colorStr))
textView.includeFontPadding = false
//内容左右内间距
val hPadding = mContext.dp(6).toInt()
val vPadding = mContext.dp(2).toInt()
textView.setPadding(
hPadding, vPadding,
hPadding, vPadding
)
//textView.height = dip2px(30)
textView.gravity = Gravity.CENTER_VERTICAL
val layoutParams = LinearLayout.LayoutParams(
ViewGroup.LayoutParams.WRAP_CONTENT,
ViewGroup.LayoutParams.WRAP_CONTENT
)
val lMagrin = mContext.dp(5).toInt()
val bMargin = mContext.dp(3).toInt()
// 设置左间距
layoutParams.leftMargin = lMagrin
// 设置下间距,简单解决ImageSpan和文本竖直方向对齐的问题
layoutParams.bottomMargin = bMargin
layout.addView(textView, layoutParams)
/**
* 第二步,测量,绘制layout,生成对应的bitmap对象
*/
layout.isDrawingCacheEnabled = true
layout.measure(
View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED),
View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED)
)
// 给上方设置的margin留出空间
layout.layout(
0,
0,
textView.measuredWidth + (lMagrin + bMargin),
textView.measuredHeight
)
// 获取bitmap对象
val bitmap = Bitmap.createBitmap(layout.drawingCache)
//千万别忘最后一步
layout.destroyDrawingCache()
/**
* 第三步,通过bitmap生成我们需要的ImageSpan对象
*/
val imageSpan = ImageSpan(mContext, bitmap)
/**
* 第四步将ImageSpan对象设置到SpannableStringBuilder的对应位置
*/
val ssb = SpannableStringBuilder(content)
ssb.setSpan(imageSpan, title.length, content.length, Spanned.SPAN_EXCLUSIVE_INCLUSIVE)
return ssb
}
}
然后标签使用
参考:
DataBinding
https://juejin.cn/post/6844904186644004872#heading-0
文本后面添加标签:
https://blog.csdn.net/qq_26287435/article/details/100305849
https://github.com/tinyvampirepudge/Android_Base_Demo/blob/master/app/src/main/java/com/tiny/demo/firstlinecode/uicomponents/textview/SpannableStringBuilderActivity.java
https://juejin.cn/post/6964261957650579493#heading-4