开发过程中,为使TextView直观的表现文字没有展示完整,会启用TextView的ellipsize属性
android:ellipsize="end"
有时候,我们需要判断它到底有没有生效,这就会用到Layout中的getEllipsisCount方法了;
api中指出,该方法获取的就是被省略的部分的文字数量;
layout.getEllipsisCount(int line)
但是要注意的是,该方法只有在TextView绘制完成后,才能获取正确的值,监听View绘制,这个太容易了,下面给出一个封装好的TextView
EllipsisTextView
/**
* Created by MrYan on 2018/9/11.
* 监听是否触发 ellipsize 属性的TextView
*/
@SuppressLint("AppCompatCustomView")
public class EllipsisTextView extends TextView {
private static final String TAG = "EllipsizeTextView";
private OnEllipsisListener onEllipsisListener;
public EllipsisTextView(Context context) {
super(context);
init();
}
private void init() {
//设置观察者,烂大街的代码
//这里未把观察者注销,是因为我的TextView宽高是随时变化的,如果是固定的最好根据需要注销掉
getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
analyzeProcess();
}
});
}
/**
* 通过 layout 的 getEllipsisCount(int line) 方法,来获取被省略的部分数量
* 为0时就是没省略
* 在利用自定义的监听器返回给待操作的对象;
*/
private void analyzeProcess() {
if (onEllipsisListener == null) return;
Layout layout = getLayout();//拿到Layout
int line = getLineCount();//获取文字行数
if (line > 0) {
int ellipsisCount = layout.getEllipsisCount(line - 1);
//ellipsisCount > 0 时,说明省略生效
onEllipsisListener.onEllipsis(ellipsisCount > 0, ellipsisCount);
}
}
public void setOnEllipsisListener(OnEllipsisListener onEllipsisListener) {
this.onEllipsisListener = onEllipsisListener;
}
public EllipsisTextView(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
init();
}
public EllipsisTextView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init();
}
/**
* 自定义监听器
* boolean 省略是否生效 ellipsisCount 省略部分字数
*/
public interface OnEllipsisListener {
void onEllipsis(boolean isEllipsis, int ellipsisCount);
}
}









网友评论