自动换行 整齐排版 换行自动缩进

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了自动换行 整齐排版 换行自动缩进相关的知识,希望对你有一定的参考价值。


分割字符串
技术分享
public class MainActivity extends Activity {
    private TextView tv1tv2tv3;
    //连续的英文字符串,包含数字及部分标点符号,如【.,_】,不能被折成两行
    private static String TEXT1 = "http://www.www1234www,www_www.cnblogs.com/baiqiantao/";
    private static String TEXT2 = "标点符号出现在行首时,其会连同其【前一个字符】跳到下一行";
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        tv1 = (TextView) findViewById(R.id.tv1);
        tv2 = (TextView) findViewById(R.id.tv2);
        tv3 = (TextView) findViewById(R.id.tv3);
        tv1.setText(TEXT1 + "\\n" + TEXT2);
        tv2.setText(TEXT1 + "\\n" + TEXT2);
        tv2.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
            @Override
            public void onGlobalLayout() {
                tv2.getViewTreeObserver().removeOnGlobalLayoutListener(this);
                String newText = autoSplitText(tv2"");
                if (!TextUtils.isEmpty(newText)) {
                    tv2.setText(newText);
                }
            }
        });
        tv3.setText(TEXT1 + "\\n" + TEXT2);
        tv3.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
            @Override
            public void onGlobalLayout() {
                tv3.getViewTreeObserver().removeOnGlobalLayoutListener(this);
                String newText = autoSplitText(tv3"        ");
                if (!TextUtils.isEmpty(newText)) {
                    tv3.setText(newText);
                }
            }
        });
    }

    /**
     * 自动分割文本
     * @param tv    要处理的TextView
     * @return        对TextView内容分割后的字符串
     */
    public static String autoSplitText(TextView tv, String indent) {
        String rawText = tv.getText().toString(); //原始文本
        Paint tvPaint = tv.getPaint(); //包含字体等信息
        float tvWidth = tv.getWidth() - tv.getPaddingLeft() - tv.getPaddingRight(); //控件可用宽度
        //将原始文本按行拆分
        String[] rawTextLines = rawText.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" + indent);
                        lineWidth = 0;
                        cnt--;
                    }
                }
            }
            sbNewText.append("\\n");
        }
        //把结尾多余的\\n去掉
        if (!rawText.endsWith("\\n")) sbNewText.deleteCharAt(sbNewText.length() - 1);
        return sbNewText.toString();
    }
}

布局
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >
    <TextView
        android:id="@+id/tv1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:textColor="#00f"
        android:textSize="16sp" />
    <TextView
        android:id="@+id/tv2"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:textColor="#f00"
        android:textSize="16sp" />
    <TextView
        android:id="@+id/tv3"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:textColor="#f0f"
        android:textSize="16sp" />
</LinearLayout>









以上是关于自动换行 整齐排版 换行自动缩进的主要内容,如果未能解决你的问题,请参考以下文章

解决vscode c++下自动换行问题

bootstrap5 文本文字排版类

notepad3代码自动变色

p标签内容实现第二行缩进两个字体间距

vs2005 datagridview内容自动换行?

notepad++ 如何自动换行