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