码迷,mamicode.com
首页 > 其他好文 > 详细

透明行间距的TextView

时间:2015-01-12 17:42:17      阅读:283      评论:0      收藏:0      [点我收藏+]

标签:

如果一个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
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);
    }
}

透明行间距的TextView

标签:

原文地址:http://blog.csdn.net/u014311064/article/details/42644223

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!