android textView 排版显示参差不齐的解决方法
2015-03-17 15:20
861 查看
参考Github的方法 试了试,效果不错
![](https://oscdn.geek-share.com/Uploads/Images/Content/202011/20/69d6339bc9d5a8b341d4cc01035f9a37)
代码如下:
代码如下:
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; 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(); 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'; } } }
相关文章推荐
- android的textview显示音标问题解决方法
- android 获取网络数据,回传到本地用TextView显示乱码问题解决方法
- android自定义view解决textview显示排版的问题
- TextView 显示内容时出现 ArrayIndexOutOfBoundsException 的解决方法(Android 4.1)
- TextView 显示内容时出现 ArrayIndexOutOfBoundsException 的解决方法(Android 4.1)
- Android TextView自动换行文字,排版混乱的原因和解决方法
- Android 解决TextView排版参差不齐的问题
- Android 开发 TextView中出现参差不齐状态解决方法
- Android TextView自动换行文字,排版混乱的原因和解决方法
- 解决Android原生TextView显示中英文等末尾参差不齐问题
- Android 解决TextView排版参差不齐的问题
- Android AutoWrapTextView中英文排版问题的解决方法
- Android的TextView中显示图片和图像的方法
- Android中TextView中内容不换行的解决方法
- android中的textview显示汉字不能自动换行的一个解决办法
- Android TextView自动换行文字排版参差不齐的原因
- Android TextView里直接显示图片的三种方法
- Android TextView文字太多显示的最后一行被盖住一半的解决办法
- TextView中的连续空格只显示一个的解决方法
- Android TextView自动换行文字排版参差不齐的原因