方法一:
在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'; } }}
本文介绍了一种自定义TextView的方法,用于解决Android应用中文字排版不整齐的问题。通过重新绘制文字并调整间距,使得多行文本的布局更加美观。

378

被折叠的 条评论
为什么被折叠?



