EditText自定义下划线 - 进阶版

这篇博客详细介绍了如何解决EditText自定义下划线时遇到的问题,包括处理padding、gravity、数字键盘输入类型,提供了具体的解决逻辑和代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值