1.场景描述:
有很多时候,产品或者UI会有各种奇葩要求,开发人员就得无条件满足。“真的很气哦!”
比如产品说:“当手机屏幕内一行可以显示下所有文字内容时需要第1种UI效果显示;当手机屏幕内一行显示不下文字内容时,需要换其他(第2种)UI效果展示,自动换行太丑……”。
(注:文字内容不固定,不要自动换行的效果。第1种UI效果和第2种UI效果是完全不同的两种效果。)
2. 分析:
面对这样的需求,也不难。其实,就是根据当前手机屏幕的文字所在的TextView,去计算出所有文字内容显示出的宽度与TextView显示出的宽度,判断出文字是否会自动换行,然后在对应逻辑下做不同的UI显示就可以了。
3. 功能实现
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效果 } } }); }