自动换行 整齐排版 换行自动缩进
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了自动换行 整齐排版 换行自动缩进相关的知识,希望对你有一定的参考价值。
分割字符串
public class MainActivity extends Activity {private TextView tv1, tv2, tv3;//连续的英文字符串,包含数字及部分标点符号,如【.,_】,不能被折成两行private static String TEXT1 = "http://www.www1234www,www_www.cnblogs.com/baiqiantao/";private static String TEXT2 = "标点符号出现在行首时,其会连同其【前一个字符】跳到下一行";@Overrideprotected 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() {@Overridepublic 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() {@Overridepublic 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" ><TextViewandroid:id="@+id/tv1"android:layout_width="match_parent"android:layout_height="wrap_content"android:textColor="#00f"android:textSize="16sp" /><TextViewandroid:id="@+id/tv2"android:layout_width="match_parent"android:layout_height="wrap_content"android:textColor="#f00"android:textSize="16sp" /><TextViewandroid:id="@+id/tv3"android:layout_width="match_parent"android:layout_height="wrap_content"android:textColor="#f0f"android:textSize="16sp" /></LinearLayout>
!--WizRtf2Html>!--WizRtf2Html>
以上是关于自动换行 整齐排版 换行自动缩进的主要内容,如果未能解决你的问题,请参考以下文章