继承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);
}