美文网首页
EndLabelTextView

EndLabelTextView

作者: Xigong | 来源:发表于2020-05-22 15:18 被阅读0次

先来张图,看看我想实现什么?


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)
            }
        }

    }
}

相关文章

  • EndLabelTextView

    先来张图,看看我想实现什么? 就是不管文字多少,这个New标签都能正常显示,默认的情况是文字过长,New标签不限制...

网友评论

      本文标题:EndLabelTextView

      本文链接:https://www.haomeiwen.com/subject/yjiqahtx.html