有时候需要在EditText加上后缀,实现的方法比较简单,自定义EditText,在onDraw中canvas里,获取当前画笔信息,描绘后缀文本信息即可。唯一的难点在于如何定位。
定位
· x坐标
这里我们需要计算文本的尾端至开端的距离,这段距离等于paddingLeft + 文本的宽度。其中文本的宽度我们可以通过 Paint.measureText() 来计算。
·y坐标
通过getLineBounds获取字符基线(baseline)的Y坐标。
拓展
同理,我们可以用上述的方法实现前缀。
不过需要重新对paddingLeft的值进行处理,相对来说比较麻烦点。
代码
以下是实现后缀的EditText:
public class SuffixEditText extends EditText {
protected ColorStateList mSuffixTextColor;
protected String mSuffix = "";
private int mPaintAlpha = 255;
public SuffixEditText(Context context) {
super(context);
}
public SuffixEditText(Context context, AttributeSet attrs) {
super(context, attrs);
}
public SuffixEditText(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
if (mSuffix != null && getText().length() > 0) {
Paint mPaint = getPaint();
mPaint.setColor(mSuffixTextColor.getColorForState(getDrawableState(), 0));
mPaint.setAlpha(mPaintAlpha);
int lineBaseline = getLineBounds(0, null);
canvas.drawText(mSuffix,
getPaint().measureText(getText().toString()) + getPaddingLeft(),
canvas.getClipBounds().top + lineBaseline,
mPaint);
}
}
public void setSuffixTextAlpha(int paintAlpha) {
mPaintAlpha = paintAlpha;
}
public void setSuffixTextColor(ColorStateList suffixTextColor) {
mSuffixTextColor = suffixTextColor;
}
public void setSuffix(String suffix) {
mSuffix = suffix;
invalidate();
}
}
应用
比如我们可以实现一个自动补全的输入框 AutoHintEditText