为xml中的按钮定义自定义形状。现在我想动态改变颜色。怎么样?

时间:2016-10-21 19:08:00

标签: android android-drawable android-button android-shape android-color

我有这个:

round_button.xml

<xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="true">
    <shape android:shape="oval">
        <solid android:color="#dec60000"/>
        <size android:width="150dp" android:height="150dp"/>
    </shape>
</item>
<item android:state_pressed="false">
    <shape android:shape="oval">
        <solid android:color="#860000"/>
        <size android:width="150dp" android:height="150dp"/>
    </shape>
</item>

我的按钮:

 <Button
        android:id="@+id/incrementBTN"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:layout_centerVertical="true"
        android:background="@drawable/round_button"
        android:onClick="onClick"
        android:soundEffectsEnabled="true"
        android:text="0"
        android:textSize="50sp"
        tools:ignore="HardcodedText" />

动态地,我想要以编程方式更改背景颜色(在round_button xml 中定义)。有没有办法可以做到这一点?

3 个答案:

答案 0 :(得分:2)

如果你想为你的按钮定义某些状态,你可以在xml中设置它们,而不必以编程方式设置它们(如果你这样做,你确实可以设置一个过滤器,但它可以如果你有很多国家和条件IMO,那就太乱了。

我将详细介绍这里的步骤:

1)创建具有所需状态的xml

您可以使用已定义状态在drawable文件夹中创建带有选择器的xml。例如,

<强> button_bkg.xml

<?xml version="1.0" encoding="utf-8"?>
    <selector xmlns:android="http://schemas.android.com/apk/res/android">
        <item android:drawable="@drawable/bkg_is_pressed" android:state_pressed="true"/>
        <item android:drawable="@drawable/bkg_is_disabled" android:state_enabled="false"/>
        <item android:drawable="@drawable/bkg_default"/>
</selector>

我们将此文件称为 button_bkg.xml 。在上面的例子中,我列出了3种状态:按下,禁用和默认,这意味着,当按下按钮时,它将采用bkg_is_pressed背景,当我将按钮设置为禁用时(无论是在xml中还是以编程方式通过setEnabled(boolean),它都将采用bkg_is_disabled背景。

2)创建背景

现在,您将定义背景在您定义的xml文件中的内容(bkg_is_pressed,bkg_is_default,bkg_is_pressed)。在您的情况下,例如,您将获取round_button.xml文件中定义的每个形状,并将它们分成您为状态定义的每个xml文件。就我而言,我定义了一个图层列表:

<强> bkg_is_pressed.xml

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item>
    <shape android:shape="rectangle">
            <corners android:radius="@dimen/button_corner_radius"/>
            <solid android:color="@color/color_alert"/>
            <stroke
                 android:width="@dimen/universal_1_pixel"
                    android:color="@color/color_gray_dark"/>
        </shape>
    </item>
    <item>
        <shape android:shape="rectangle">
            <corners android:radius="@dimen/button_corner_radius"/>
            <solid android:color="@color/color_mask_highlighted"/>
        </shape>
    </item>
</layer-list>

你会为每个州做到这一点。

重要的是要注意,如果您要为API 21+构建,可以通过在drawables-v21文件夹中创建ANOTHER button_bkg.xml文件来定义涟漪效果,如下所示:

button_bkg.xml(在drawable-v21文件夹中)

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@drawable/bkg_is_disabled" android:state_enabled="false" />
    <item android:drawable="@drawable/bkg_is_pressed" />

要使用纹波,您可以按照以下说明定义颜色:

bkg_is_pressed.xml (在您的drawable-v21文件夹中)

<?xml version="1.0" encoding="utf-8"?>
<ripple xmlns:android="http://schemas.android.com/apk/res/android"
android:color="@color/color_mask_highlighted">
    <item android:drawable="@drawable/bkg_is_default" />
</ripple>

您只需将button_bkg.xml和bkg_is_pressed.xml放入drawable-v21文件夹文件中即可。就我而言,21 +和21- API的bkg_is_default和bkg_is_disabled.xml是相同的,所以我没有将它添加到我的drawable-v21文件夹中,我只是在drawable文件夹中创建它。

我想强调您 STILL 需要常规drawable文件夹中的其他文件,以便具有API 21的设备能够正常运行。

3)将该背景分配给按钮

最后,您只需要为按钮定义背景:

<Button
    ...
    android:background="@drawable/button_bkg
/>

所以,你有它。这样,您不需要以编程方式设置样式,只需在xml文件中定义所有背景(根据您的状态)。 但是,如果你也喜欢以编程方式设置它们,你也可以这样做,只需使用setBackground并使用你定义的xml文件并应用你想要的状态逻辑(如果按下按钮,setBackground(bkg_is_pressed)等等) )

我希望有帮助,请告诉我这是否适合您。

答案 1 :(得分:1)

我通过设置ColorFilter来解决它:

Drawable mDrawable = context.getResources().getDrawable(R.drawable.balloons); 
mDrawable.setColorFilter(new PorterDuffColorFilter(0xffff00,PorterDuff.Mode.MULTIPLY));
myButton.setResource(mDrawable);

答案 2 :(得分:-1)

您可以根据需要使用的颜色从代码构造形状,从中创建StateListDrawable并将其设置为按钮背景。