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

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

UPDATE:

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

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

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

Ответ 1

Теперь я создаю 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);

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

Ответ 2

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

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 - полностью непрозрачный объект.

Ответ 3

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

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

Ответ 4

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

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

Ответ 5

Это то, что я делаю на живых обоях, где я изменяю 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)

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

Ответ 6

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>

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

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

Ответ 7

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

Файл макета:

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

Ответ 8

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

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