開發(fā)過程中,為使TextView直觀的表現(xiàn)文字沒有展示完整,會啟用TextView的ellipsize屬性
android:ellipsize="end"
有時候,我們需要判斷它到底有沒有生效,這就會用到Layout中的getEllipsisCount方法了;
api中指出,該方法獲取的就是被省略的部分的文字?jǐn)?shù)量;
layout.getEllipsisCount(int line)
但是要注意的是,該方法只有在TextView繪制完成后,才能獲取正確的值,監(jiān)聽View繪制,這個太容易了,下面給出一個封裝好的TextView
EllipsisTextView
/**
* Created by MrYan on 2018/9/11.
* 監(jiān)聽是否觸發(fā) 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() {
//設(shè)置觀察者,爛大街的代碼
//這里未把觀察者注銷,是因為我的TextView寬高是隨時變化的,如果是固定的最好根據(jù)需要注銷掉
getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
analyzeProcess();
}
});
}
/**
* 通過 layout 的 getEllipsisCount(int line) 方法,來獲取被省略的部分?jǐn)?shù)量
* 為0時就是沒省略
* 在利用自定義的監(jiān)聽器返回給待操作的對象;
*/
private void analyzeProcess() {
if (onEllipsisListener == null) return;
Layout layout = getLayout();//拿到Layout
int line = getLineCount();//獲取文字行數(shù)
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();
}
/**
* 自定義監(jiān)聽器
* boolean 省略是否生效 ellipsisCount 省略部分字?jǐn)?shù)
*/
public interface OnEllipsisListener {
void onEllipsis(boolean isEllipsis, int ellipsisCount);
}
}