EditText自定义下划线

来源:互联网 发布:淘宝rol是指什么 编辑:程序博客网 时间:2024/05/21 10:37

一、解决设置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;    }}


原创粉丝点击