Android: изменение цвета формы во время выполнения

У меня есть drawable, который я использую в качестве фона для LinearLayout. Я хотел бы изменить цвет этой фигуры во время выполнения. Я пробовал использовать несколько методов .. но никто не работает.

Я придерживался описанного здесь подхода: http://www.anddev.org/android-2d-3d-graphics-opengl-problems-f55/change-shape-drawable-solid-color-t16798.html

Но имеют такую ​​же проблему … это не сбой .. но цвет не меняется!

<?xml version="1.0" encoding="UTF-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android"> <solid android:color="#00A6C1" /> <corners android:radius="@dimen/square_corners" /> </shape> 

Фрагмент кода:

 GradientDrawable drawable = (GradientDrawable) activity.getResources().getDrawable(R.drawable.blue_square_shape); int color = ((Application) getApplication()).getColor(); drawable.setColor(color); block.findViewById(R.id.blockSquare).setBackgroundDrawable(drawable); findViewById(R.id.blockSquare).postInvalidate(); 

Любая подсказка? Я прошел весь день по поиску в Интернете … и это становится очень раздражающим …

ОБНОВИТЬ:

Когда я пытаюсь сделать то же самое с этой формой:

 <shape xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/shape" android:shape="rectangle"> <gradient android:startColor="#1FBCCF" android:endColor="#06A4C1" android:angle="270" /> <corners android:topLeftRadius="@dimen/footer_corners" android:topRightRadius="@dimen/footer_corners" /> </shape> 

Цвет становится черным … что я думаю, он может быть изменен …

Solutions Collecting From Web of "Android: изменение цвета формы во время выполнения"

Теперь я создаю Drawable, как и один предварительный компилятор, так как я не мог изменить цвет ни на чем, кроме черного, даже после того, как попробовал hex или описал ниже.

Новый код:

 ShapeDrawable footerBackground = new ShapeDrawable(); // The corners are ordered top-left, top-right, bottom-right, // bottom-left. For each corner, the array contains 2 values, [X_radius, // Y_radius] float[] radii = new float[8]; radii[0] = activity.getResources().getDimension(R.dimen.footer_corners); radii[1] = activity.getResources().getDimension(R.dimen.footer_corners); radii[2] = activity.getResources().getDimension(R.dimen.footer_corners); radii[3] = activity.getResources().getDimension(R.dimen.footer_corners); footerBackground.setShape(new RoundRectShape(radii, null, null)); int color = ((Application) activity.getApplication()).getColor(); footerBackground.getPaint().setColor(color); views.setBackgroundDrawable(footerBackground); 

В любом случае это исправление .. решение для первого вопроса – это то, что я действительно ищу! Я буду признателен за любую помощь, конечно!

Посмотрите, работает ли что-то похожее на это:

 TextView tv2 = (TextView) rl.findViewById(R.id.toggle_indicator); /* Refer to http://developer.android.com/reference/android/graphics/drawable/GradientDrawable.html#mutate() to understand why we need to mutate the GradientDrawable*/ GradientDrawable sd = (GradientDrawable) tv2.getBackground().mutate(); sd.setColor(0xff999999); sd.invalidateSelf(); 

В моем случае у меня есть TextView, который имеет ShapeDrawable в качестве фона. Я хотел изменить его цвет и сумел сделать эту работу. Необъяснимо, tv2.getBackground () возвращает GradientDrawable вместо ShapeDrawable – об этом сообщается и в другом месте.

Изменить: о цвете, попробуйте установить альфа-значение 0xff. Если вы заметили, что даже в моем коде выше функция setColor () принимает дополнительное шестнадцатеричное значение, кроме обычного шестнадцатеричного значения RGB. Это для Alpha / Opacity. Если для этого параметра установлено значение 0x00, то Drawable будет иметь черный цвет, независимо от RGB (при условии, что ваш фоновый цвет черный). 0x00 – полностью прозрачный объект, а 0xff – полностью непрозрачный объект.

 GradientDrawable background = (GradientDrawable) titleTextView.getBackground(); background.setColor(getResources().getColor(R.color.some_color)); 

Метод setColor корректно запрашивает перерисовку элемента (если в xml вы использовали элемент <shape>, он всегда будет GradientDrawable)

Существует более простой способ:

 ShapeDrawable drawable = new ShapeDrawable(); drawable.getPaint().setColor(getResources().getColor(R.color.blue)); getActionBar().setBackgroundDrawable(drawable); 

Это то, что я делаю на живых обоях, где я изменяю Drawable во время выполнения:

 this.original = DrawableFactory.getDrawable(getContext().getResources(), objectName)[0]; originalBitmap = original.getBitmap(); copy = new BitmapDrawable(getContext().getResources(), original.getBitmap().copy(Bitmap.Config.ARGB_8888, true)); copyCanvas = new Canvas(copy.getBitmap()); 

Изменить: Введите объявления:

 public Bitmap originalBitmap; public BitmapDrawable original; public BitmapDrawable copy; public Canvas copyCanvas; 

Изменить 2:

Попробуйте это в этом случае:

 int color = (0xFF000000 | yourParsedColor) 

Затем установите этот цвет.

(R.drawable.library_cirecle)

 <?xml version="1.0" encoding="utf-8"?> <layer-list xmlns:android="http://schemas.android.com/apk/res/android" > <item android:id="@+id/outerRectangle"> <shape android:shape="oval" > <solid android:color="#FCD366" /> <stroke android:width="1dp" android:color="@android:color/darker_gray" /> </shape> </item> 1 <?xml version="1.0" encoding="utf-8"?> <layer-list xmlns:android="http://schemas.android.com/apk/res/android" > <item android:id="@+id/outerRectangle"> <shape android:shape="oval" > <solid android:color="#FCD366" /> <stroke android:width="1dp" android:color="@android:color/darker_gray" /> </shape> </item> 

Изменить цвет в коде

 Drawable tempDrawable = getResources().getDrawable(R.drawable.library_cirecle); LayerDrawable bubble = (LayerDrawable) tempDrawable; (cast to root element in xml) GradientDrawable solidColor = (GradientDrawable) bubble.findDrawableByLayerId(R.id.outerRectangle); solidColor.setColor(colorToPaint); imageView.setImageDrawable(tempDrawable); 

Мое текущее исправление связано с возможностью рисования без опции цвета. Я помещаю его в макет рамки, а затем динамически устанавливаю цвет фона объекта макета рамки. Это по-прежнему технически «исправление», но это самый простой вариант, на мой взгляд.

Файл макета:

 <FrameLayout android:id="@+id/dateLayout" android:layout_width="wrap_content" android:layout_height="wrap_content" android:background="@color/SecondaryGreen"> <ImageView android:id="@+id/dateBox" android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/date_rectangle" /> </FrameLayout> 

Дата Прямоугольный чертежный файл:

 <shape xmlns:android="http://schemas.android.com/apk/res/android" ><size android:width="50dp" android:height="50dp"/><corners android:radius="5dp"/></shape> 

Динамическое рендеринг:

 mHolder.dateLayout.setBackgroundColor(getResources().getColor(R.color.SecondaryGreen)); 

Установите цвет GradientDrawable Shape с использованием шестнадцатеричного кода / значения
Просто префикс 0x – шестнадцатеричное значение цвета.

  GradientDrawable shape = new GradientDrawable(); shape.setCornerRadius( 16 ); shape.setColor(0xff33b5e5); ButtonStartSurvey.setBackground(shape);