public class IconTextView extends androidx.appcompat.widget.AppCompatTextView {
private Drawable icon;
private int iconSize;
private int iconPadding;
public IconTextView(Context context, AttributeSet attrs) {
super(context, attrs);
init(context, attrs);
}
public IconTextView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init(context, attrs);
}
private void init(Context context, AttributeSet attrs) {
TypedArray mTypedArray = context.obtainStyledAttributes(attrs, R.styleable.IconTextView);
this.iconSize = (int) mTypedArray.getDimension(R.styleable.IconTextView_iconSize, 0);
this.iconPadding = (int) mTypedArray.getDimension(R.styleable.IconTextView_iconPadding, 20);
this.icon = mTypedArray.getDrawable(R.styleable.IconTextView_icon);
mTypedArray.recycle();
}
@Override
protected void onDraw(Canvas canvas) {
if (icon != null) {
// 计算图标的缩放比例,使其适应给定的大小但不变形
float scale = Math.min(iconSize / (float) icon.getIntrinsicWidth(),
iconSize / (float) icon.getIntrinsicHeight());
// 计算绘制图标的位置和大小,保持原始宽高比例
int iconWidth = (int) (icon.getIntrinsicWidth() * scale);
int iconHeight = (int) (icon.getIntrinsicHeight() * scale);
int iconLeft = iconPadding;
int iconTop = (getHeight() - iconHeight) / 2;
int iconStart = getPaddingTop() + 10;
// 设置图标的绘制区域
icon.setBounds(iconLeft, iconStart, iconLeft + iconWidth, iconStart + iconHeight);
// 绘制图标
icon.draw(canvas);
// 绘制文字
TextPaint textPaint = getPaint();
textPaint.setColor(getCurrentTextColor());
textPaint.setTextSize(getTextSize());
int availableWidth =
getWidth() - getPaddingLeft() - getPaddingRight() - iconWidth - iconPadding - iconLeft;
CharSequence text = getText();
StaticLayout staticLayout = new StaticLayout(text, textPaint, availableWidth,
Layout.Alignment.ALIGN_NORMAL, 1.0f, 0.0f, false);
float textY = iconTop + (iconHeight - staticLayout.getHeight()) / 2.0f;
canvas.save();
canvas.translate(iconLeft + iconWidth + iconPadding, textY);
staticLayout.draw(canvas);
canvas.restore();
} else {
super.onDraw(canvas);
}
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}
}
自定义属性
<declare-styleable name="IconTextView">
<attr name="iconSize" format="dimension" />
<attr name="iconPadding" format="dimension" />
<attr name="icon" format="reference" />
</declare-styleable>