在代码中设置形状资源/ GradientDrawable的填充

时间:2012-01-19 15:38:29

标签: android

我有一个带有选择器的xml文件,它定义了按钮的不同状态:

<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="true" android:drawable="@drawable/custom_green_button_selected_state" />
<item android:state_enabled="false" android:drawable="@drawable/custom_green_button_disabled_state" />  
<item android:drawable="@drawable/custom_green_button_normal_state"/>
</selector>

然后在我的每个可绘制的xml中,我都有关于按钮如何显示的信息:

<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<gradient android:type="linear" android:gradientRadius="180"
    android:startColor="#6b9f41" android:endColor="#598a3d" />

<corners android:bottomRightRadius="7dp"
    android:bottomLeftRadius="7dp" android:topLeftRadius="7dp"
    android:topRightRadius="7dp" />
<padding android:left="15dp" android:right="15dp" android:top="10dp"
    android:bottom="10dp" />
</shape>

对于我的应用程序中的大多数按钮,我只应用第一个xml作为背景,一切正常。对于一个特定的按钮,我想使用相同的xmls,但通过更改drawables的填充使按钮更瘦。我以为我会尝试在我的代码中创建一个新的StateListDrawable并添加每个状态的drawable xmls的mutate,但是,这些drawables显示为GradientDrawables,它似乎不能让我访问它们的padding属性。有什么想法吗?

2 个答案:

答案 0 :(得分:1)

背景可绘制的填充也由View类中的setPadding设置。

您可以通过在setBackgroundDrawable之后调用setPadding来设置填充。

这是core / java / android / view / View.java:

/**
 * Set the background to a given Drawable, or remove the background. If the
 * background has padding, this View's padding is set to the background's
 * padding. However, when a background is removed, this View's padding isn't
 * touched. If setting the padding is desired, please use
 * {@link #setPadding(int, int, int, int)}.
 *
 * @param d The Drawable to use as the background, or null to remove the
 *        background
 */
public void setBackgroundDrawable(Drawable d) {
    boolean requestLayout = false;

    mBackgroundResource = 0;

    /*
     * Regardless of whether we're setting a new background or not, we want
     * to clear the previous drawable.
     */
    if (mBGDrawable != null) {
        mBGDrawable.setCallback(null);
        unscheduleDrawable(mBGDrawable);
    }

    if (d != null) {
        Rect padding = sThreadLocal.get();
        if (padding == null) {
            padding = new Rect();
            sThreadLocal.set(padding);
        }
        if (d.getPadding(padding)) {
            setPadding(padding.left, padding.top, padding.right, padding.bottom);
        }

答案 1 :(得分:0)

  

对于一个特定的按钮,我想使用相同的xmls但是要制作   通过更改drawables的填充来更换skinnier。

那就是你的问题。您不应使用填充来设置按钮大小。而是依赖layout_heightlayout_width或以onMeasure(在自定义按钮中)以编程方式设置