plusone

14. April 2011

modify drawable state

Nabend,

heute beschreibe ich euch, wie ihr einem View Statusabhängiges Background setzten könnt.
Hier sei gesagt, soweit ihr die GUI-Elemente in die XMLs /res/layout o.ä. auslagern könnt, dann tut es!
Drawable-StateList


So und nun, wie es zur Laufzeit geht:
  • zurerst brauchen wie eine Instanz von StateListDrawable
  • dann die brauchbaren States als int[]
  • und passende Drawable-Icons
  • die werden zusammen unserer StateListDrawable-Instanz mit .add(int[], Drawable) hinzugefügt
  • zum Ende wird diese Instanz als Background dem View, das wir verändern wollen, gesetzt
Im Code sieht es dann so aus:
//Das zu ändernde View
View view = new View(getBaseContext());

//Instanz des StateListDrawable
StateListDrawable stateListDrawable = new StateListDrawable();

//State und Drawable werden geaddet
stateListDrawable.addState(new int[] { 2 }, getResources()
.getDrawable(R.drawable.icon2_32x32));
stateListDrawable.addState(new int[] { 1 }, getResources()
.getDrawable(R.drawable.icon1_32x32));

//Hintergrund des View befüllt
view.setBackgroundDrawable(stateListDrawable);
Wenn es gut gelaufen ist, könnt ihr nun schon das oberste Bild, das was zuerst als Status hinzugefügt worden ist, sehen. (Ich setzt vorraus, dass das View auch so schon sichtbar war und nun nur verändert wird!)
icon1_32x32 und icon2_32x32 müsst ihr natürlich im /res/drawable/ haben.
Zur Testzwecke könnt ihr auch diese drei Icons von der Developerseite verwenden:
pressed focused normal

So nun kommen wir zu dem Teil, wo ihr den Status manuell setzt und das aussehen, des View ändert.

An jeder stelle des GUI-Threads könnt ihr vom Background des Views den Status ändern/setzten und nach der Invalidierung wird sich der Hintergrund eurem Icon anpassen.

view.getBackground().setState(new int[] { 1 });
view.getBackground().invalidateSelf();
Damit springt der StateListDrawable und damit der Hintergrund des Views auf das icon1_32x32.

So damit wisst ihr nun, wie der Background eines Views durch Statusänderung flexible gehalten werden kann.

regards

Keine Kommentare:

Kommentar veröffentlichen