TextView折叠展开

361 阅读1分钟


class TextActivity : AppCompatActivity() {

    private lateinit var contentTextView: TextView

    var originText : String = ""
    var expand:String = "[展开]"
    var collapse = "[收起]"
    val max_line = 2
    
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_text)

        contentTextView = findViewById(R.id.content)
        originText = contentTextView.text.toString()
        contentTextView.viewTreeObserver.addOnPreDrawListener(object : OnPreDrawListener {
            override fun onPreDraw(): Boolean {
                contentTextView.viewTreeObserver.removeOnPreDrawListener(this);
                expandText()
                return false
            }
        });
    }

    private fun expandText() {
        val text: CharSequence = contentTextView.text
        val width: Int = contentTextView.width
        val paint: TextPaint = contentTextView.paint
        val layout: Layout = contentTextView.layout
        val line: Int = layout.lineCount
        if (line > max_line) {
            val start: Int = layout.getLineStart(max_line - 1)
            val end: Int = layout.getLineVisibleEnd(max_line -1)
            val lastLine = text.subSequence(start, end)
            val expandWidth = paint.measureText(expand)
            val remain = width - expandWidth
            val ellipsize = TextUtils.ellipsize(
                lastLine,
                paint,
                remain,
                TextUtils.TruncateAt.END
            )
            val clickableSpan: ClickableSpan = object : ClickableSpan() {
                override fun onClick(widget: View) {
                    collapseText()
                }
            }
            val ssb = SpannableStringBuilder()
            ssb.append(text.subSequence(0, start))
            ssb.append(ellipsize)
            ssb.append(expand)
            ssb.setSpan(
                ForegroundColorSpan(-0x8c9608),
                ssb.length - expand.length, ssb.length,
                Spanned.SPAN_INCLUSIVE_EXCLUSIVE
            )
            ssb.setSpan(
                clickableSpan,
                ssb.length - expand.length, ssb.length,
                Spanned.SPAN_INCLUSIVE_EXCLUSIVE
            )
            contentTextView.movementMethod = LinkMovementMethod.getInstance()
            contentTextView.text = ssb
        }
    }


    private fun collapseText() {
        // 默认此时文本肯定超过行数了,直接在最后拼接文本
        val clickableSpan: ClickableSpan = object : ClickableSpan() {
            override fun onClick(widget: View) {
                expandText()
            }
        }
        val ssb = SpannableStringBuilder()
        ssb.append(originText)
        ssb.append(collapse)
        ssb.setSpan(
            ForegroundColorSpan(-0x8c9608),
            ssb.length - collapse.length, ssb.length,
            Spanned.SPAN_INCLUSIVE_EXCLUSIVE
        )
        ssb.setSpan(
            clickableSpan,
            ssb.length - collapse.length, ssb.length,
            Spanned.SPAN_INCLUSIVE_EXCLUSIVE
        )
        contentTextView.text = ssb
    }
}