在xml选择器中更改drawable的色调

时间:2012-02-27 21:49:35

标签: android xml drawable

我有一个按钮,背景在xml中定义。我想根据它所处的当前状态为按钮着色 - 即 - 按下,聚焦,正常。

下面是我的xml文件。此外,我的colored_tint_darkcolored_tint都是半透明的颜色,我试图在我从资源文件夹调用的可绘制图像上绘制。这是问题所在。当UI首次加载时,图像上具有适当的色调,但是在按下之后,按下的状态不显示任何色调,然后正常状态不会显示任何色调。

<?xml version="1.0" encoding="utf-8"?>

<item android:state_pressed="true" android:drawable="@drawable/rounded_grayscale_pinstripe_button">
    <shape>
        <gradient
            android:endColor="@color/colored_tint"
            android:startColor="@color/colored_tint"
            android:angle="270" />
        <stroke
            android:width="0dp"
            android:color="@color/colored_tint" />
        <corners
            android:radius="0dp" />
        <padding
            android:left="10dp"
            android:top="10dp"
            android:right="10dp"
            android:bottom="10dp" />
    </shape>
</item>

<item android:state_focused="true" android:drawable="@drawable/rounded_grayscale_pinstripe_button">
    <shape>
        <gradient
            android:endColor="@color/colored_tint"
            android:startColor="@color/colored_tint"
            android:angle="270" />
        <stroke
            android:width="0dp"
            android:color="@color/colored_tint" />
        <corners
            android:radius="0dp" />
        <padding
            android:left="10dp"
            android:top="10dp"
            android:right="10dp"
            android:bottom="10dp" />
    </shape>
</item>

<item android:drawable="@drawable/rounded_grayscale_pinstripe_button">        
    <shape>
        <gradient
            android:endColor="@color/colored_tint_dark"
            android:startColor="@color/colored_tint_dark"
            android:angle="270" />
        <stroke
            android:width="0dp"
            android:color="@color/colored_tint_dark" />
        <corners
            android:radius="0dp" />
        <padding
            android:left="10dp"
            android:top="10dp"
            android:right="10dp"
            android:bottom="10dp" />
    </shape>
</item>

我知道java中有解决方案,但我特意在xml中寻找解决方案。感谢。

3 个答案:

答案 0 :(得分:22)

Create a selector tint_menu_item.xml :

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:color="@color/white" android:state_pressed="true" />
    <item android:color="@color/white" android:state_activated="true" />
    <item android:color="@color/green" />
</selector>

(In my example, image is white when selected, and green when not selected)

Then in your xml, you can add tint attribute to ImageView:

<ImageView
    android:layout_width="30dp"
    android:layout_height="30dp"
    android:tint="@color/tint_menu_item"
    android:src="@drawable/ic_menu_home" />

You can also use this selector on a TextView using textColor attibute:

<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:textColor="@color/tint_menu_item" />

答案 1 :(得分:1)

你试过selector吗?

您可以找到一些示例HERE

答案 2 :(得分:0)

假设您有一个appCpmpatImageView并将此**app**:tint="@drawable/custom_tint"添加到compat图像视图中,并且您的自定义色调选择器如下所示:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:color="@color/grey" android:state_pressed="true" />
    <item android:color="@color/silver" android:state_focused="true" />
    <!-- default tint -->
    <item android:color="@color/white" />
</selector>

,因此您的appCompat ImageView将在不同情况下将每种颜色用作色彩。