android 页面排版工具,Android TextView 自动排版工具类

使用TextView时会经常出现以下现象:

1、当遇到标点符号时,经常出现自动标点符号加上前面的一个汉字换到下一行,导致当前行出现缺一块的现象

2、当遇到英文时如果一行展示不下就自动换到下一行,排版参差不齐

下面方法实现了主动控制排版,实现了每行都显示满在换行,遇到英文也是可以把一个单词拆开换行,当需要设置文本时,调用此方法即可。

/**

* 通过自动换行的方式设置文本 优化排版

* @param tv 要设置文本的文本控件

* @param text 要设置的文本内容

*/

private void setAutoSplitText(TextView tv,String text){

tv.setText(text);

tv.getViewTreeObserver().addOnGlobalLayoutListener(new OnTvGlobalLayoutListener(tv));

}

onTvGlobalLayoutListener 类如下:

/**

* TextView设置内容后加上此监听 实现自动排版

*/

public class OnTvGlobalLayoutListener implements ViewTreeObserver.OnGlobalLayoutListener {

private TextView tv;

public OnTvGlobalLayoutListener(TextView tv) {

this.tv = tv;

}

@Override

public void onGlobalLayout() {

tv.getViewTreeObserver().removeOnGlobalLayoutListener(this);

final String newText = autoSplitText(tv);

if (!TextUtils.isEmpty(newText)) {

tv.setText(newText);

}

}

/**

* 针对TextView文字排版问题 进行自动排版

*

* @param tv

* @return

*/

private String autoSplitText(final TextView tv) {

final String rawText = tv.getText().toString(); //原始文本

final Paint tvPaint = tv.getPaint(); //paint,包含字体等信息

final float tvWidth = tv.getWidth() - tv.getPaddingLeft() - tv.getPaddingRight(); //控件可用宽度

//将原始文本按行拆分

String[] rawTextLines = rawText.replaceAll("\r", "").split("\n");

StringBuilder sbNewText = new StringBuilder();

for (String rawTextLine : rawTextLines) {

if (tvPaint.measureText(rawTextLine) <= tvWidth) {

//如果整行宽度在控件可用宽度之内,就不处理了

sbNewText.append(rawTextLine);

} else {

//如果整行宽度超过控件可用宽度,则按字符测量,在超过可用宽度的前一个字符处手动换行

float lineWidth = 0;

for (int cnt = 0; cnt != rawTextLine.length(); ++cnt) {

char ch = rawTextLine.charAt(cnt);

lineWidth += tvPaint.measureText(String.valueOf(ch));

if (lineWidth <= tvWidth) {

sbNewText.append(ch);

} else {

sbNewText.append("\n");

lineWidth = 0;

--cnt;

}

}

}

sbNewText.append("\n");

}

//把结尾多余的\n去掉

if (!rawText.endsWith("\n")) {

sbNewText.deleteCharAt(sbNewText.length() - 1);

}

return sbNewText.toString();

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值