最近有需求提了一个非常变态的问题
说android输入框的光标显示在了提示文字的下面,也就是说hint文字把光标覆盖了
然后我去看了一下android最原始的输入框, 还真是,光标在hint文字之下闪动,似乎hint是在绘制光标之后绘制的,一开始听了这个需求干脆说不弄 后来也就是今天,周末闲下来研究了一下
思路来了,其实很简单
2个思路:
改光标 ,不动hint
改hint ,不动光标
改光标太麻烦,那玩意还得动,改hint简单啊
我们需要做什么
- hint需要绘制在光标之前
- 需要解析系统hint回来设置的color,textSize
思路分析
- 重写EditText
- 在初始化里,把原始的hint文字获取到,存到成员变量,调用setTint(“”) 使系统的hint始终不做绘制
- 在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);
}
}