您的位置:首页 > 其它

TextView中使用ImageSpan显示“...”问题

2017-01-09 17:53 561 查看
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;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: