方法一:
在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'
;
}
}
}