实现图上类似的效果。
指定最大行数为三行,最后一行缩进指定的距离。
如果行数小于三行,则不缩进。
同时文字两端对齐
代码里的 JustifyTextView (两端对齐的 Textview )详见
Android Textview 多行文本两端对齐_android textveiw实现两端对齐-CSDN博客
这里代码中写死了行数 mMaxLineCount = 3 以及缩进的px mReduceWidth ,可根据实际需求修改或者 xml 中指定
import android.annotation.SuppressLint
import android.content.Context
import android.graphics.Canvas
import android.text.Layout
import android.text.StaticLayout
import android.util.AttributeSet@SuppressLint("AppCompatCustomView")
class CusTextview@JvmOverloads constructor(context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0) : JustifyTextView(context, attrs, defStyleAttr) {// 最大的绘制行数(从0开始)private var mMaxLineCount = 3// 缩进的长度 pxprivate var mReduceWidth = 82.dpoverride fun onDraw(canvas: Canvas) {mLineY = 0.0fmViewWidth = measuredWidth //获取textview的实际宽度// 最后一行的绘制的宽度val lastLineWidth = mViewWidth - mReduceWidthmLineY += textSize.toInt()val text = text.toString()val layout: Layout = layout// 原始行数val lineCount: Int = layout.lineCount// 计算后的行数val drawLineCount = lineCount.coerceAtMost(mMaxLineCount)//每行循环for (i in 0 until drawLineCount) {val lineStart: Int = layout.getLineStart(i)val lineEnd: Int = layout.getLineEnd(i)//获取TextView每行中的内容val lineText = text.substring(lineStart, lineEnd)// 开始进行针对行的绘制if (needScale(lineText)) {// 如果设置三行,但是实际只有两行,处理第二行不要平铺!if (i == (drawLineCount - 1)) {// 最后一行if (lastLineWidth < 0 || drawLineCount < mMaxLineCount){// 长度太低,或者长度不满足于最大长度。不进行重绘canvas.drawText(lineText, 0.0f, mLineY, paint)}else{// 缩进后的文本var paintText = lineText// 获取原始文本的长度var measuredTextLength = paint.measureText(paintText)// 减少字数计算合适的长度while (measuredTextLength > lastLineWidth && paintText.length > 1) {// 逐步减少文本末尾的字符paintText = paintText.dropLast(1)// 重新计算文本长度measuredTextLength = paint.measureText(paintText)}// 绘制最终文本// 避免最后一行长度不够时,还被加 ...if (paintText != lineText) {canvas.drawText("$paintText...", 0.0f, mLineY, paint)}else{canvas.drawText("$paintText", 0.0f, mLineY, paint)}}} else {// 常规行,平铺填充val width = StaticLayout.getDesiredWidth(text, lineStart, lineEnd, paint)drawScaleText(canvas, lineText, width)}} else {canvas.drawText(lineText, 0.0f, mLineY, paint)}mLineY += lineHeight //写完一行以后,高度增加一行的高度}}}
xml 中使用:
<!--简介信息位置--><com.xxx.widget.CusTextviewandroid:textColor="@color/white_alpha_70"android:id="@+id/base_info"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_below="@id/base_info"android:layout_alignLeft="@id/t_textview"android:layout_marginRight="27dp"android:layout_toLeftOf="@id/p_view"android:lineSpacingExtra="5dp"android:maxLines="3"android:textSize="17sp" />