首页 > 代码库 > 透明行间距的TextView

透明行间距的TextView

如果一个Textview需要bg,很见的那,如果告诉你行间距需要是透明的,估计就头大了,不过我头大过一次了,希望以后别人不再头大


里面用到了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
packagecom.phodev.andtools.widget;
 
importandroid.content.Context;
importandroid.graphics.Canvas;
importandroid.graphics.Paint;
importandroid.graphics.Paint.FontMetrics;
importandroid.graphics.Path;
importandroid.graphics.Region.Op;
importandroid.text.Layout;
importandroid.util.AttributeSet;
importandroid.widget.TextView;
 
/**
 * 透明间距的TextView
 *
 * @author skg
 *
 */
publicclass AlphaLineSpaceTextView extendsTextView {
    // as thin as possible
    privateboolean thinStyle = false;
 
    publicAlphaLineSpaceTextView(Context context, AttributeSet attrs,
            intdefStyle) {
        super(context, attrs, defStyle);
    }
 
    publicAlphaLineSpaceTextView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }
 
    publicAlphaLineSpaceTextView(Context context) {
        super(context);
    }
 
    privatefinal Path path = newPath();
 
    @Override
    publicvoid draw(Canvas canvas) {
        Layout layout = getLayout();
        if(layout == null) {
            super.draw(canvas);
            return;
        }
        Paint paint = layout.getPaint();
        floatspacingAdd = layout.getSpacingAdd();
        if(spacingAdd > 0&& paint != null) {
            intlinesCount = getLineCount();
            intmaxWith = getWidth();
            intsaveCount = canvas.save();
            FontMetrics fm = paint.getFontMetrics();
            intdescent = (int) (fm.descent + 0.5f);
            inttopOffset;
            intbottomOffset;
            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(inti = 0; i < linesCount; i++) {
                inttop = layout.getLineBaseline(i) - topOffset;
                intbottom = 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);
    }
}

透明行间距的TextView