如何在ColorStateList中不指定颜色?

时间:2019-04-08 06:42:42

标签: android android-support-library

我正在编写一个非常简单的代码,但是遇到了一个奇怪的问题。我正在使用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着色,而在未禁用的情况下使图像保持原始颜色。但是现在我被卡住了。在Android ColorStateList中有没有定义 No Color 的内容?因为我需要为ColorStateList中的默认状态定义颜色。如果我未为默认状态指定任何内容,则不会显示Button(默认颜色似乎是透明的,而按钮将由透明颜色着色)。我尝试将@null指定为颜色列表中的颜色,但是它也不起作用。

我知道我可以用代码做到这一点,但是我更喜欢用XML做到这一点。如果没有禁用XML,是否可以将按钮设置为灰色,而如果不使用XML,则可以保留原始颜色?

4 个答案:

答案 0 :(得分:0)

在开头添加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>

请让我知道它是否对您有帮助,请投票。谢谢

答案 1 :(得分:0)

您可以添加#00ff0000之类的透明颜色

答案 2 :(得分:0)

过了一会儿,我找到了解决问题的正确方法,并且由于没有人建议正确的方法,所以我决定自己发布。也许对其他人有用。

对于我的问题,我需要使用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色调模式由以下公式定义:

  

将可绘制对象的颜色和alpha通道乘以   色彩。 [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是字母,其他字节显示红色,绿色和蓝色。

好,您如何使用此功能解决我的问题?

  1. 启用按钮后,我想保留图像颜色。因此,我需要保持图像的Alpha和颜色不变。然后,我需要使用颜色#FFFFFFFF作为启用颜色。在这种情况下,我的原始图片的每个像素的颜色和Alpha将乘以1.0f(因为字节为0xFF),所以原始图像不会有变化。
  2. 为了在禁用模式下对图像进行灰度处理,我使用了#20909090值。首先,我将90用于红色,绿色和蓝色。因为我想使这些颜色变暗,但比例都相同。这会使所有颜色以相同的比例变暗,因此您的颜色不会出现异常。在此比例下,白色变为浅灰色(0x909090),而黑色保持黑色。但是后来我使用20作为我的颜色alpha,使生成的颜色更加透明。这样,如果您的图像背景是白色,则您会看到原始图像中的灰度图像变淡。

这解决了我的问题,但是我发现这是tintMode属性的一个非常有用的示例。我会让每个人都喜欢这个小教程。

答案 3 :(得分:0)

您应该尝试使用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>