方法一:

在TextView中添加属性:

android:breakStrategy="simple"

方法二:

自定义TextView

package com.monkey.monkeymushroom.view;   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;   /**   * 解决文字排版混乱参差不齐的问题   */ 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 layout = 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 lineStart = layout.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(line, 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 = line.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(line.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' ;    }   } }

更多相关文章

  1. reason: HttpHostConnect Connection to https://dl-ssl.google.
  2. Android三种方法实现事件监听
  3. 调用android的getColor()方法出现 java.lang.NoSuchMethodError:
  4. Android自适应不同版本的程序退出方法
  5. Android Studio报错:Unsupported method: AndroidProject.getPlug
  6. android中的ProgressBar的使用方法
  7. Some Android licenses not accepted. To resolve this, run: fl

随机推荐

  1. Android线性布局与表格布局
  2. XTrace,AOP在Android的实践
  3. Android触摸事件分发
  4. android:stretchColumns与 android:scrol
  5. Android软键盘弹出将底部栏顶上去并不会
  6. eclipse里配置Android(安卓)ndk环境,用ecl
  7. 安卓新手之路——关于layout一些属性的整
  8. Android Studio 打包jar,aar
  9. 为 Android(安卓)添加 Java 层服务也就是
  10. Android(安卓)根据系统声音模式设置提醒