Android 解决TextView排版参差不齐的问题
在app中,展示数据时,里面有汉字、数字、特殊字符时,由于全角、半角问题导致TextView参差不齐。在网上找了许多,半角转全角并没什么用,还有其他自定义TextView都有问题。最后终于找到一个,就像Word一样,可以使文字左右两端对齐:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
|
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'
;
}
}
}
|
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!