Установить цвет формы андроида
Я редактирую, чтобы упростить вопрос, надеясь, что это поможет в точном ответе.
Скажем, у меня есть следующая форма 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>
Как установить цвет программным путем из класса активности?
Ответы
Ответ 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")
}
}