Android EditText光标要显示在hint文字之上?

最近有需求提了一个非常变态的问题
说android输入框的光标显示在了提示文字的下面,也就是说hint文字把光标覆盖了

然后我去看了一下android最原始的输入框, 还真是,光标在hint文字之下闪动,似乎hint是在绘制光标之后绘制的,一开始听了这个需求干脆说不弄 后来也就是今天,周末闲下来研究了一下
思路来了,其实很简单

2个思路:

改光标 ,不动hint
改hint ,不动光标

改光标太麻烦,那玩意还得动,改hint简单啊

我们需要做什么

  1. hint需要绘制在光标之前
  2. 需要解析系统hint回来设置的color,textSize

思路分析

  1. 重写EditText
  2. 在初始化里,把原始的hint文字获取到,存到成员变量,调用setTint(“”) 使系统的hint始终不做绘制
  3. 在onDraw里,在爹类之前绘制的你自己的hintText

下面是完整的代码

public class FixCursorEditText extends AppCompatEditText {

    private String mHint;

    private Paint mHintPaint;
    private int mCurHintTextColor;

    public FixCursorEditText(Context context) {
        super(context);
        init();
    }

    public FixCursorEditText(Context context, AttributeSet attrs) {
        super(context,attrs);
        init();
    }

    public FixCursorEditText(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init();
    }

    private void init() {
        mHint = (String)getHint();
        setHint("");
        mHintPaint = new Paint(Paint.ANTI_ALIAS_FLAG | Paint.DITHER_FLAG);
        mHintPaint.setTextSize(getTextSize());
        mHintPaint.setTextAlign(Paint.Align.LEFT);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        if (TextUtils.isEmpty(getText())) {
            ColorStateList hintTextColors = getHintTextColors();
            if (hintTextColors != null) {
                int color = hintTextColors.getColorForState(getDrawableState(), 0);
                if (color != mCurHintTextColor) {
                    mCurHintTextColor = color;
                    mHintPaint.setColor(color);
                }
            }

            float textWidth = mHintPaint.measureText(mHint);
            float textXPosition = 0f;
            int gravity = getGravity();
            if(gravity == (Gravity.CENTER)){
                textXPosition = getWidth()/2 - textWidth/2;
            }else{
                textXPosition += getPaddingLeft();
            }


            Paint.FontMetricsInt fontMetrics = mHintPaint.getFontMetricsInt();
            float baseline = (getHeight() - fontMetrics.bottom + fontMetrics.top) / 2 - fontMetrics.top;
            canvas.drawText(mHint,textXPosition, baseline, mHintPaint);
        }

        super.onDraw(canvas);
    }
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值