在android的原生TextView中遇到如圖所示等情況,由于特殊符號半角、或者字母串等等,TextView自動分割機(jī)制作出的效果并不美觀。

image.png

image.png
嘗試方案:
添加半角轉(zhuǎn)全角后—一個數(shù)字或字母占兩個字符,看似一行占滿,但是間隙變大,視覺效果差。如下圖

image.png

image.png
最終解決方案:
獲取每一個字符測量長度,手動添加換行符。重新設(shè)置text。
public class AutoSplitTextView extends TextView {
private String autoText;
private float textWidth;
private float textHeight;
private Paint textPaint;
public AutoSplitTextView(Context context) {
this(context,null);
}
public AutoSplitTextView(Context context, @Nullable AttributeSet attrs) {
this(context, attrs,0);
}
public AutoSplitTextView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
//解決首次渲染,沒有補(bǔ)全的bug。
int mWidth = -1;
@Override
protected void onDraw(Canvas canvas) {
//onDraw可能會被多次調(diào)用,因此不是每次調(diào)用都需要重繪,這里做了個判斷,text是否跟上一次一樣,若一樣,不再計(jì)算,否則重新計(jì)算賦值
if(mWidth != getWidth() || !autoText.equals(getText().toString()) ){
autoText=autoSplitText(this);
setText(autoText);
mWidth = getWidth();
}
super.onDraw(canvas);
}
private String autoSplitText(AutoSplitTextView textView) {
CharSequence rawCharSequence = textView.getText();
String originText = rawCharSequence.toString();//獲取原始文本
textPaint = textView.getPaint();
textWidth = textView.getWidth() - textView.getPaddingLeft() - textView.getPaddingRight();
textHeight = textView.getHeight();
String allTextLines=originText.replaceAll("\n","");
StringBuilder stringBuilder = new StringBuilder();
if (textPaint.measureText(allTextLines)>textWidth){
//如果整行寬度超過控件所用寬度,則按字符測量,在超過可用寬度的最后一個字符添加換行符
float lineWidth = 0;
for (int i = 0; i < allTextLines.length(); i++) {
char textChar = allTextLines.charAt(i);
lineWidth += textPaint.measureText(String.valueOf(textChar));
if (lineWidth <= textWidth) {
stringBuilder.append(textChar);
} else {
stringBuilder.append("\n");
i--;
lineWidth = 0;
}
}
}else {
stringBuilder.append(allTextLines);
}
return stringBuilder.toString();
}
}
然后我們再來看一下

image.png

image.png