1. 程式人生 > >TextView換行對齊

TextView換行對齊

我們在開發的時候系統的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'; } } }

這是我專案中的程式碼嗎,大家還有什麼其他需求,可以自己在其基礎上重新新增程式碼,以滿足自己的專案需求