【www.bbyears.com--.Net开发】
Android 解决TextView排版参差不齐的问题
在app中,展示数据时,里面有汉字、数字、特殊字符时,由于全角、半角问题导致TextView参差不齐。在网上找了许多,半角转全角并没什么用,还有其他自定义TextView都有问题。最后终于找到一个,就像Word一样,可以使文字左右两端对齐:
代码如下packagecom.monkey.monkeymushroom.view;
importandroid.content.Context;
importandroid.graphics.Canvas;
importandroid.graphics.Paint;
importandroid.text.Layout;
importandroid.text.StaticLayout;
importandroid.text.TextPaint;
importandroid.util.AttributeSet;
importandroid.widget.TextView;
/**
* 解决文字排版混乱参差不齐的问题
*/
publicclassJustifyTextViewextendsTextView {
privateintmLineY;
privateintmViewWidth;
publicstaticfinalString TWO_CHINESE_BLANK =" ";
publicJustifyTextView(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
protectedvoidonLayout(booleanchanged,intleft,inttop,intright,intbottom) {
super.onLayout(changed, left, top, right, bottom);
}
@Override
protectedvoidonDraw(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();
inttextHeight = (int) (Math.ceil(fm.descent - fm.ascent));
textHeight = (int) (textHeight * layout.getSpacingMultiplier() + layout
.getSpacingAdd());
//解决了最后一行文字间距过大的问题
for(inti =0; i < layout.getLineCount(); i++) {
intlineStart = layout.getLineStart(i);
intlineEnd = layout.getLineEnd(i);
floatwidth = 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;
}
}
privatevoiddrawScaledText(Canvas canvas,intlineStart, String line,floatlineWidth) {
floatx =0;
if(isFirstLineOfParagraph(lineStart, line)) {
String blanks =" ";
canvas.drawText(blanks, x, mLineY, getPaint());
floatbw = StaticLayout.getDesiredWidth(blanks, getPaint());
x += bw;
line = line.substring(3);
}
intgapCount = line.length() -1;
inti =0;
if(line.length() >2&& line.charAt(0) ==12288
&& line.charAt(1) ==12288) {
String substring = line.substring(0,2);
floatcw = StaticLayout.getDesiredWidth(substring, getPaint());
canvas.drawText(substring, x, mLineY, getPaint());
x += cw;
i +=2;
}
floatd = (mViewWidth - lineWidth) / gapCount;
for(; i < line.length(); i++) {
String c = String.valueOf(line.charAt(i));
floatcw = StaticLayout.getDesiredWidth(c, getPaint());
canvas.drawText(c, x, mLineY, getPaint());
x += cw + d;
}
}
privatebooleanisFirstLineOfParagraph(intlineStart, String line) {
returnline.length() >3&& line.charAt(0) ==' '
&& line.charAt(1) ==' '
}
privatebooleanneedScale(String line) {
if(line ==null|| line.length() ==0) {
returnfalse;
}else{
returnline.charAt(line.length() -1) !='\n'
}
}
}