Установить цвет формы 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>
Установите форму в качестве фона для вида
Установите желаемый цвет следующим образом:
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);