Подтвердить что ты не робот

Установить цвет формы андроида

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

Скажем, у меня есть следующая форма 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>

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

4b9b3361

Ответ 1

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

Выбираемый - овал и является фоном 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, имеют одно и то же состояние.)

Ответ 2

Сделайте следующее:

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

Ответ 3

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

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

EDIT:

Я обновил ответ, чтобы использовать PorterDuff.Mode.SRC_ATOP. Вот официальная документация с более подробной информацией о различных вариантах PorterDuff.Mode, которые у вас есть.

Ответ 4

Попробуйте следующее:

 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);
 }

Подробнее см. ссылку

надежная помощь.

Ответ 5

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

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);

Ответ 6

Развернувшись на ответ Викрама, если вы раскрашиваете динамические представления, такие как элементы просмотра ресайклеров и т.д. Затем вы, вероятно, захотите позвонить 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");
    }

}

Ответ 7

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

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

Ответ 8

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

//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)

Ответ 9

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

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

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

Ответ 10

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

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

Ответ 11

Моя версия функции расширения 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")
    }
}