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'; } } }
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!