有很多时候,产品或者UI会有各种奇葩要求,开发人员就得无条件满足。“真的很气哦!”
比如产品说:“当手机屏幕内一行可以显示下所有文字内容时需要第1种UI效果显示;当手机屏幕内一行显示不下文字内容时,需要换其他(第2种)UI效果展示,自动换行太丑……”。
(注:文字内容不固定,不要自动换行的效果。第1种UI效果和第2种UI效果是完全不同的两种效果。)
面对这样的需求,也不难。其实,就是根据当前手机屏幕的文字所在的TextView,去计算出所有文字内容显示出的宽度与TextView显示出的宽度,判断出文字是否会自动换行,然后在对应逻辑下做不同的UI显示就可以了。
1)首先,在布局文件xml中,需要给文字内容所在的TextView设置属性
android:ellipsize="end"
2)然后,通过addOnGlobalLayoutListene()方法判断是否触发属性ellipsize="end",再根据文本宽度是否大于TextView控件宽度,判断出是否文字内容会自动换行,在Activity或者Fragment中设置不同的UI效果。
public void textViewOverFlowed(final TextView textView) {
ViewTreeObserver vto = textView.getViewTreeObserver();
vto.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@SuppressWarnings("deprecation")
@Override
public void onGlobalLayout() {
textView.getViewTreeObserver().removeGlobalOnLayoutListener(this);
textView.getHeight();
double widthView = textView.getWidth();//控件宽度
double widthTextStr= textView.getPaint().measureText(textView.getText().toString());//文本宽度
LogUtil.e("文本宽度=============="+widthTextStr+" 控件宽度=============="+widthView);
if (widthTextStr > widthView) {//文本会自动换行
//此处显示需要换行时的第2种UI效果
} else {//文本无需换行
//此处显示无需换行时的第1种UI效果
}
}
});
}