最近在做着一个项目,里边会显示很长的一段文字,但是这些文字并不会整齐地排列,遇到文字中带有中英文时,果断给我换行了,好无语..接着就是不断地百度百度,找到了一堆一两年前的东西,不是叫你半角转全角,就是中文符号转英文符号,还有一些自定义TextView的试过了效果也不满意,最后在一个Android开发群中才得知JustifyTextView
GitHub地址:https://github.com/ufo22940268/android-justifiedtextview
最后是自定义TextView的代码(从GitHup中下载的JustifyTextView有一个小Bug,最后一行显示的文字间距太大,在Issues(https://github.com/ufo22940268/android-justifiedtextview/issues/1)中作者也告知了如何解决,只是Githup代码中未更新,这里的代码已做出了修改):
<span style="font-size:18px;">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 <span id="1_nwp" style="HEIGHT: auto; WIDTH: auto; FLOAT: none"><a target=_blank id="1_nwl" style="TEXT-DECORATION: none" href="http://cpro.baidu.com/cpro/ui/uijs.php?adclass=0&app_id=0&c=news&cf=43&ch=0&di=128&fv=0&is_app=0&jk=913ca171e59e087d&k=layout&k0=layout&kdi0=0&luki=2&n=10&p=baidu&q=baidusiteerror_cpr&rb=0&rs=1&seller_id=1&sid=7d089ee571a13c91&ssp2=1&stid=0&t=tpclicked3_hc&td=1797308&tu=u1797308&u=http%3A%2F%2Fwww%2Ecodes51%2Ecom%2Farticle%2Fdetail%5F103684%2Ehtml&urlid=0" target="_blank" mpid="1"><span style="height: auto; width: auto; color: rgb(0, 0, 255);">layout</span></a></span> = 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 <span id="2_nwp" style="HEIGHT: auto; WIDTH: auto; FLOAT: none"><a target=_blank id="2_nwl" style="TEXT-DECORATION: none" href="http://cpro.baidu.com/cpro/ui/uijs.php?adclass=0&app_id=0&c=news&cf=43&ch=0&di=128&fv=0&is_app=0&jk=913ca171e59e087d&k=line&k0=line&kdi0=0&luki=3&n=10&p=baidu&q=baidusiteerror_cpr&rb=0&rs=1&seller_id=1&sid=7d089ee571a13c91&ssp2=1&stid=0&t=tpclicked3_hc&td=1797308&tu=u1797308&u=http%3A%2F%2Fwww%2Ecodes51%2Ecom%2Farticle%2Fdetail%5F103684%2Ehtml&urlid=0" target="_blank" mpid="2"><span style="height: auto; width: auto; color: rgb(0, 0, 255);">line</span></a></span>Start = <span id="3_nwp" style="HEIGHT: auto; WIDTH: auto; FLOAT: none"><a target=_blank id="3_nwl" style="TEXT-DECORATION: none" href="http://cpro.baidu.com/cpro/ui/uijs.php?adclass=0&app_id=0&c=news&cf=43&ch=0&di=128&fv=0&is_app=0&jk=913ca171e59e087d&k=layout&k0=layout&kdi0=0&luki=2&n=10&p=baidu&q=baidusiteerror_cpr&rb=0&rs=1&seller_id=1&sid=7d089ee571a13c91&ssp2=1&stid=0&t=tpclicked3_hc&td=1797308&tu=u1797308&u=http%3A%2F%2Fwww%2Ecodes51%2Ecom%2Farticle%2Fdetail%5F103684%2Ehtml&urlid=0" target="_blank" mpid="3"><span style="height: auto; width: auto; color: rgb(0, 0, 255);">layout</span></a></span>.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(<span id="4_nwp" style="HEIGHT: auto; WIDTH: auto; FLOAT: none"><a target=_blank id="4_nwl" style="TEXT-DECORATION: none" href="http://cpro.baidu.com/cpro/ui/uijs.php?adclass=0&app_id=0&c=news&cf=43&ch=0&di=128&fv=0&is_app=0&jk=913ca171e59e087d&k=line&k0=line&kdi0=0&luki=3&n=10&p=baidu&q=baidusiteerror_cpr&rb=0&rs=1&seller_id=1&sid=7d089ee571a13c91&ssp2=1&stid=0&t=tpclicked3_hc&td=1797308&tu=u1797308&u=http%3A%2F%2Fwww%2Ecodes51%2Ecom%2Farticle%2Fdetail%5F103684%2Ehtml&urlid=0" target="_blank" mpid="4"><span style="height: auto; width: auto; color: rgb(0, 0, 255);">line</span></a></span>, 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 = <span id="5_nwp" style="HEIGHT: auto; WIDTH: auto; FLOAT: none"><a target=_blank id="5_nwl" style="TEXT-DECORATION: none" href="http://cpro.baidu.com/cpro/ui/uijs.php?adclass=0&app_id=0&c=news&cf=43&ch=0&di=128&fv=0&is_app=0&jk=913ca171e59e087d&k=line&k0=line&kdi0=0&luki=3&n=10&p=baidu&q=baidusiteerror_cpr&rb=0&rs=1&seller_id=1&sid=7d089ee571a13c91&ssp2=1&stid=0&t=tpclicked3_hc&td=1797308&tu=u1797308&u=http%3A%2F%2Fwww%2Ecodes51%2Ecom%2Farticle%2Fdetail%5F103684%2Ehtml&urlid=0" target="_blank" mpid="5"><span style="height: auto; width: auto; color: rgb(0, 0, 255);">line</span></a></span>.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(<span id="6_nwp" style="HEIGHT: auto; WIDTH: auto; FLOAT: none"><a target=_blank id="6_nwl" style="TEXT-DECORATION: none" href="http://cpro.baidu.com/cpro/ui/uijs.php?adclass=0&app_id=0&c=news&cf=43&ch=0&di=128&fv=0&is_app=0&jk=913ca171e59e087d&k=line&k0=line&kdi0=0&luki=3&n=10&p=baidu&q=baidusiteerror_cpr&rb=0&rs=1&seller_id=1&sid=7d089ee571a13c91&ssp2=1&stid=0&t=tpclicked3_hc&td=1797308&tu=u1797308&u=http%3A%2F%2Fwww%2Ecodes51%2Ecom%2Farticle%2Fdetail%5F103684%2Ehtml&urlid=0" target="_blank" mpid="6"><span style="height: auto; width: auto; color: rgb(0, 0, 255);">line</span></a></span>.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'; } } }</span>