实现EditText的后缀显示

作者: ONEWateR | 来源:发表于2016-03-14 17:35 被阅读558次

有时候需要在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

相关文章

网友评论

    本文标题:实现EditText的后缀显示

    本文链接:https://www.haomeiwen.com/subject/apmflttx.html