我有一个RecycerView,在那里我创建了12个ImageButton默认情况下,它们都是黑色的,因为我为imageButton创建了一个具有黑色纯色的自定义形状。自定义形状设置为imageButtons背景
形状:
<?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现在的样子。但它们都有相同的颜色,这不是我想要的。
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;
}
<?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>
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);
}
}
这是来自我的RecycerView适配器类,我在其中infalte 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。两者都扩展为可提取的,但不能将其中一个转换为另一个。试试这个:
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的内容。
@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));
}
}
我被这个问题卡住了: 当我点击一个形状(有一个矩形和圆形列表)时,它会改变它的颜色。但当我点击外面时,它不会变回来。 更具体地说,当我只画1个形状时,它工作!但是,例如,我绘制一个蓝色矩形、一个紫色圆和一个红色矩形,并单击其中一些形状,如红色矩形,每个形状都将其颜色改为蓝色。当我再次单击外部时,它会将每个形状的颜色更改为默认颜色(黑色)。
问题来了:我的应用程序中有几个面板,形状与背景相同,但对于每个形状,我想要不同的边框(笔画)颜色。我不想创建3个形状,唯一的区别是在笔画颜色上。是否可以在运行时更改笔划值?
问题内容: 我是Java的新手,但需要知道开发人员是否有可能,以便 他/她可以更改的形状JProgressBar。我的意思是假设 我想更改形状,使其看起来像圆形或 其他形状? 尽管我只是希望将其从条形更改为弧形,或者 可以说我想将条形更改为任何其他形状。我的进度条 可能看起来像条形以外的曲线。我想在其中添加一条曲线。 问题答案: a的外观JProgressBar由组件的UI委托控制,该委托通常从派
问题内容: 我正在尝试将状态栏的颜色更改为蓝色或其他某种颜色。 这可能吗,或者Apple不允许吗? 问题答案: 注意:此解决方案在iOS 13及更高版本下失败。 Plist中的第一个设置为 输出屏幕截图如下
我想通过以下方式更改JButton的颜色: 为了进行更改,我必须补充: 但是,这会删除边缘周围的曲线,从而更改按钮的形状。有没有一种方法可以简单地改变颜色并保留其他属性?另一个例子是当你按下一个按钮而没有改变它的颜色时,颜色的改变(变暗)。 下面是一些代码,说明了这两个按钮之间的区别: 谢谢
我正在使用gnuplot绘制条形图。 问题是:我希望每个酒吧都有不同的颜色。例如:红色的MSA-GA ACO和蓝色的MSA-GA PACO。 我该怎么做呢? 以下是我使用过的命令: “data.dat”: