2013-04-12

Widget-Hintergrund setzen

In bisherigen TKWeek-Versionen hatten Appwidgets einen zu 50% transparenten Hintergrund. Das sah eigentlich recht hübsch aus. Spätestens seit diesem Post wissen Sie aber, dass ich das Ganze einstellbar gemacht habe. Der Grund ist einfach – den Anwendern gefällt es, das Erscheinungsbild feinzutunen.
Setzt man die Deckkraft auf 0, scheint der Hintergrund vollständig durch. Das sieht so aus:
Screenshot: Zwei TKWeek-Appwidgets mit transparenten Hintergrund
Screenshot: Zwei TKWeek-Appwidgets mit transparenten Hintergrund
Die Transparenz des Hintergrunds lässt sich in Android sehr einfach durch Setzen der Bits 24 bis 31 des Farbwerts einstellen. 0 bedeutet durchsichtig, 255 heißt vollständig deckend. Soll der Wert nicht änderbar sein, geschieht dies bequem in der Layoutdatei. Zur Laufzeit gestaltet es sich ebenfalls einfach, wenn die Methode setBackground() vorhanden ist. Das ist bei allen Views der Fall – oder?
Sehen wir uns ein Quelltextfragment an, das Appwidgets darstellt.
 final RemoteViews updateViews = new RemoteViews(  
       context.getPackageName(), R.layout.datewidget_layout);  
 ...  
 // auf Antippen reagieren  
 Intent intent = new Intent(context, MyDayActivity.class);  
 PendingIntent pendingIntent = PendingIntent.getActivity(context, 0,  
       intent, 0);  
 updateViews.setOnClickPendingIntent(R.id.datewidget_id, pendingIntent);  
 appWidgetManager.updateAppWidget(appWidgetIds, updateViews);  
RemoteViews beschreiben eine View-Hierarchie, die in einem anderen Prozess angezeigt werden kann. Die Hierarchie wird aus einer Layoutdatei entfaltet. Die Klasse bietet einige grundlegende Operationen, um den Inhalt der entfalteten View-Hierarchie zu modifizieren. Wenn Sie nach einer Methode setBackground() suchen, werden Sie aber leider nicht fündig.
Folgendes Quelltextfragment führt aber doch zum Erfolg:
 public static void setWidgetAppearance(Context context, RemoteViews views,  
       int resid) {  
    int opacity = WidgetPreference.getOpacity(context);  
    int color = 0x000000;  
    opacity <<= 24;  
    views.setInt(resid, "setBackgroundColor", opacity | color);  
 }  
Die Magie ist, der RemoteViews-Instanz zu sagen, eine bestimmte Methode des durch resid identifizierten Views aufzurufen. In unserem Fall ist dies setBackground(). Auf diese Weise kann beispielsweise auch die Vordergrundfarbe eingestellt werden.

No comments:

Post a Comment