在 xml 选择器中更改 drawable 的色调
Posted
技术标签:
【中文标题】在 xml 选择器中更改 drawable 的色调【英文标题】:Change the tint of drawable in xml selector 【发布时间】:2012-03-17 09:18:22 【问题描述】:我有一个在 xml 中定义背景的按钮。我想根据按钮的当前状态为按钮着色 - 即 - 按下、聚焦、正常。
下面是我的 xml 文件。此外,我的colored_tint_dark
和colored_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 的色调