2019-06-18 固定行数显示不完末尾显示...

1.原理:利用StaticLayout计算行数然后截取文字

2.效果图:

2行显示不完显示...

3.源代码:

package com.aimymusic.android.comm.ui.view

import android.content.Context
import android.graphics.Color
import android.support.v7.widget.AppCompatTextView
import android.text.*
import android.text.style.ForegroundColorSpan
import android.util.AttributeSet
import android.view.View
import com.aimymusic.android.repository.bean.dyn.CommentBean

/**
 * Description: 评论合并显示控件,每条评论显示2行,显示不全最后显示...
 * @author: caiyoufei
 * @date: 19-6-13 下午12:54
 */
class CommentMergeView @JvmOverloads constructor(
  context: Context,
  attributeSet: AttributeSet? = null,
  defAttrStyle: Int = 0
) : AppCompatTextView(context, attributeSet, defAttrStyle) {
  //每条评论显示行数
  private val ONE_COM_LINE = 2
  //结尾显示内容
  private val END_SHOW = "..."
  //最多显示多少个评论
  private val MAX_SHOW_COM = 2

  fun setComments(comments: List? = null, totalSize: Int) {
    if (comments.isNullOrEmpty()) {
      visibility = View.GONE
    } else {
      visibility = View.VISIBLE
      if (width > 0) {
        setShowInfo(comments, totalSize)
      } else {
        post { setShowInfo(comments, totalSize) }
      }
    }
  }

  private fun setShowInfo(comments: List, totalSize: Int) {
    val endWidth = paint.measureText(END_SHOW)
    val resultSpan = SpannableStringBuilder()
    for (k in 0 until comments.size) {
      if (resultSpan.isNotEmpty()) resultSpan.append("\n")
      val bean = comments[k]
      val des = SpannableStringBuilder().append(bean.replyXAtX).append(bean.contentSpan)
      val sl = StaticLayout(
        des,
        paint,
        width - paddingLeft - paddingRight,
        Layout.Alignment.ALIGN_CENTER,
        lineSpacingMultiplier,
        0f,
        true
      )
      if (sl.lineCount > ONE_COM_LINE) {
        val start = sl.getLineStart(ONE_COM_LINE - 1)
        val end = sl.getLineEnd(ONE_COM_LINE - 1)
        val lineText = des.subSequence(start, end)

        var endIndex = 0
        for (i in lineText.length - 1 downTo 0) {
          val str = lineText.substring(i, lineText.length)
          if (paint.measureText(str) >= endWidth) {
            endIndex = i
            break
          }
        }
        resultSpan.append(des.subSequence(0, start))
          .append(lineText.subSequence(0, endIndex))
          .append(END_SHOW)
      } else {
        resultSpan.append(des)
      }
      if (k == MAX_SHOW_COM - 1) {
        break
      }
    }
    if (totalSize > MAX_SHOW_COM) {
      resultSpan.append("\n")
      val stringTotal = SpannableString(String.format("共%d条回复>", totalSize))
      stringTotal.setSpan(
        ForegroundColorSpan(colorTotal), 0, stringTotal.length, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE
      )
      resultSpan.append(stringTotal)
    }
    this.text = resultSpan
  }

  private val colorTotal = Color.parseColor("#3DC27C")
}

4.衍生效果:"全文"+"收起"的切换显示效果(主要通过切换两种显示内容的方式实现效果)

(1)设置内容时,通过StaticLayout计算好"收起"需要显示的文字内容,并记录下来
(2)"全文"时设置Text内容为全文内容
(3)"收起"时设置Text内容为"收起"需要显示的内容即可

你可能感兴趣的:(2019-06-18 固定行数显示不完末尾显示...)