Android如何设置drawableLeft的大小

问题背景

在Android开发中,我们经常需要在TextView或Button等控件中设置一个图标,并且希望能够控制图标的大小、颜色等属性。其中,drawableLeft用于在文本左侧设置一个图标,但默认情况下,它的大小是根据图标的原始尺寸来显示的。如果我们想改变drawableLeft的大小,该怎么办呢?

解决方案

要解决这个问题,我们可以通过以下几种方式来设置drawableLeft的大小:

1. 使用TextViewsetCompoundDrawables()方法

我们可以通过TextViewsetCompoundDrawables()方法来设置drawableLeft的大小。具体步骤如下:

首先,在XML布局文件中定义一个TextView控件,并设置drawableLeft属性。

<TextView
    android:id="@+id/textView"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:drawableLeft="@drawable/icon"
    android:text="Hello World!" />

然后,在Java代码中获取该TextView控件,并调用setCompoundDrawables()方法来设置drawableLeft的大小。

TextView textView = findViewById(R.id.textView);
Drawable drawable = getResources().getDrawable(R.drawable.icon);
drawable.setBounds(0, 0, 50, 50); // 设置图标的宽高
textView.setCompoundDrawables(drawable, null, null, null); // 设置drawableLeft

通过调用drawable.setBounds()方法,我们可以设置图标的宽度和高度。在上述代码中,我们将图标的宽高设置为50。

2. 使用TextViewDrawablePadding属性

除了上述方法,我们还可以通过TextViewDrawablePadding属性来设置drawableLeft的大小。具体步骤如下:

首先,在XML布局文件中定义一个TextView控件,并设置drawableLeftdrawablePadding属性。

<TextView
    android:id="@+id/textView"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:drawableLeft="@drawable/icon"
    android:drawablePadding="10dp"
    android:text="Hello World!" />

在上述代码中,通过设置drawablePadding属性,我们可以调整drawableLeft的大小。这里我们将drawablePadding设置为10dp,表示在图标左侧添加10dp的间距。

3. 自定义TextView控件

如果我们在多个地方需要设置drawableLeft的大小,可以考虑自定义一个TextView控件,通过重写onDraw()方法来实现。

首先,创建一个MyTextView类,并继承自TextView

public class MyTextView extends TextView {

    private Drawable drawableLeft;

    public MyTextView(Context context) {
        super(context);
    }

    public MyTextView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public MyTextView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        // 绘制drawableLeft
        if (drawableLeft != null) {
            int drawableWidth = drawableLeft.getIntrinsicWidth();
            int drawableHeight = drawableLeft.getIntrinsicHeight();
            int left = (getWidth() - drawableWidth) / 2; // 计算图标左侧坐标
            int top = (getHeight() - drawableHeight) / 2; // 计算图标上方坐标
            drawableLeft.setBounds(left, top, left + drawableWidth, top + drawableHeight);
            drawableLeft.draw(canvas);
        }
        // 绘制文本
        super.onDraw(canvas);
    }

    @Override
    public void setCompoundDrawables(Drawable left, Drawable top, Drawable right, Drawable bottom) {
        drawableLeft = left; // 保存drawableLeft
        super.setCompoundDrawables(left, top, right, bottom);
    }
}

在上述代码中,我们重写了onDraw()方法,在绘制文本之前,绘制了drawableLeft。我们通过计算图标的左上角坐标,来实现对drawableLeft的大小控制。同时,我们通过setCompoundDrawables()方法将drawableLeft保存起来。

然后,在XML布局文件中使用MyTextView控件。

<com.example.MyTextView
    android:id="@+id/myTextView"
    android:layout_width="wrap_content"