Android实现带下划线的EditText
之前写了一个关于实现EditText显示下划线的例子,发现仍然存在一些问题,在此继续探索,原文链接:http://www.cnblogs.com/ayqy/p/3599414.html
(一)问题
之前的自定义EditText只能显示高度不超过屏幕高度的文本内容,继续增加内容会出现如下问题:
(二)原因分析
下部(超出屏幕高度的部分)没有继续画线,也就是说横线没有画够,那么一定是循环控制部分出了问题。
(三)如何解决
1.怎么才能做到每行文字下方都有一条线?
那么首先需要获取文本的行数用EditText.getLineCount();再按行画线即可
2.怎么确定横线的位置?
Y = EditText.getPaddingTop() + EditText.getLineHeight() * index;//Y坐标 = 文本框内上部留白 + 行宽 * 行索引(第几行)
上面的方法是从上往下画线,当然也可以从下往上画线,在此不展开叙述
(四)编码
[自定义EditText]
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 |
package
com.ayqy.app_test; import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.widget.EditText; public class myEditText extends
EditText{ private
int lineColor; //横线颜色 private
float lineWidth; //横线宽度 public
myEditText(Context context) { super (context); //设置默认颜色和横线宽度 lineColor = Color.BLUE; //默认蓝色线 lineWidth = 0 .5f; //默认宽度为0.5 } public
myEditText(Context context, int
color, float
width) { super (context); //设置颜色和横线宽度 this .lineColor = color; this .lineWidth = width; } @Override protected
void onDraw(Canvas canvas) { // TODO Auto-generated method stub super .onDraw(canvas); //创建画笔 Paint mPaint = new
Paint(); mPaint.setStrokeWidth(lineWidth); mPaint.setStyle(Paint.Style.FILL); mPaint.setColor(lineColor); //获取参数 int
padL = this .getPaddingLeft(); //获取框内左边留白 int
padR = this .getPaddingRight(); //获取框内右边留白 int
padT = this .getPaddingTop(); //获取框内顶部留白 int
lines = this .getLineCount(); //获取行数 float
size = this .getTextSize(); //获取字体大小 float
baseTop = padT + size / 6 ; //从上向下第一条线的位置 /*这里需要说明的是size/6这个值,是偶然测试得到的,近似于行距的一半 *为什么不用EditText.getLineSpacingExtra();来获取行距? *因为测试发现若调用EditText的getLineSpacingExtra方法会报NoSuchMethod错误,具体原因不明 *测试发现行距的值近似于TextSize的1/3,在需要用到行距的时候可以用这个值来代替getLineSpacingExtra方法 * */ float
gap = this .getLineHeight(); //获取行宽 //从上向下划线 for ( int
i = 1 ;i <= lines;i++) { canvas.drawLine(padL //startX , baseTop + gap * i //startY , this .getWidth() - padR //endX , baseTop + gap * i //endY , mPaint); } } public
int getLineColor() { return
lineColor; } public
void setLineColor( int
color) { this .lineColor = color; } public
float getLineWidth() { return
lineWidth; } public
void setLineWidth( float
width) { this .lineWidth = width; } } |
P.S.上方的代码注释提到了“测试发现若调用EditText的getLineSpacingExtra方法会报NoSuchMethod错误”,Google之后发现好像没人遇到过这个问题,如有朋友知道答案请在下方留言,谢谢
(五)效果截图
[改进之后的代码完美解决了“文字压线”和“光标压线”的问题,核心就是行距=TextSize/3,行距的存在影响了视图效果,加上半行距就好]
(六)总结
发现Bug及时修改,programming的乐趣就在这里了
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。