TextView的drawable与文本一起居中

196 阅读1分钟

继承TextView类,重写onDraw(),首先调用getPaint().measureText(getText().toString())获取文本显示宽度,然后通过setGravity()设置对齐位置,获取drawable和文本间的padding值,并获取Drawable宽度,最后计算出整个内容的高度,通过Canvas.translate()设置显示位置。

@Override
protected void onDraw(Canvas canvas) {
    Drawable[] drawables = getCompoundDrawables();
    if (drawables != null) {
        Drawable leftDrawable = drawables[0];
        Drawable rightDrawable = drawables[2];
        if (leftDrawable != null || rightDrawable != null) {
            //  获取文本显示宽度
            float strWidth = getPaint().measureText(getText().toString());
            int padding = getCompoundDrawablePadding();
            int drawableWidth;
            float contentWidth;
            if (leftDrawable != null) {
                setGravity(Gravity.START | Gravity.CENTER_VERTICAL);
                //  获取Drawable宽度
                drawableWidth = leftDrawable.getIntrinsicWidth();
                contentWidth = strWidth + padding + drawableWidth;
                if (getWidth() - contentWidth > 0) {
                    canvas.translate((getWidth() - contentWidth - getPaddingLeft() - getPaddingRight()) / 2,0);
                }
            }

            if (rightDrawable != null) {
                setGravity(Gravity.END | Gravity.CENTER_VERTICAL);
                //  获取Drawable宽度
                drawableWidth = rightDrawable.getIntrinsicWidth();
                contentWidth = strWidth + padding + drawableWidth;
                setPadding(0,0,(int)(getWidth() - contentWidth),0);
                if (getWidth() - contentWidth > 0) {
                    canvas.translate(-(getWidth() - contentWidth - getPaddingRight() - getPaddingLeft()) / 2,0);
                }
            }
        } else {
            setGravity(Gravity.CENTER);
        }
    }
    
    super.onDraw(canvas);
}