实现图上类似的效果。
指定最大行数为三行,最后一行缩进指定的距离。
如果行数小于三行,则不缩进。
同时文字两端对齐
代码里的 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
// 缩进的长度 px
private var mReduceWidth = 82.dp
override fun onDraw(canvas: Canvas) {
mLineY = 0.0f
mViewWidth = measuredWidth //获取textview的实际宽度
// 最后一行的绘制的宽度
val lastLineWidth = mViewWidth - mReduceWidth
mLineY += 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.CusTextview
android: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" />