一、解决设置padding问题
如果EditText设置padding属性,下划线和文字就无法匹配。
解决逻辑:
1.获取四边padding的值
int paddingLeft = getPaddingLeft();
int paddingRight = getPaddingRight();
int paddingTop = getPaddingTop();
int paddingBottom = getPaddingBottom();
2.划线时,设置drawLine
canvas.drawLine(0 + paddingLeft, lineY + paddingBottom, textWidth + paddingLeft, lineY + paddingBottom, paint);
二、解决设置gravity问题
如果EditText中设置了android:gravity="right"或者android:gravity="left"的话,下划线和文字会分别出现在左右方向。
解决逻辑:
1.由于EditText中gravity的判断非常麻烦
单纯靠 getGravity() 和 Gravity.LEFT 、Gravity.RIGHT 判断是不准确的。
2.在LineEditText 中设置新的属性 sit,来判断gravity位置。
public static final int sitLeft = 1;
public static final int sitRight = 2;
private int sit = sitRight;
3.划线前,判断sit
if (sit == sitLeft) {
canvas.drawLine(0 + paddingLeft, lineY + paddingBottom, textWidth + paddingLeft, lineY + paddingBottom, paint);
} else if (sit == sitRight) {
canvas.drawLine(lineWidth - paddingRight, lineY + paddingBottom, lineWidth - paddingRight - textWidth, lineY + paddingBottom, paint);
} else {//暂不支持复杂
canvas.drawLine(0, lineY, textWidth, lineY, paint);
}
三、解决数字键盘问题
如果EditText中设置了数字键盘 android:inputType="number",下划线就无法出现。
解决逻辑:
1. android:inputType="number|text"也无法显示下划线
2. 先去掉xml文件中的 inputType设置,再在java文件中设置
String digits = "0123456789.";
etValue.setKeyListener(DigitsKeyListener.getInstance(digits));
四、代码如下
public class LineEditText extends EditText {
// 画笔 用来画下划线
private Paint paint;
public static final int sitLeft = 1;
public static final int sitRight = 2;
private int sit = sitRight;
private boolean hasLine = true;
public LineEditText(Context context) {
super(context);
paint = new Paint();
paint.setStyle(Paint.Style.STROKE);
paint.setColor(ContextCompat.getColor(context, R.color.text_line));
// 开启抗锯齿 较耗内存
paint.setAntiAlias(true);
}
public LineEditText(Context context, AttributeSet attrs) {
super(context, attrs);
paint = new Paint();
paint.setStyle(Paint.Style.STROKE);
paint.setColor(ContextCompat.getColor(context, R.color.text_line));
// 开启抗锯齿 较耗内存
paint.setAntiAlias(true);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
if (hasLine) {
// 得到总行数
int lineCount = getLineCount();
// 得到每行的高度
int lineHeight = getLineHeight();
//获取padding上下左右
int paddingLeft = getPaddingLeft();
int paddingRight = getPaddingRight();
int paddingTop = getPaddingTop();
int paddingBottom = getPaddingBottom();
// 判断gravity
// int gravity = Integer.parseInt(String.valueOf(getGravity()).substring(0, 1));
// 获取EditText中文字的物理长度
TextPaint mTextPaint = getPaint();
float textWidth = mTextPaint.measureText(getText().toString());
// 根据行数循环画线
for (int i = 0; i < lineCount; i++) {
int lineY = (i + 1) * lineHeight;
// 得到每行的宽度
int lineWidth = getWidth();
if (sit == sitLeft) {
canvas.drawLine(0 + paddingLeft, lineY + paddingBottom, textWidth + paddingLeft, lineY + paddingBottom, paint);
} else if (sit == sitRight) {
canvas.drawLine(lineWidth - paddingRight, lineY + paddingBottom, lineWidth - paddingRight - textWidth, lineY + paddingBottom, paint);
} else {//暂不支持复杂
canvas.drawLine(0, lineY, textWidth, lineY, paint);
}
}
}
}
public boolean isHasLine() {
return hasLine;
}
public void setHasLine(boolean hasLine) {
this.hasLine = hasLine;
}
public int getSit() {
return sit;
}
public void setSit(int sit) {
this.sit = sit;
}
}