如何在 ColorStateList 中指定无颜色?
How to specify no color in a ColorStateList?
我正在编写一个非常简单的代码,但遇到了一个奇怪的问题。我正在使用 ColorStateList
来为我的 AppCompatImageButton
着色。这是代码:
布局中:
<android.support.v7.widget.AppCompatImageButton
android:layout_width="48dp"
android:layout_height="48dp"
app:srcCompat="@drawable/ic_my_image"
app:tint="@color/my_image_tint_color"
app:tintMode="src_in"
android:scaleType="fitXY"/>
my_image_tint_color.xml:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:color="@color/colorGray" android:state_enabled="false" />
<item android:color="@color/colorAccent" />
</selector>
此代码可以正常工作,如果禁用,它会将我的图像按钮着色为 colorGray
,而默认情况下它会着色为 colorAccent
。
现在我想用多种颜色的图像更改我的按钮图片。因此,我决定在禁用时使用 colorGray
为我的按钮着色,而在未禁用时保持图像的原始颜色。但现在我卡住了。 No Color in android ColorStateList
有什么定义吗?因为我需要在 ColorStateList
中为我的默认状态定义一种颜色。如果我没有为默认状态指定任何内容,则不会显示按钮(它看起来像默认颜色一样透明,按钮将被透明颜色着色)。我试图在颜色列表中将 @null
指定为颜色,但它也不起作用。
我知道我可以在代码中做到这一点,但我更喜欢在 XML 中做到这一点。有没有办法在禁用时将按钮着色为灰色,而如果不在 XML 中则保持原始颜色?
在开头添加00 将使其100% 透明,添加FF 将使其100% 纯色。
假设你喜欢的颜色是红色#FF0000
因此,100% 透明色为:#00ff0000,100% 纯色为:#ffff0000
并且可以使用 00 到 ff 之间的任何值来调整透明度。
所以在colors.xml中添加透明颜色,然后从drawable中访问它
colors.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="trasnparent">#00ff0000</color>
</resources>
my_image_tint_color.xml
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:color="@color/colorGray" android:state_enabled="false" />
<item android:color="@color/colorAccent"
<item android:color="@color/transparent" android:state_something="true"/>
</selector>
如果对您有帮助,请告诉我并投票。谢谢
您可以添加透明颜色,如#00ff0000
一段时间后,我找到了解决问题的正确方法,但由于没有人建议正确的方法,我决定自己 post。也许对其他人有用。
对于我的问题,我需要使用multiply
色调模式来解决我的问题。在这里你如何使用它:
布局中:
<android.support.v7.widget.AppCompatImageButton
android:layout_width="48dp"
android:layout_height="48dp"
app:srcCompat="@drawable/ic_my_image"
app:tint="@color/my_image_tint_color"
app:tintMode="multiply"
android:scaleType="fitXY"/>
my_image_tint_color.xml:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:color="#20909090" android:state_enabled="false" />
<item android:color="#FFFFFFFF" />
</selector>
使用此代码,您可以在按钮启用时看到它是全彩色的。但是如果你禁用你的按钮,它就会变成灰度。
这是如何工作的:
multiply
色调模式由以下等式定义:
Multiplies the color and alpha channels of the drawable with those of
the tint. [Sa * Da, Sc * Dc]
此着色模式只能降低颜色值,因此只能用于使颜色变暗。为了理解以下内容,请记住您需要将 0x00-0xFF 颜色值缩放为 0.0f-1.0f,因此 0x00 将等于 0.0f,0xFF 将等于 1.0f。一般来说,这意味着您需要使用浮点值作为颜色编号,其中:
floating_point_color = byte_color / 255
此外,请记住,在#AABBCCDD
这样的4字节颜色格式中,AA
是alpha,其他字节显示红色、绿色和蓝色。
好的,你是如何使用这个功能来解决我的问题的?
- 我想在启用按钮时保留图像颜色。所以我需要保持图像 alpha 和颜色不变。然后我需要使用颜色
#FFFFFFFF
作为我的启用颜色。在这种情况下,我的原始图片的每个像素的颜色和 alpha 将乘以 1.0f(因为字节是 0xFF),所以原始图像不会有任何变化。
- 为了在禁用模式下对我的图像进行灰度化,我使用了
#20909090
值。首先,我使用 90
表示红色、绿色和蓝色。因为我想使这些颜色变暗,但都以相同的比例。这会以相同的比例使所有颜色变暗,因此您的颜色不会出现异常。使用此比例,白色变为浅灰色 (0x909090),而黑色保持黑色。但是后来我使用 20
作为我的颜色 alpha 以使结果颜色更加透明。这样,如果您的图像背景是白色,您会看到原始图像的灰度图像非常柔和。
这解决了我的问题,但我发现这是 tintMode
属性 的一个非常有用的示例。我会让每个人都喜欢这个小教程。
您应该尝试使用 SRC_ATOP 模式,我认为它会达到您的预期。
布局中:
<android.support.v7.widget.AppCompatImageButton
android:layout_width="48dp"
android:layout_height="48dp"
app:srcCompat="@drawable/ic_my_image"
app:tint="@color/my_image_tint_color"
app:tintMode="src_atop"
android:scaleType="fitXY"/>
my_image_tint_color.xml:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:color="@color/colorGray" android:state_enabled="false" />
<item android:color="@color/transparent" />
</selector>
我正在编写一个非常简单的代码,但遇到了一个奇怪的问题。我正在使用 ColorStateList
来为我的 AppCompatImageButton
着色。这是代码:
布局中:
<android.support.v7.widget.AppCompatImageButton
android:layout_width="48dp"
android:layout_height="48dp"
app:srcCompat="@drawable/ic_my_image"
app:tint="@color/my_image_tint_color"
app:tintMode="src_in"
android:scaleType="fitXY"/>
my_image_tint_color.xml:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:color="@color/colorGray" android:state_enabled="false" />
<item android:color="@color/colorAccent" />
</selector>
此代码可以正常工作,如果禁用,它会将我的图像按钮着色为 colorGray
,而默认情况下它会着色为 colorAccent
。
现在我想用多种颜色的图像更改我的按钮图片。因此,我决定在禁用时使用 colorGray
为我的按钮着色,而在未禁用时保持图像的原始颜色。但现在我卡住了。 No Color in android ColorStateList
有什么定义吗?因为我需要在 ColorStateList
中为我的默认状态定义一种颜色。如果我没有为默认状态指定任何内容,则不会显示按钮(它看起来像默认颜色一样透明,按钮将被透明颜色着色)。我试图在颜色列表中将 @null
指定为颜色,但它也不起作用。
我知道我可以在代码中做到这一点,但我更喜欢在 XML 中做到这一点。有没有办法在禁用时将按钮着色为灰色,而如果不在 XML 中则保持原始颜色?
在开头添加00 将使其100% 透明,添加FF 将使其100% 纯色。 假设你喜欢的颜色是红色#FF0000
因此,100% 透明色为:#00ff0000,100% 纯色为:#ffff0000
并且可以使用 00 到 ff 之间的任何值来调整透明度。
所以在colors.xml中添加透明颜色,然后从drawable中访问它
colors.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="trasnparent">#00ff0000</color>
</resources>
my_image_tint_color.xml
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:color="@color/colorGray" android:state_enabled="false" />
<item android:color="@color/colorAccent"
<item android:color="@color/transparent" android:state_something="true"/>
</selector>
如果对您有帮助,请告诉我并投票。谢谢
您可以添加透明颜色,如#00ff0000
一段时间后,我找到了解决问题的正确方法,但由于没有人建议正确的方法,我决定自己 post。也许对其他人有用。
对于我的问题,我需要使用multiply
色调模式来解决我的问题。在这里你如何使用它:
布局中:
<android.support.v7.widget.AppCompatImageButton
android:layout_width="48dp"
android:layout_height="48dp"
app:srcCompat="@drawable/ic_my_image"
app:tint="@color/my_image_tint_color"
app:tintMode="multiply"
android:scaleType="fitXY"/>
my_image_tint_color.xml:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:color="#20909090" android:state_enabled="false" />
<item android:color="#FFFFFFFF" />
</selector>
使用此代码,您可以在按钮启用时看到它是全彩色的。但是如果你禁用你的按钮,它就会变成灰度。
这是如何工作的:
multiply
色调模式由以下等式定义:
Multiplies the color and alpha channels of the drawable with those of the tint. [Sa * Da, Sc * Dc]
此着色模式只能降低颜色值,因此只能用于使颜色变暗。为了理解以下内容,请记住您需要将 0x00-0xFF 颜色值缩放为 0.0f-1.0f,因此 0x00 将等于 0.0f,0xFF 将等于 1.0f。一般来说,这意味着您需要使用浮点值作为颜色编号,其中:
floating_point_color = byte_color / 255
此外,请记住,在#AABBCCDD
这样的4字节颜色格式中,AA
是alpha,其他字节显示红色、绿色和蓝色。
好的,你是如何使用这个功能来解决我的问题的?
- 我想在启用按钮时保留图像颜色。所以我需要保持图像 alpha 和颜色不变。然后我需要使用颜色
#FFFFFFFF
作为我的启用颜色。在这种情况下,我的原始图片的每个像素的颜色和 alpha 将乘以 1.0f(因为字节是 0xFF),所以原始图像不会有任何变化。 - 为了在禁用模式下对我的图像进行灰度化,我使用了
#20909090
值。首先,我使用90
表示红色、绿色和蓝色。因为我想使这些颜色变暗,但都以相同的比例。这会以相同的比例使所有颜色变暗,因此您的颜色不会出现异常。使用此比例,白色变为浅灰色 (0x909090),而黑色保持黑色。但是后来我使用20
作为我的颜色 alpha 以使结果颜色更加透明。这样,如果您的图像背景是白色,您会看到原始图像的灰度图像非常柔和。
这解决了我的问题,但我发现这是 tintMode
属性 的一个非常有用的示例。我会让每个人都喜欢这个小教程。
您应该尝试使用 SRC_ATOP 模式,我认为它会达到您的预期。
布局中:
<android.support.v7.widget.AppCompatImageButton
android:layout_width="48dp"
android:layout_height="48dp"
app:srcCompat="@drawable/ic_my_image"
app:tint="@color/my_image_tint_color"
app:tintMode="src_atop"
android:scaleType="fitXY"/>
my_image_tint_color.xml:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:color="@color/colorGray" android:state_enabled="false" />
<item android:color="@color/transparent" />
</selector>