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

Posted

技术标签:

【中文标题】在 xml 选择器中更改 drawable 的色调【英文标题】:Change the tint of drawable in xml selector 【发布时间】:2012-03-17 09:18:22 【问题描述】:

我有一个在 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:
            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:
            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:
            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中寻找解决方案。谢谢。

【问题讨论】:

【参考方案1】:

创建一个选择器 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>

(在我的示例中,选中时图像为白色,未选中时为绿色)

然后在您的 xml 中,您可以将 tint 属性添加到 ImageView:

<ImageView
    android:layout_
    android:layout_
    android:tint="@color/tint_menu_item"
    android:src="@drawable/ic_menu_home" />

您也可以使用 textColor 属性在 TextView 上使用此选择器:

<TextView
    android:layout_
    android:layout_
    android:textColor="@color/tint_menu_item" />

【讨论】:

您好,我对 Api 18 及更低版本上的色调选择器有疑问 link 您有什么建议吗? android:tint 属性不适用于所有 API。要解决此问题,您可以直接创建具有正确颜色的 .png 文件,然后从 ImageView 中删除 android:tint 属性 tint_menu_item.xml 应该放在哪里? 在“res”中创建一个新文件夹“color”(在“values”文件夹、“drawable”文件夹等旁边)。然后把你的 tint_menu_item.xml 放进去。【参考方案2】:

你试过selector吗?

你可以找到一些例子HERE

【讨论】:

【参考方案3】:

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

<?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 将在不同情况下使用每种颜色作为色调。

【讨论】:

以上是关于在 xml 选择器中更改 drawable 的色调的主要内容,如果未能解决你的问题,请参考以下文章

了解使用 ColorMatrix 和 ColorMatrixColorFilter 修改 Drawable 的色调

如何在 Android 选择器中定义粗体?

更改全局色调颜色 - iOS 7/iOS 8

如何在不修改原始drawable的情况下设置vectorDrawable的色调?

Swift - 为啥我在选择时无法更改色调?

如何在 iOS 14 中更改 UIPickerView 选择的色调颜色?