我正在编写一个非常简单的代码,但遇到了一个奇怪的问题。我正在使用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)?
在开头添加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等透明色
过了一会儿,我找到了解决问题的正确方法,因为没有人提出正确的方法,我决定自己发布。也许它会对其他人有用。
对于我的问题,我需要使用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
色调模式由以下等式定义:
将drawable的颜色和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
是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>