Установить цвет формы Android программно

Я редактирую, чтобы упростить вопрос, надеясь, что это поможет найти точный ответ.

Скажи, у меня есть следующее oval форма:

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="oval">
    <solid android:angle="270"
           android:color="#FFFF0000"/>
    <stroke android:width="3dp"
            android:color="#FFAA0055"/>
</shape>

Как установить цвет программно, из класса занятий?

19 ответов

Примечание: ответ был обновлен, чтобы охватить сценарий, в котором backgroundэто пример ColorDrawable, Спасибо Tyler Pfaff за то, что указал на это.

Drawable является овалом и является фоном ImageView

Получить Drawable от imageView с помощью getBackground():

Drawable background = imageView.getBackground();

Сверьтесь с обычными подозреваемыми:

if (background instanceof ShapeDrawable) {
    // cast to 'ShapeDrawable'
    ShapeDrawable shapeDrawable = (ShapeDrawable) background;
    shapeDrawable.getPaint().setColor(ContextCompat.getColor(mContext,R.color.colorToSet));
} else if (background instanceof GradientDrawable) {
    // cast to 'GradientDrawable'
    GradientDrawable gradientDrawable = (GradientDrawable) background;
    gradientDrawable.setColor(ContextCompat.getColor(mContext,R.color.colorToSet));
} else if (background instanceof ColorDrawable) {
    // alpha value may need to be set again after this call
    ColorDrawable colorDrawable = (ColorDrawable) background;
    colorDrawable.setColor(ContextCompat.getColor(mContext,R.color.colorToSet));
}

Компактная версия:

Drawable background = imageView.getBackground();
if (background instanceof ShapeDrawable) {
    ((ShapeDrawable)background).getPaint().setColor(ContextCompat.getColor(mContext,R.color.colorToSet));
} else if (background instanceof GradientDrawable) {
    ((GradientDrawable)background).setColor(ContextCompat.getColor(mContext,R.color.colorToSet));
} else if (background instanceof ColorDrawable) {
    ((ColorDrawable)background).setColor(ContextCompat.getColor(mContext,R.color.colorToSet));
}

Обратите внимание, что нулевая проверка не требуется.

Тем не менее, вы должны использовать mutate() на чертежах, прежде чем изменять их, если они используются в другом месте. (По умолчанию загружаемые из XML файлы рисования имеют одинаковое состояние.)

В настоящее время более простым решением было бы использовать вашу форму в качестве фона, а затем программно изменить ее цвет с помощью

view.getBackground().setColorFilter(Color.parseColor("#343434"), PorterDuff.Mode.SRC_OVER)

Делай так:

    ImageView imgIcon = findViewById(R.id.imgIcon);
    GradientDrawable backgroundGradient = (GradientDrawable)imgIcon.getBackground();
    backgroundGradient.setColor(getResources().getColor(R.color.yellow));

На этот вопрос был дан ответ некоторое время назад, но его можно модернизировать, переписав его как функцию расширения kotlin.

fun Drawable.overrideColor(@ColorInt colorInt: Int) {
    when (this) {
        is GradientDrawable -> setColor(colorInt)
        is ShapeDrawable -> paint.color = colorInt
        is ColorDrawable -> color = colorInt
    }
}

Попробуй это:

 public void setGradientColors(int bottomColor, int topColor) {
 GradientDrawable gradient = new GradientDrawable(Orientation.BOTTOM_TOP, new int[]  
 {bottomColor, topColor});
 gradient.setShape(GradientDrawable.RECTANGLE);
 gradient.setCornerRadius(10.f);
 this.setBackgroundDrawable(gradient);
 }

для более подробной информации проверьте эту ссылку

надеюсь помочь.

Надеюсь, что это поможет кому-то с той же проблемой

GradientDrawable gd = (GradientDrawable) YourImageView.getBackground();
//To shange the solid color
gd.setColor(yourColor)

//To change the stroke color
int width_px = (int)TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, youStrokeWidth, getResources().getDisplayMetrics());
gd.setStroke(width_px, yourColor);

Расширяя ответ Vikram, если вы раскрашиваете динамические представления, такие как элементы представления переработчика и т. Д.... Тогда вы, вероятно, захотите вызвать mutate() перед тем, как установить цвет. Если вы этого не сделаете, любые виды, которые имеют общий объект рисования (например, фон), также будут иметь свои измененные / цветные рисунки.

public static void setBackgroundColorAndRetainShape(final int color, final Drawable background) {

    if (background instanceof ShapeDrawable) {
        ((ShapeDrawable) background.mutate()).getPaint().setColor(color);
    } else if (background instanceof GradientDrawable) {
        ((GradientDrawable) background.mutate()).setColor(color);
    } else if (background instanceof ColorDrawable) {
        ((ColorDrawable) background.mutate()).setColor(color);
    }else{
        Log.w(TAG,"Not a valid background type");
    }

}

Это решение, которое работает для меня... написал это и в другом вопросе: как динамически менять цвет фигуры?

//get the image button by id
ImageButton myImg = (ImageButton) findViewById(R.id.some_id);

//get drawable from image button
GradientDrawable drawable = (GradientDrawable) myImg.getDrawable();

//set color as integer
//can use Color.parseColor(color) if color is a string
drawable.setColor(color)

Ничто не работает для меня, но когда я устанавливаю оттенок, он работает на Shape Drawable

 Drawable background = imageView.getBackground();
 background.setTint(getRandomColor())

требуется Android 5.0 API 21

Моя версия функции расширения Kotlin на основе ответов выше с Compat:

fun Drawable.overrideColor_Ext(context: Context, colorInt: Int) {
    val muted = this.mutate()
    when (muted) {
        is GradientDrawable -> muted.setColor(ContextCompat.getColor(context, colorInt))
        is ShapeDrawable -> muted.paint.setColor(ContextCompat.getColor(context, colorInt))
        is ColorDrawable -> muted.setColor(ContextCompat.getColor(context, colorInt))
        else -> Log.d("Tag", "Not a valid background type")
    }
}

Простой способ заполнить форму радиусом:

(view.getBackground()).setColorFilter(Color.parseColor("#FFDE03"), PorterDuff.Mode.SRC_IN);

Мне нужно было сделать это в моем адаптере, но приведенные выше решения либо не работали, либо требовали> = Android версии 10. Код ниже работал для меня!

      val drawable = DrawableCompat.wrap(holder.courseName.background)
DrawableCompat.setTint(drawable, Color.parseColor("#4a1f60"))

Возможно, я опоздала, но если вы используете Kotlin. Есть такой способ

var gd = layoutMain.background as GradientDrawable

 //gd.setCornerRadius(10)
  gd.setColor(ContextCompat.getColor(ctx , R.color.lightblue))
  gd.setStroke(1, ContextCompat.getColor(ctx , R.color.colorPrimary)) // (Strokewidth,colorId)

Наслаждаться....

Для тех, кто использует C# Xamarin, вот метод, основанный на фрагменте кода Викрама:

private void SetDrawableColor(Drawable drawable, Android.Graphics.Color color)
{
    switch (drawable)
    {
        case ShapeDrawable sd:
            sd.Paint.Color = color;
            break;
        case GradientDrawable gd:
            gd.SetColor(color);
            break;
        case ColorDrawable cd:
            cd.Color = color;
            break;
    }
}

Это может помочь

1. Изначально установите прозрачный цвет формы.

      <?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="oval">
   <solid android:angle="270"
       android:color="@android:color/transparent"/>
   <stroke android:width="3dp"
        android:color="#FFAA0055"/>
</shape>
  1. Установите форму в качестве фона для вида

  2. Установите желаемый цвет следующим образом:

            Drawable bg = view.getBackground();
    bg.setColorFilter(Color.parseColor("#Color"), PorterDuff.Mode.ADD);
    

Мы можем создать эту функцию kotlin.

      fun View.updateViewBGSolidColor(colorString: String) {
    when (val background: Drawable = this.background) {
        is ShapeDrawable -> {
            background.paint.color = Color.parseColor(colorString)
        }
        is GradientDrawable -> {
            background.setColor(Color.parseColor(colorString))
        }
        is ColorDrawable -> {
            background.color = Color.parseColor(colorString)
        }
    }
}

И используйте его, как показано ниже:

      yourTextView.updateViewBGSolidColor("#FFFFFF")

Лучший способ изменить сплошной цвет настраиваемого рисования - для Kotlin.

       (findViewById<TextView>(R.id.testing1).getBackground()).setColorFilter(Color.parseColor("#FFDE03"), PorterDuff.Mode.SRC_IN); 

На 2023 год с compileSdkVersion 33 ответ, получивший наибольшее количество голосов на данный момент, каким-то образом сработал. Моя форма - это простая закругленная рамка для сложного вида.

      <?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle" >
    <stroke
        android:width="2dp"
        android:color="@color/white"/>
    <corners
        android:bottomRightRadius="10dp"
        android:topLeftRadius="10dp"
        android:topRightRadius="10dp"
        android:bottomLeftRadius="10dp"/>
</shape>

Форма установлена ​​какbackgroundв представлении с именемVScroll. Мне нужно, чтобы цвет формы совпадал с тематическим представлением, поэтому я адаптировал принятый ответ и установил цвет вFragment:

      val lineBackground = binding.vScroll.background as GradientDrawable
lineBackground.setStroke(5,Color.parseColor(line.color))

Гдеline.colorпредставляет собой шестнадцатеричное строковое значение, например#FFFFFF. Значение int дляstroke widthзадается в пикселях, поэтому его необходимо преобразовать вdpдля правильного размера.

      GradientDrawable gd = new GradientDrawable(
        GradientDrawable.Orientation.TOP_BOTTOM,
        new int[] {0xFF616261,0xFF131313});
gd.setCornerRadius(0f);

layout.setBackgroundDrawable(gd);
Другие вопросы по тегам