美文网首页
Android Textview第二行缩进/悬挂缩进

Android Textview第二行缩进/悬挂缩进

作者: Scarlett_Ohara | 来源:发表于2018-05-29 16:22 被阅读0次

一.

在textview实现中英文展示,第一行不进行缩进,第一行之外进行缩进;

效果图:

代码:

SpannableString spannableString =new SpannableString("1. 哈哈哈哈\n  2. 哈哈哈哈\n 3.哈哈哈\n ");

//0 第一行缩进像素 , SizeUtils.dp2px(15)非第一行缩进像素

LeadingMarginSpan.Standard what =new LeadingMarginSpan.Standard(0, SizeUtils.dp2px(15));

spannableString.setSpan(what, 0, spannableString.length(), SpannableString.SPAN_INCLUSIVE_INCLUSIVE);

textview.setText(spannableString);

/**

* dp转px

*

* @param dpValue dp值

* @return px值

*/

public static int dp2px(float dpValue) {

        final float scale = Utils.getContext().getResources().getDisplayMetrics().density; return (int)         (dpValue * scale + 0.5f);

}

二:

如果想实现带缩进,并且英文文字铺满整行,可使用下面的方法;

效果图:

代码如下:

public class TextviewUtils {

    /**

    * 文本在indent 之后的字符对齐

    * 此方法必须在view绘制完成后调用才生效

    * getViewTreeObserver().addOnGlobalLayoutListener()

    *

    * @param tv    TextView控件

    * @param indent 标题,如 1.  或  一.

    * @return 新的带换行的字符串

    */

    public static String autoSplitText(final TextView tv, final String indent) {

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

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

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

        //将缩进处理成空格

        String indentSpace = "";

        float indentWidth = 0;

        if (!TextUtils.isEmpty(indent)) {

            float rawIndentWidth = tvPaint.measureText(indent);

            if (rawIndentWidth < tvWidth) {

                while ((indentWidth = tvPaint.measureText(indentSpace)) < rawIndentWidth) {

                    indentSpace += " ";

                }

            }

        }

        //将原始文本按行拆分

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

        StringBuilder sbNewText = new StringBuilder();

        for (String rawTextLine : rawTextLines) {

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

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

                sbNewText.append(rawTextLine);

            } else {

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

                char[] splitWord = rawTextLine.toCharArray();

                float lineWidth = 0;

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

                    char ch = splitWord[cnt];

                    //从手动换行的第二行开始,加上悬挂缩进

                    if (lineWidth < 0.1f && cnt != 0) {

                        sbNewText.append(indentSpace);

                        lineWidth += indentWidth;

                    }

                    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();

    }

}

如何使用:

textview.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener()

{

        @Override public void onGlobalLayout() {                 mDesc.getViewTreeObserver().removeOnGlobalLayoutListener(this);

                final String newText = TextviewUtils.autoSplitText(mDesc , "1. ");

                if (!TextUtils.isEmpty(newText)) {

                        textview.setText(newText);

                }

        }});

相关文章

网友评论

      本文标题:Android Textview第二行缩进/悬挂缩进

      本文链接:https://www.haomeiwen.com/subject/lwlajftx.html