更改ImageButton的形状颜色 [英] Change the shape color of a ImageButton
问题描述
我有一个recyclerView,在其中创建了12个ImageButton. 默认情况下,它们都是黑色的,因为我为imageButton制作了具有黑色纯色的自定义形状.自定义形状设置为imageButtons背景
I have a recyclerView where I create 12 ImageButtons. As default they are all black colored, because I made a custom shape for the imageButton that have a black solid color. The custom shape is set as the imageButtons background
形状:
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle">
<corners
android:radius="5.3dp"/>
<solid
android:color="#000000"/>
</shape>
这是ImageButtons现在的样子.但是它们都具有相同的颜色,这不是我想要的.
This is how the ImageButtons look like now. But they all have the same color, which is not what I want.
我想动态地为每个ImageButton提供与color.xml中的颜色数组不同的颜色.我已经尝试了许多有关如何更改形状的纯色的解决方案,但是没有一个起作用.
I want dynamically to give each ImageButton a different color from my color-array in my color.xml. I have tried many of the solution of how to change the solid color of a shapes but none of them have worked.
为recyclerView创建12个imageButton的方法:
public static List<ColorButton> initColorButtons(){
colorButtonList = new ArrayList<>();
//here we retrive all colors from color.xml
Resources resources = App.getAppContext().getResources();
String colors[] = resources.getStringArray(R.array.backgroundcolors);
for(int i=0; i<colors.length; i++){
//Creates 12 ImageButtons with a custom shape
colorButtonList.add(new ColorButton(new ImageButton(App.getAppContext()), colors[i]));
//Here each imagebutton should get its own color.
Drawable drawable = colorButtonList.get(i).getButton().getBackground();
if (colorButtonList.get(i).getButton().getBackground() instanceof GradientDrawable) {
GradientDrawable gd = (GradientDrawable) drawable.getCurrent();
gd.setColor(Color.parseColor(colors[i]));
}
}
return colorButtonList;
}
为recyclerView创建的图像按钮. @ drawable/bbtn形状backgrundcolor默认设置为黑色
The Imagebutton that is created for the recyclerView. The @drawable/bbtn shapes backgrundcolor is set to black as default
<?xml version="1.0" encoding="utf-8"?>
<ImageButton xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/colorbutton"
android:layout_width="48dp"
android:layout_height="48dp"
android:layout_marginLeft="15dp"
android:layout_marginRight="7dp"
android:layout_marginTop="25dp"
android:layout_marginBottom="25dp"
android:background="@drawable/bbtn">
</ImageButton>
以下是颜色阵列.每个按钮的背景颜色应与列表之一不同:
<string-array name="backgroundcolors">
<item>#000000</item>
<item>#ffffff</item>
<item>#373737</item>
<item>#e6e6e6</item>
<item>#EAE1D8</item>
<item>#fd79a1</item>
<item>#E849A1</item>
<item>#ff0f68</item>
<item>#c22032</item>
<item>#F7E84E</item>
<item>#0d4b7e</item>
<item>#329de7</item>
<item>#68be3f</item>
<item>#006c35</item>
<item>#395a4f</item>
</string-array>
这是我创建ImageButtons的类
public class ColorButton{
private ImageButton button;
private String color;
public static List<ColorButton> colorButtonList;
public ColorButton(ImageButton button, String color) {
this.button = button;
this.color = color;
}
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
public ImageButton getButton() {
return button;
}
@SuppressLint("NewApi")
public static List<ColorButton> initColorButtons(){
colorButtonList = new ArrayList<>();
//here we retrive all colors from color.xml
Resources resources = App.getAppContext().getResources();
String colors[] = resources.getStringArray(R.array.backgroundcolors);
for(int i=0; i<colors.length; i++){
//Creates 12 ImageButtons with a custom shape
colorButtonList.add(new ColorButton(new ImageButton(App.getAppContext()), colors[i]));
//Here each imagebutton should get its own color.
Drawable drawable = colorButtonList.get(i).getButton().getBackground();
if (drawable instanceof GradientDrawable) {
GradientDrawable gd = (GradientDrawable) drawable.getCurrent();
gd.setColor(Color.parseColor(colors[i]));
} else if (drawable instanceof RippleDrawable) {
RippleDrawable rd = (RippleDrawable) drawable;
// keep in mind that colors[i] should be a string with the hex representation of a color, like: #F4F4F4
int color = Color.parseColor(colors[i]);
rd.setColor(newColorStateList(color));
}
}
return colorButtonList;
}
private static ColorStateList newColorStateList(int color) {
int[][] states = new int[][] {
new int[] { android.R.attr.state_enabled}, // enabled
new int[] {-android.R.attr.state_enabled}, // disabled
};
int[] colors = new int[] {
color, color
};
return new ColorStateList(states, colors);
}
}
这来自我的recyclerView Adapter类,在其中安装了layout.item_colorbutton. <-这是这篇文章的顶部
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
Context context = parent.getContext();
LayoutInflater inflater = LayoutInflater.from(context);
//inflates the custom layout for a button
View colorButtonView = inflater.inflate(R.layout.item_colorbutton, parent, false);
//Return a new holder instance of a colorButton
ViewHolder viewHolder = new ViewHolder(colorButtonView);
return viewHolder;
}
推荐答案
您的问题是,在您的情况下,getBackground()
返回的是RippleDrawable,而不是GradientDrawable.两者都扩展了Drawable,但是您不能将一个投向另一个.
试试这个:
Your problem is that in your case getBackground()
is returning a RippleDrawable, not a GradientDrawable. Both extend Drawable, but you can not cast one to the other.
Try this:
public List<ImageButton> initColorButtons(){
colorButtonList = new ArrayList<>();
//here we retrive all colors from color.xml
Resources resources = App.getAppContext().getResources();
String colors[] = resources.getStringArray(R.array.backgroundcolors);
for(int i=0; i<colors.length; i++){
//Creates 12 ImageButtons with a custom shape
colorButtonList.add(new ColorButton(new ImageButton(App.getAppContext()), colors[i]));
//Here each imagebutton should get its own color.
Drawable drawable = colorButtonList.get(i).getBackground();
if (drawable instanceof GradientDrawable) {
GradientDrawable gd = (GradientDrawable) drawable.getCurrent();
gd.setColor(Color.parseColor(colors[i]));
} else if (drawable instanceof RippleDrawable) {
RippleDrawable rd = (RippleDrawable) drawable;
// keep in mind that colors[i] should be a string with the hex representation of a color, like: #F4F4F4
int color = Color.parseColor(colors[i]);
rd.setColor(newColorStateList(color));
}
}
return colorButtonList;
}
private ColorStateList newColorStateList(int color) {
int[][] states = new int[][] {
new int[] { android.R.attr.state_enabled}, // enabled
new int[] {-android.R.attr.state_enabled}, // disabled
};
int[] colors = new int[] {
color, color
};
return new ColorStateList(states, colors);
}
结果:
您可以在此SO问题中了解有关如何创建ColorStateList的更多信息.
You can read more on how to create a ColorStateList in this SO question.
编辑:为了正确修改使用方法onCreateViewHolder
创建的按钮,您需要在适配器中实现onBindViewHolder
并在那里更改按钮的颜色.
In order to correctly modify the buttons you create with the method onCreateViewHolder
, you need to implement onBindViewHolder
in your Adapter and change the color of your buttons there.
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
Drawable drawable = holder.getBackground();
if (drawable instanceof GradientDrawable) {
GradientDrawable gd = (GradientDrawable) drawable.getCurrent();
gd.setColor(Color.parseColor(colors[position]));
} else if (drawable instanceof RippleDrawable) {
RippleDrawable rd = (RippleDrawable) drawable;
int color = Color.parseColor(colors[position]);
rd.setColor(newColorStateList(color));
}
}
这篇关于更改ImageButton的形状颜色的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!