Android 如何在ColorStateList中不指定颜色?

Android 如何在ColorStateList中不指定颜色?,android,android-support-library,Android,Android Support Library,我正在编写一个非常简单的代码,但遇到了一个奇怪的问题。我正在使用ColorStateList为我的AppCompatImageButton着色。代码如下: 在布局中: my_image_tint_color.xml: 此代码工作正常,如果禁用,它会使用colorGray为“我的图像”按钮着色,而默认情况下它是由colorAccent着色的 现在我想用多种颜色的图像更改我的按钮图片。因此,如果禁用,我决定用colorGray着色按钮,如果不禁用,则保留图像的原始颜色。但现在我被卡住了。an

我正在编写一个非常简单的代码,但遇到了一个奇怪的问题。我正在使用
ColorStateList
为我的
AppCompatImageButton
着色。代码如下:

在布局中:


my_image_tint_color.xml:


此代码工作正常,如果禁用,它会使用
colorGray
为“我的图像”按钮着色,而默认情况下它是由
colorAccent
着色的

现在我想用多种颜色的图像更改我的按钮图片。因此,如果禁用,我决定用
colorGray
着色按钮,如果不禁用,则保留图像的原始颜色。但现在我被卡住了。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>

#00ff0000
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

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

对于我的问题,我需要使用
multiply
tint模式来解决我的问题。以下是您如何使用它:

在布局中:

此外,请记住,在4字节的颜色格式中,如
#AABBCCDD
AA
是alpha,其他字节显示红色、绿色和蓝色

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

  • 我想在按钮启用时保留图像颜色。所以我需要保持图像的alpha和颜色不变。然后我需要使用颜色
    #FFFFFFFF
    作为启用颜色。在这种情况下,我的原始图片的每个像素的颜色和alpha将乘以1.0f(因为字节是0xFF),所以原始图像中不会有任何变化
  • 为了在禁用模式下对图像进行灰度缩放,我使用了
    #209090
    值。首先,我用
    90
    表示红色、绿色和蓝色。因为我想把这些颜色调暗,但都是相同的比例。这会在同一比例下使所有颜色变暗,所以您的颜色不会出现异常。使用此比例,白色变为浅灰色(0x9090),而黑色保持黑色。但后来我使用
    20
    作为我的颜色alpha,使生成的颜色更透明。这样,如果您的图像背景是白色的,您将看到原始图像中一个非常柔和的灰度图像

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

    你应该尝试一下SRC_-top模式,我想它会达到你的期望

    在布局中:

    
    
    my_image_tint_color.xml:


    这不起作用。如果我使用
    透明
    颜色着色图像,则图像在我想要查看图像时变为透明。我想看到的是默认状态下的图像(某种程度上类似于无色调),而禁用状态下的图像为灰色。
    <?xml version="1.0" encoding="utf-8"?>
    <resources>
        <color name="trasnparent">#00ff0000</color>
    </resources>
    
    <?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>
    
    <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"/>
    
    <?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>
    
    floating_point_color = byte_color / 255
    
        <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"/>
    
        <?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>