Java 动态更改可绘制颜色
在我的应用程序中,我有很多用xml文件定义的可绘图项。例如,我有一个按钮定义如下:Java 动态更改可绘制颜色,java,c#,android,xamarin.android,android-drawable,Java,C#,Android,Xamarin.android,Android Drawable,在我的应用程序中,我有很多用xml文件定义的可绘图项。例如,我有一个按钮定义如下: button.xml <?xml version="1.0" encoding="utf-8"?> <layer-list xmlns:android="http://schemas.android.com/apk/res/android"> <!-- Bottom 3dp Shadow --> <item android:top="3dp"> <sh
button.xml
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<!-- Bottom 3dp Shadow -->
<item android:top="3dp">
<shape android:shape="rectangle">
<corners android:radius="3dp" />
<solid android:color="@color/black_30" />
</shape>
</item>
<!-- green top color -->
<item android:top="3dp" android:bottom="3dp" android:id="@+id/background">
<shape android:shape="rectangle">
<corners android:radius="3dp" />
<solid android:color="@color/green1" />
</shape>
</item>
</layer-list>
好事情是它的工作。。。但是随机的。。。有时,当我再次显示按钮时,显示的仍然是原来的绿色。有时候,它是新的颜色。。。一旦我有了这两种行为中的一种,同一种颜色可以保持很多次,然后突然又变成了正确的颜色
有人能解释吗?drawables上是否有缓存会导致这种问题
3) 我在考虑第三种解决方案:动态更改colors.xml
中定义的颜色(其中定义了green1
),但这似乎不可能事实上,对于2)一个非常简单的解决方案是:
不要尝试自定义来自xml文件的可绘制文件:
LayerDrawable button = (LayerDrawable)Resources.GetDrawable(Resource.Drawable.normal_question_button);
GradientDrawable background = (GradientDrawable)button.FindDrawableByLayerId(Resource.Id.background);
background.SetColor(Android.Graphics.Color.Red.ToArgb());
我们可以在获得每个按钮的实例后直接更改其颜色:
LayerDrawable buttonDrawable = _button.Background;
GradientDrawable background = (GradientDrawable)buttonDrawable.FindDrawableByLayerId(Resource.Id.background);
background.SetColor(Android.Graphics.Color.Red.ToArgb());
您好,在我的导航抽屉图标(可绘制的内部图像视图)中,我使用setColorFilter方法。例如,如果我有一个100%不透明度的黑色图标,使用这种方法我可以得到一个100%不透明度的带有某种颜色的图标。将它与setImageAlpha或setAlpha相结合,我可以得到所有不透明度中所有颜色的所有图标。如果这对您有效,请告诉我添加一个答案。您是否尝试在外层Drawable上调用invalidateSelf()。@pskink:我尝试在两个Drawable上调用invalidateSelf(),但没有changes@Dahnark:如果我使用setColorFilter而不是setColor,我的按钮将不再有颜色<代码>background.SetColorFilter(新的PorterDuffColorFilter(Android.Graphics.Color.Red,PorterDuff.Mode.Multiply))代码>否否,setColorFilter在第一种颜色上工作。我的图标是黑色的(它们是.png),然后setColorFilter将此平面黑色更改为其他平面颜色。
LayerDrawable button = (LayerDrawable)Resources.GetDrawable(Resource.Drawable.normal_question_button);
GradientDrawable background = (GradientDrawable)button.FindDrawableByLayerId(Resource.Id.background);
background.SetColor(Android.Graphics.Color.Red.ToArgb());
LayerDrawable buttonDrawable = _button.Background;
GradientDrawable background = (GradientDrawable)buttonDrawable.FindDrawableByLayerId(Resource.Id.background);
background.SetColor(Android.Graphics.Color.Red.ToArgb());