先来张图,看看我想实现什么?
image.png
就是不管文字多少,这个New标签都能正常显示,默认的情况是文字过长,New标签不限制
怎么实现?
/**
* 有结束标签的TextView,保证标签一定会显示出来
*/
@SuppressLint("AppCompatCustomView")
class EndLabelTextView @JvmOverloads constructor(
context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0
) : TextView(context, attrs, defStyleAttr) {
private var drawEndLabel = false
private var labelDrawable: Drawable? = null
fun setTextWithLabel(text: CharSequence?, labelDrawable: Drawable) {
this.labelDrawable = labelDrawable
if (text == null) {
super.setText(text)
return
}
post {
val maxTextWidth = width * maxLines - labelDrawable.intrinsicWidth - 20
// 关键点:计算有没有省略号,有的话,自己绘制一下label,没有就用默认的ImageSpan的方式
val ellipsizeText =
TextUtils.ellipsize(text, paint, maxTextWidth.toFloat(), TextUtils.TruncateAt.END)
.toString()
Log.d("EndLabelTextView", "ellipsizeText:$ellipsizeText")
drawEndLabel = if (ellipsizeText != text) {
// 有省略号
super.setText(ellipsizeText)
true
} else {
// 没有省略号
setText(text)
append(SpannableString("abc").apply {
labelDrawable.setBounds(
0,
0,
labelDrawable.intrinsicWidth,
labelDrawable.intrinsicHeight
)
val image = ImageSpan(labelDrawable, BetterImageSpan.ALIGN_BASELINE)
setSpan(image, 0, length, Spannable.SPAN_INCLUSIVE_EXCLUSIVE)
})
false
}
}
}
private val lastLineBound = Rect()
override fun onDraw(canvas: Canvas) {
super.onDraw(canvas)
labelDrawable?.let {
if (drawEndLabel) {
val baseLineY = getLineBounds(lineCount - 1, lastLineBound)
it.setBounds(
width - it.intrinsicWidth,
baseLineY - it.intrinsicHeight,
width,
baseLineY
)
it.draw(canvas)
}
}
}
}
网友评论