如果一个Textview需要bg,很见的那,如果告诉你行间距需要是透明的,估计就头大了,不过我头大过一次了,希望以后别人不再头大
里面用到了canvas的clip操作,但是硬件加速的时候却不支持这个操作,所以,最好禁止硬件加速,并添加try控制,如果exception了,只好反放弃这个效果,让super方法了继续绘制
里面用到了canvas的clip操作,但是硬件加速的时候却不支持这个操作,所以,最好禁止硬件加速,并添加try控制,如果exception了,只好反放弃这个效果,让super方法了继续绘制
标签:
Android
[1].[文件] AlphaLineSpaceTextView.java ~ 2KB 下载(9) 跳至 [1]
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
|
package
com.phodev.andtools.widget;
import
android.content.Context;
import
android.graphics.Canvas;
import
android.graphics.Paint;
import
android.graphics.Paint.FontMetrics;
import
android.graphics.Path;
import
android.graphics.Region.Op;
import
android.text.Layout;
import
android.util.AttributeSet;
import
android.widget.TextView;
/**
* 透明间距的TextView
*
* @author skg
*
*/
public
class
AlphaLineSpaceTextView
extends
TextView {
// as thin as possible
private
boolean
thinStyle =
false
;
public
AlphaLineSpaceTextView(Context context, AttributeSet attrs,
int
defStyle) {
super
(context, attrs, defStyle);
}
public
AlphaLineSpaceTextView(Context context, AttributeSet attrs) {
super
(context, attrs);
}
public
AlphaLineSpaceTextView(Context context) {
super
(context);
}
private
final
Path path =
new
Path();
@Override
public
void
draw(Canvas canvas) {
Layout layout = getLayout();
if
(layout ==
null
) {
super
.draw(canvas);
return
;
}
Paint paint = layout.getPaint();
float
spacingAdd = layout.getSpacingAdd();
if
(spacingAdd >
0
&& paint !=
null
) {
int
linesCount = getLineCount();
int
maxWith = getWidth();
int
saveCount = canvas.save();
FontMetrics fm = paint.getFontMetrics();
int
descent = (
int
) (fm.descent +
0
.5f);
int
topOffset;
int
bottomOffset;
path.reset();
if
(thinStyle) {
// clip first line top
path.moveTo(
0
,
0
);
path.lineTo(maxWith,
0
);
path.lineTo(maxWith, descent);
path.lineTo(
0
, descent);
path.close();
try
{
canvas.clipPath(path, Op.DIFFERENCE);
}
catch
(Exception e) {
}
//
topOffset = -descent;
bottomOffset =
0
;
}
else
{
topOffset = -descent -
2
;
bottomOffset =
0
;
}
// clip every line bottom
for
(
int
i =
0
; i < linesCount; i++) {
int
top = layout.getLineBaseline(i) - topOffset;
int
bottom = layout.getLineBottom(i) - bottomOffset;
/*
* Log.d("ttt", "---- baseline:" + layout.getLineBaseline(i) +
* " bottom:" + layout.getLineBottom(i) + "descent:" + descent);
*/
path.reset();
path.moveTo(
0
, top);
path.lineTo(maxWith, top);
path.lineTo(maxWith, bottom);
path.lineTo(
0
, bottom);
path.close();
try
{
canvas.clipPath(path, Op.DIFFERENCE);
}
catch
(Exception e) {
}
}
//
super
.draw(canvas);
canvas.restoreToCount(saveCount);
return
;
}
super
.draw(canvas);
}
}
|