it-swarm.com.de

Android: Formfarbe zur Laufzeit ändern

Ich habe ein Zeichenprogramm, das ich als Hintergrund für ein LinearLayout verwende. Ich möchte die Farbe dieser Form zur Laufzeit ändern. Ich habe verschiedene Methoden ausprobiert, aber keine funktioniert.

Ich habe den hier beschriebenen Ansatz befolgt: http://www.anddev.org/Android-2d-3d-graphics-opengl-problems-f55/change-shape-drawable-solid-color-t16798.html

Aber habe das gleiche Problem ... es stürzt nicht ab ... aber die Farbe ändert sich nicht!

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

Code-Schnipsel:

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

Irgendeine Ahnung? Ich habe den ganzen Tag gegoogelt ... und es wird ziemlich nervig ...

UPDATE:

Wenn ich versuche, dasselbe mit dieser Form zu machen:

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

Die Farbe wird schwarz ... was ich denke, es kann geändert werden ...

50
neteinstein

Ich erstelle jetzt ein Drawable wie den einen Pre-Compiler, da ich die Farbe nicht in etwas anderes als Schwarz ändern konnte, selbst nachdem ich das unten beschriebene hex OR) ausprobiert habe.

Der neue Code:

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

Wie auch immer, dies ist ein Fix. Eine Lösung für die erste Frage ist das, wonach ich wirklich suche! Ich würde mich natürlich über jede Hilfe freuen!

41
neteinstein

Sehen Sie, ob etwas Ähnliches für Sie funktioniert:

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

In meinem Fall habe ich eine Textansicht, die ein ShapeDrawable als Hintergrund hat. Ich wollte seine Farbe ändern und habe es geschafft, diese Arbeit zu machen. Unerklärlicherweise gibt tv2.getBackground () ein GradientDrawable anstelle eines ShapeDrawable zurück - dies wurde auch an anderer Stelle berichtet.

Edit: Versuchen Sie, für die Farbe einen Alpha-Wert von 0xff festzulegen. Wenn Sie bemerken, nimmt die Funktion setColor () auch in meinem obigen Code einen zusätzlichen Hex-Wert neben dem regulären RGB-Hex-Wert an. Dies ist für Alpha/Opazität. Wenn dies auf 0x00 gesetzt ist, hat das Drawable unabhängig vom RGB eine schwarze Farbe (vorausgesetzt, Ihre Hintergrundfarbe ist schwarz). 0x00 ist ein vollständig transparentes Objekt und 0xff ist ein vollständig undurchsichtiges Objekt.

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

Die setColor-Methode fordert das erneute Zeichnen des Elements korrekt an. (Wenn Sie in XML das <shape> -Element verwendet haben, wird es immer zu einem GradientDrawable-Element.)

29
James

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>

Ändern Sie die Farbe im Code

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

Es gibt einen einfacheren Weg:

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

Das mache ich in einem Live Wallpaper, in dem ich ein Drawable zur Laufzeit ändere:

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

Bearbeiten: Typdeklarationen:

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

Bearbeiten 2:

Versuchen Sie dies in diesem Fall:

int color = (0xFF000000 | yourParsedColor)

Stellen Sie dann diese Farbe ein.

1
Kaj