1 package com.sixin.view; 2 3 import android.content.Context; 4 import android.graphics.Canvas; 5 import android.text.Layout; 6 import android.text.StaticLayout; 7 import android.text.TextPaint; 8 import android.util.AttributeSet; 9 import android.widget.TextView; 10 11 /** 12 * 能够自动修正的textview,解决android自带textview右侧文字不能对齐的问题 13 */ 14 public class JustifyTextView extends TextView { 15 16 private int mLineY; 17 private int mViewWidth; 18 19 public JustifyTextView(Context context, AttributeSet attrs) { 20 super(context, attrs); 21 } 22 23 @Override 24 protected void onLayout(boolean changed, int left, int top, int right, int bottom) { 25 super.onLayout(changed, left, top, right, bottom); 26 } 27 28 @Override 29 protected void onDraw(Canvas canvas) { 30 TextPaint paint = getPaint(); 31 paint.setColor(getCurrentTextColor()); 32 paint.drawableState = getDrawableState(); 33 mViewWidth = getMeasuredWidth(); 34 String text = (String) getText(); 35 mLineY = 0; 36 mLineY += getTextSize(); 37 Layout layout = getLayout(); 38 for (int i = 0; i < layout.getLineCount(); i++) { 39 int lineStart = layout.getLineStart(i); 40 int lineEnd = layout.getLineEnd(i); 41 String line = text.substring(lineStart, lineEnd); 42 43 float width = StaticLayout.getDesiredWidth(text, lineStart, lineEnd, getPaint()); 44 if (needScale(line)) { 45 drawScaledText(canvas, lineStart, line, width); 46 } else { 47 canvas.drawText(line, 0, mLineY, paint); 48 } 49 50 mLineY += getLineHeight(); 51 } 52 } 53 54 private void drawScaledText(Canvas canvas, int lineStart, String line, float lineWidth) { 55 float x = 0; 56 if (isFirstLineOfParagraph(lineStart, line)) { 57 String blanks = " "; 58 canvas.drawText(blanks, x, mLineY, getPaint()); 59 float bw = StaticLayout.getDesiredWidth(blanks, getPaint()); 60 x += bw; 61 62 line = line.substring(3); 63 } 64 65 float d = (mViewWidth - lineWidth) / line.length() - 1; 66 for (int i = 0; i < line.length(); i++) { 67 String c = String.valueOf(line.charAt(i)); 68 float cw = StaticLayout.getDesiredWidth(c, getPaint()); 69 canvas.drawText(c, x, mLineY, getPaint()); 70 x += cw + d; 71 } 72 } 73 74 private boolean isFirstLineOfParagraph(int lineStart, String line) { 75 return line.length() > 3 && line.charAt(0) == ' ' && line.charAt(1) == ' '; 76 } 77 78 private boolean needScale(String line) { 79 if (line.length() == 0) { 80 return false; 81 } else { 82 return line.charAt(line.length() - 1) != ' '; 83 } 84 } 85 86 }