实现类似的效果,一个多行的 textview, 如果赋值一个超长的字符,尾部长度回退部分,并添加 ... 最后添加一个详情按钮。 如果不超长则不显示详情
效果如图:
获取截断之后的字符长度
fun getLimitedCharacterCount(textView: TextView, lineCount: Int): Int {
val layout = textView.layout
if (layout != null && layout.lineCount >= lineCount - 1) {
return layout.getLineEnd(lineCount - 1)
}
return 0
}
获取到被切分的长度之后,退位部分字符串,绘制更多 UI
val str = "xxxxxxxxxxxxxxxxxxxxxxxxx"
mTextview.text = str
viewModelScope.launch {
delay(200) // 延迟 300 毫秒,需要等待 textview 绘制
// 发起协程
// 获取被截取后的文字长度
val limitedCount: Int = getLimitedCharacterCount(mTextview, mTextview.maxLines)
// 需要提前删除的文字的数量(用于补充更多以及... 的距离)
val DEL_TEXT_COUNT = 4
withContext(Dispatchers.Main) {
if (ellipsisCount > 0 && ellipsisCount < str.length && limitedCount> DEL_TEXT_COUNT) {
// 被切分
str= str.substring(0, limitedCount- DEL_TEXT_COUNT) + "..."
mTextview.text = info
// 显示更多按钮
mMore.visibility = View.VISIBLE
} else {
mMore.visibility = View.INVISIBLE
}
}
}
这里其实可以做的更好,不做固定长度,而是计算 subString 的实际 width,确定需要删减的字符串。这样效果会更好,然后这里偷懒了,后面再补