TextView換行對齊
阿新 • • 發佈:2019-01-31
我們在開發的時候系統的TextView有時候越到一些字元就自動莫名的換行,為了不讓其換行,我們就要重新TextView來自定義自己的文字,請看下面程式碼。
public class JustifyTextView extends TextView {
public JustifyTextView(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
super.onLayout(changed, left, top, right, bottom);
}
@Override
protected void onDraw(Canvas canvas) {
TextPaint mPaint = getPaint();
Paint.FontMetrics fm = mPaint.getFontMetrics();
float baseline = fm.descent - fm.ascent;
float x = 0;
float y = baseline; //由於系統基於字型的底部來繪製文字,所有需要加上字型的高度。
String txt = this.getText().toString();
//文字自動換行
String[] texts = autoSplit(txt, mPaint, getWidth() - 5);
Log.d( Arrays.toString(texts));
for(String text : texts) {
canvas.drawText(text, x, y, mPaint); //座標以控制元件左上角為原點
y += baseline + fm.leading; //新增字型行間距
}
}
private boolean isFirstLineOfParagraph(int lineStart, String line) {
return line.length() > 3 && line.charAt(0) == ' ' && line.charAt(1) == ' ';
}
/**
* 自動分割文字
* @param content 需要分割的文字
* @param p 畫筆,用來根據字型測量文字的寬度
* @param width 最大的可顯示畫素(一般為控制元件的寬度)
* @return 一個字串陣列,儲存每行的文字
*/
private String[] autoSplit(String content, Paint p, float width) {
int length = content.length();
float textWidth = p.measureText(content);
if(textWidth <= width) {
return new String[]{content};
}
List<String> result = Lists.newArrayList();
int start = 0, end = 1;
while(start < length) {
if(p.measureText(content, start, end) >= width) { //文字寬度超出控制元件寬度時
result.add(content.substring(start, end));
start = end;
}
if(end == length) { //不足一行的文字
result.add(content.substring(start, end));
break;
}
end += 1;
}
return result.toArray(new String[0]);
}
private boolean needScale(String line) {
if (line.length() == 0) {
return false;
} else {
return line.charAt(line.length() - 1) != '\n';
}
}
}
這是我專案中的程式碼嗎,大家還有什麼其他需求,可以自己在其基礎上重新新增程式碼,以滿足自己的專案需求