当前位置: 首页 > 知识库问答 >
问题:

更改ImageButton的形状颜色

苏鸿志
2023-03-14

我有一个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;
}

共有1个答案

万承志
2023-03-14

您的问题是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”: