美文网首页
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