Created
December 10, 2015 09:47
-
-
Save jingwings/38ccad41cabea2c91d99 to your computer and use it in GitHub Desktop.
JustifyTextView 解决TextView中英文混排自动换行的问题
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| import android.content.Context; | |
| import android.graphics.Canvas; | |
| import android.graphics.Paint; | |
| import android.text.Layout; | |
| import android.text.StaticLayout; | |
| import android.text.TextPaint; | |
| import android.util.AttributeSet; | |
| import android.widget.TextView; | |
| /** | |
| * @author ccheng | |
| * @Date 3/18/14 | |
| */ | |
| public class JustifyTextView extends TextView { | |
| private int mLineY; | |
| private int mViewWidth; | |
| public static final String TWO_CHINESE_BLANK = " "; | |
| 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 paint = getPaint(); | |
| paint.setColor(getCurrentTextColor()); | |
| paint.drawableState = getDrawableState(); | |
| mViewWidth = getMeasuredWidth(); | |
| String text = getText().toString(); | |
| mLineY = 0; | |
| mLineY += getTextSize(); | |
| Layout layout = getLayout(); | |
| // layout.getLayout()在4.4.3出现NullPointerException | |
| if (layout == null) { | |
| return; | |
| } | |
| Paint.FontMetrics fm = paint.getFontMetrics(); | |
| int textHeight = (int) (Math.ceil(fm.descent - fm.ascent)); | |
| textHeight = (int) (textHeight * layout.getSpacingMultiplier() + layout | |
| .getSpacingAdd()); | |
| //解决了最后一行文字间距过大的问题 | |
| for (int i = 0; i < layout.getLineCount(); i++) { | |
| int lineStart = layout.getLineStart(i); | |
| int lineEnd = layout.getLineEnd(i); | |
| float width = StaticLayout.getDesiredWidth(text, lineStart, | |
| lineEnd, getPaint()); | |
| String line = text.substring(lineStart, lineEnd); | |
| if(i < layout.getLineCount() - 1) { | |
| if (needScale(line)) { | |
| drawScaledText(canvas, lineStart, line, width); | |
| } else { | |
| canvas.drawText(line, 0, mLineY, paint); | |
| } | |
| } else { | |
| canvas.drawText(line, 0, mLineY, paint); | |
| } | |
| mLineY += textHeight; | |
| } | |
| } | |
| private void drawScaledText(Canvas canvas, int lineStart, String line, | |
| float lineWidth) { | |
| float x = 0; | |
| if (isFirstLineOfParagraph(lineStart, line)) { | |
| String blanks = " "; | |
| canvas.drawText(blanks, x, mLineY, getPaint()); | |
| float bw = StaticLayout.getDesiredWidth(blanks, getPaint()); | |
| x += bw; | |
| line = line.substring(3); | |
| } | |
| int gapCount = line.length() - 1; | |
| int i = 0; | |
| if (line.length() > 2 && line.charAt(0) == 12288 | |
| && line.charAt(1) == 12288) { | |
| String substring = line.substring(0, 2); | |
| float cw = StaticLayout.getDesiredWidth(substring, getPaint()); | |
| canvas.drawText(substring, x, mLineY, getPaint()); | |
| x += cw; | |
| i += 2; | |
| } | |
| float d = (mViewWidth - lineWidth) / gapCount; | |
| for (; i < line.length(); i++) { | |
| String c = String.valueOf(line.charAt(i)); | |
| float cw = StaticLayout.getDesiredWidth(c, getPaint()); | |
| canvas.drawText(c, x, mLineY, getPaint()); | |
| x += cw + d; | |
| } | |
| } | |
| private boolean isFirstLineOfParagraph(int lineStart, String line) { | |
| return line.length() > 3 && line.charAt(0) == ' ' | |
| && line.charAt(1) == ' '; | |
| } | |
| private boolean needScale(String line) { | |
| if (line == null || line.length() == 0) { | |
| return false; | |
| } else { | |
| return line.charAt(line.length() - 1) != '\n'; | |
| } | |
| } | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment