一.
在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);
}
}});
网友评论