Android 解决TextView排版参差不齐的问题
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;
publicstaticfinalStringTWO_CHINESE_BLANK="";
publicJustifyTextView(Contextcontext,AttributeSetattrs){
super(context,attrs);
}
@Override
protectedvoidonLayout(booleanchanged,intleft,inttop,intright,intbottom){
super.onLayout(changed,left,top,right,bottom);
}
@Override
protectedvoidonDraw(Canvascanvas){
TextPaintpaint=getPaint();
paint.setColor(getCurrentTextColor());
paint.drawableState=getDrawableState();
mViewWidth=getMeasuredWidth();
Stringtext=getText().toString();
mLineY=0;
mLineY+=getTextSize();
Layoutlayout=getLayout();
//layout.getLayout()在4.4.3出现NullPointerException
if(layout==null){
return;
}
Paint.FontMetricsfm=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());
Stringline=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(Canvascanvas,intlineStart,Stringline,floatlineWidth){
floatx=0;
if(isFirstLineOfParagraph(lineStart,line)){
Stringblanks="";
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){
Stringsubstring=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++){
Stringc=String.valueOf(line.charAt(i));
floatcw=StaticLayout.getDesiredWidth(c,getPaint());
canvas.drawText(c,x,mLineY,getPaint());
x+=cw+d;
}
}
privatebooleanisFirstLineOfParagraph(intlineStart,Stringline){
returnline.length()>3&&line.charAt(0)==''
&&line.charAt(1)=='';
}
privatebooleanneedScale(Stringline){
if(line==null||line.length()==0){
returnfalse;
}else{
returnline.charAt(line.length()-1)!='\n';
}
}
}
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!