以编程方式为 ImageView 设置状态色调
Set a Stateful Tint for an ImageView Programatically
我正在尝试以编程方式更新 ImageView 的色调,我使用的颜色是一个选择器,它在视图启用或禁用时具有不同的颜色。当我尝试使用其他 Whosebug 帖子中建议的方法时,它会设置启用的颜色,但不会为禁用的视图更新
例如,我在 XML 中有以下四个点为红色,我在代码中将底部两个点设置为绿色。右边的两个点被禁用,所以我希望它们是相同的禁用灰色,但正如您所看到的,以编程方式设置的颜色始终为绿色
https://i.stack.imgur.com/tFpgp.png
如何以编程方式更新 ImageView 的色调,使其正确遵循选择器中的状态?
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal" >
<!-- Also tried making these AppCompatImageViews -->
<ImageView
android:id="@+id/imgDot1"
android:layout_width="40dp"
android:layout_height="40dp"
android:tint="@color/color_red_stateful"
android:src="@drawable/ic_dot" />
<ImageView
android:id="@+id/imgDot2"
android:layout_width="40dp"
android:layout_height="40dp"
android:tint="@color/color_red_stateful"
android:src="@drawable/ic_dot" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal" >
<ImageView
android:id="@+id/imgDot3"
android:layout_width="40dp"
android:layout_height="40dp"
android:tint="@color/color_red_stateful"
android:src="@drawable/ic_dot" />
<ImageView
android:id="@+id/imgDot4"
android:layout_width="40dp"
android:layout_height="40dp"
android:tint="@color/color_red_stateful"
android:enabled="false"
android:src="@drawable/ic_dot" />
</LinearLayout>
imgDot2.isEnabled = false
imgDot4.isEnabled = false
// Tried each of these in turn
ImageViewCompat.setImageTintList(imgDot3, ColorStateList.valueOf(resources.getColor(R.color.color_green_stateful)))
ImageViewCompat.setImageTintList(imgDot4, ColorStateList.valueOf(resources.getColor(R.color.color_green_stateful)))
imgDot3.setColorFilter(ContextCompat.getColor(this, R.color.color_green_stateful))
imgDot4.setColorFilter(ContextCompat.getColor(this, R.color.color_green_stateful))
imgDot3.imageTintList = ColorStateList.valueOf(resources.getColor(R.color.color_green_stateful))
imgDot4.imageTintList = ColorStateList.valueOf(resources.getColor(R.color.color_green_stateful))
imgDot3.imageTintList = ColorStateList.valueOf(ContextCompat.getColor(this, R.color.color_green_stateful))
imgDot4.imageTintList = ColorStateList.valueOf(ContextCompat.getColor(this, R.color.color_green_stateful))
color_red_stateful.xml
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_enabled="false" android:color="#999"/>
<item android:color="#F00"/>
</selector>
color_green_stateful.xml
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_enabled="false" android:color="#999"/>
<item android:color="#0F0"/>
</selector>
ic_dot.xml
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24.0"
android:viewportHeight="24.0">
<path
android:fillColor="#000"
android:pathData="M12,12m-10,0a10,10 0,1 1,20 0a10,10 0,1 1,-20 0"/>
</vector>
您在每个尝试过的行中都使用了 getColor
方法,但这是不正确的,那不是颜色,那是 selector
(color_red_stateful
和 color_green_stateful
文件) .使用 Resources
或最好使用 ContextCompat
class 及其有用的方法 getColorStateList
ColorStateList colorStateList = ContextCompat.getColorStateList(this, R.color.your_color_selector);
此 colorStateList
应设置为 imageTintList
以获得所需的 ImageView
s
顺便说一句。在上面设置后,你可以使用 view.invalidate()
方法强制立即应用更改(强制重绘),但在大多数情况下,也可能是你的,这将不需要
I am trying to update the tint of an ImageView programmatically, and the colour I'm using is a selector that has different colours for when the view is enabled or disabled
选项 1:
据我所知,您已经为 XML 文件中的每个视图设置了 android:tint
。
因此,要以编程方式启用禁用,您需要在启用或禁用后更新视图。
首先将 isEnabled 设置为 true 或 false:
imgDot2.isEnabled = false
imgDot4.isEnabled = false
无效视图:
imgDot2.invalidate()
imgDot4.invalidate()
然后它将根据您的输入更新视图。
无需在Activity中再次设置setImageTintList
或setColorFilter
。
选项2:
然后想以编程方式设置颜色
ImageViewCompat.setImageTintList(imgDot2, ContextCompat.getColorStateList(this, R.color.color_green_stateful))
ImageViewCompat.setImageTintList(imgDot4, ContextCompat.getColorStateList(this, R.color.color_green_stateful))
无效视图:
imgDot2.invalidate()
imgDot4.invalidate()
注意:您必须在 XML 中使用 app:tint
而不是 android:tint
。
我正在尝试以编程方式更新 ImageView 的色调,我使用的颜色是一个选择器,它在视图启用或禁用时具有不同的颜色。当我尝试使用其他 Whosebug 帖子中建议的方法时,它会设置启用的颜色,但不会为禁用的视图更新
例如,我在 XML 中有以下四个点为红色,我在代码中将底部两个点设置为绿色。右边的两个点被禁用,所以我希望它们是相同的禁用灰色,但正如您所看到的,以编程方式设置的颜色始终为绿色
https://i.stack.imgur.com/tFpgp.png
如何以编程方式更新 ImageView 的色调,使其正确遵循选择器中的状态?
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal" >
<!-- Also tried making these AppCompatImageViews -->
<ImageView
android:id="@+id/imgDot1"
android:layout_width="40dp"
android:layout_height="40dp"
android:tint="@color/color_red_stateful"
android:src="@drawable/ic_dot" />
<ImageView
android:id="@+id/imgDot2"
android:layout_width="40dp"
android:layout_height="40dp"
android:tint="@color/color_red_stateful"
android:src="@drawable/ic_dot" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal" >
<ImageView
android:id="@+id/imgDot3"
android:layout_width="40dp"
android:layout_height="40dp"
android:tint="@color/color_red_stateful"
android:src="@drawable/ic_dot" />
<ImageView
android:id="@+id/imgDot4"
android:layout_width="40dp"
android:layout_height="40dp"
android:tint="@color/color_red_stateful"
android:enabled="false"
android:src="@drawable/ic_dot" />
</LinearLayout>
imgDot2.isEnabled = false
imgDot4.isEnabled = false
// Tried each of these in turn
ImageViewCompat.setImageTintList(imgDot3, ColorStateList.valueOf(resources.getColor(R.color.color_green_stateful)))
ImageViewCompat.setImageTintList(imgDot4, ColorStateList.valueOf(resources.getColor(R.color.color_green_stateful)))
imgDot3.setColorFilter(ContextCompat.getColor(this, R.color.color_green_stateful))
imgDot4.setColorFilter(ContextCompat.getColor(this, R.color.color_green_stateful))
imgDot3.imageTintList = ColorStateList.valueOf(resources.getColor(R.color.color_green_stateful))
imgDot4.imageTintList = ColorStateList.valueOf(resources.getColor(R.color.color_green_stateful))
imgDot3.imageTintList = ColorStateList.valueOf(ContextCompat.getColor(this, R.color.color_green_stateful))
imgDot4.imageTintList = ColorStateList.valueOf(ContextCompat.getColor(this, R.color.color_green_stateful))
color_red_stateful.xml
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_enabled="false" android:color="#999"/>
<item android:color="#F00"/>
</selector>
color_green_stateful.xml
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_enabled="false" android:color="#999"/>
<item android:color="#0F0"/>
</selector>
ic_dot.xml
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24.0"
android:viewportHeight="24.0">
<path
android:fillColor="#000"
android:pathData="M12,12m-10,0a10,10 0,1 1,20 0a10,10 0,1 1,-20 0"/>
</vector>
您在每个尝试过的行中都使用了 getColor
方法,但这是不正确的,那不是颜色,那是 selector
(color_red_stateful
和 color_green_stateful
文件) .使用 Resources
或最好使用 ContextCompat
class 及其有用的方法 getColorStateList
ColorStateList colorStateList = ContextCompat.getColorStateList(this, R.color.your_color_selector);
此 colorStateList
应设置为 imageTintList
以获得所需的 ImageView
s
顺便说一句。在上面设置后,你可以使用 view.invalidate()
方法强制立即应用更改(强制重绘),但在大多数情况下,也可能是你的,这将不需要
I am trying to update the tint of an ImageView programmatically, and the colour I'm using is a selector that has different colours for when the view is enabled or disabled
选项 1:
据我所知,您已经为 XML 文件中的每个视图设置了 android:tint
。
因此,要以编程方式启用禁用,您需要在启用或禁用后更新视图。
首先将 isEnabled 设置为 true 或 false:
imgDot2.isEnabled = false
imgDot4.isEnabled = false
无效视图:
imgDot2.invalidate()
imgDot4.invalidate()
然后它将根据您的输入更新视图。
无需在Activity中再次设置setImageTintList
或setColorFilter
。
选项2:
然后想以编程方式设置颜色
ImageViewCompat.setImageTintList(imgDot2, ContextCompat.getColorStateList(this, R.color.color_green_stateful))
ImageViewCompat.setImageTintList(imgDot4, ContextCompat.getColorStateList(this, R.color.color_green_stateful))
无效视图:
imgDot2.invalidate()
imgDot4.invalidate()
注意:您必须在 XML 中使用 app:tint
而不是 android:tint
。