Android原生的TextView在单纯的文字显示时,设置setMaxLines()后,Ellipsized属性是正常的。但当出现图文并排情况时,就不太好使了,所以进行了一些调研后,自定义了EllipsizedTextView来适配图文混排时“…”的显示。
/**
* 超过一定行数显示固定行数时末尾添加 "..."的TextView(适配图文混排)
*/
public class EllipsizedTextView extends TextView {
private int mMaxLines;
public EllipsizedTextView(Context context) {
this(context, null);
}
public EllipsizedTextView(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public EllipsizedTextView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
final TypedArray a = context.obtainStyledAttributes(attrs, new int[]{
android.R.attr.maxLines
}, defStyle, 0);
mMaxLines = a.getInteger(0, 1);
a.recycle();
}
@Override
public void setText(CharSequence text, BufferType type) {
if ((text!=null&&text.length()>0)&&(mMaxLines != Integer.MAX_VALUE && mMaxLines > 1) && getWidth() != 0) {
StaticLayout layout = new StaticLayout(text, getPaint(), getWidth(), Layout.Alignment.ALIGN_NORMAL, 1.0f, 0.0f, false);
//需要显示的文字加上"..."的总宽度
float textAndEllipsizeWidth = 0;
for (int i = 0; i < mMaxLines; i++) {
//此处用getWidth()计算的话会有误差,所以用getLineWidth()
textAndEllipsizeWidth += layout.getLineWidth(i);
}
text = TextUtils.ellipsize(text, getPaint(), textAndEllipsizeWidth, TextUtils.TruncateAt.END);
}
super.setText(text, type);
}
@Override
protected void onSizeChanged(int width, int height, int oldWidth, int oldHeight) {
super.onSizeChanged(width, height, oldWidth, oldHeight);
if (width > 0 && oldWidth != width) {
setText(getText());
}
}
@Override
public int getMaxLines() {
return mMaxLines;
}
@Override
public void setMaxLines(int maxLines) {
super.setMaxLines(maxLines);
mMaxLines = maxLines;
}
}