android studio|Android 解决TextView排版参差不齐的问题

更新时间:2021-06-10    来源:.Net开发    手机版     字体:

【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'

  }

 }

}

本文来源:http://www.bbyears.com/asp/122817.html

热门标签

更多>>

本类排行