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