Android TextView 自动排版工具类

来源:互联网 发布:新疆卫生系统网络直报 编辑:程序博客网 时间:2024/06/04 18:55

使用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();    }}




阅读全文
1 0