Wie stelle ich den Hintergrundfarbverlauf programmgesteuert in einer benutzerdefinierten Titelleiste ein?

79

Es gibt viele Tutorials und Fragen zu SO, die benutzerdefinierte Titelleisten implementieren. In meiner benutzerdefinierten Titelleiste habe ich jedoch einen benutzerdefinierten Verlauf für den Hintergrund und möchte wissen, wie ich ihn dynamisch in meinem Code festlegen kann.

Hier wird meine benutzerdefinierte Titelleiste aufgerufen:

requestWindowFeature(Window.FEATURE_CUSTOM_TITLE);
setContentView(R.layout.foo_layout);
getWindow().setFeatureInt(Window.FEATURE_CUSTOM_TITLE, R.layout.custom_title_bar); 

Und das ist mein custom_title_bar:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:background="@layout/custom_title_bar_background_colors">
<ImageView   
              android:layout_width="fill_parent"
              android:layout_height="wrap_content"
              android:src="@drawable/title_bar_logo"
              android:gravity="center_horizontal"
              android:paddingTop="0dip"/>

</LinearLayout>

Wie Sie sehen können, wird der Hintergrund des linearen Layouts von diesem Typen definiert:

<shape xmlns:android="http://schemas.android.com/apk/res/android">
<gradient 
    android:startColor="#616261" 
    android:endColor="#131313"
    android:angle="270"
 />
<corners android:radius="0dp" />
</shape>

Ich möchte diese Verlaufsfarben dynamisch in meinem Code festlegen. Ich möchte sie nicht wie derzeit in meiner XML-Datei fest codieren.

Ich bin offen für alle Ideen, wenn Sie einen Hintergrundverlauf besser einstellen können.

Danke im Voraus!!

AngeloS
quelle

Antworten:

200

Dazu erstellen Sie im Code ein GradientDrawable.
Die einzige Möglichkeit, den Winkel und die Farbe festzulegen, besteht im Konstruktor. Wenn Sie die Farbe oder den Winkel ändern möchten, erstellen Sie einfach ein neues GradientDrawable und legen Sie es als Hintergrund fest

    View layout = findViewById(R.id.mainlayout);

    GradientDrawable gd = new GradientDrawable(
            GradientDrawable.Orientation.TOP_BOTTOM,
            new int[] {0xFF616261,0xFF131313});
    gd.setCornerRadius(0f);

    layout.setBackgroundDrawable(gd);

Damit dies funktioniert, habe ich Ihrem Haupt-LinearLayout wie folgt eine ID hinzugefügt

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/mainlayout"
    android:orientation="horizontal"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">
<ImageView   
              android:layout_width="fill_parent"
              android:layout_height="wrap_content"
              android:src="@drawable/title_bar_logo"
              android:gravity="center_horizontal"
              android:paddingTop="0dip"/>

</LinearLayout>

Und dies wie für eine benutzerdefinierte Titelleiste zu verwenden

    getWindow().setFeatureInt(Window.FEATURE_CUSTOM_TITLE,R.layout.custom_title_bar);
    View title = getWindow().findViewById(R.id.mainlayout);
    title.setBackgroundDrawable(gd);
Slund
quelle
Danke für den Tipp. Kann dies für ein Widget durchgeführt werden? Ich habe ein Widget mit einer Verlaufsform und möchte die Farbe dieses Verlaufs ändern. Ist dies bei Widgets möglich?
Majjoodi
2
@slund gibt es eine Möglichkeit, den Gradienten von der Mitte aus zu erzeugen? anstatt 'GradientDrawable.Orientation.TOP_BOTTOM?'
Louis Evans
Das ist in Ordnung, aber was tun, wenn die API des Benutzers <16 ist?
Markieren Sie den
@mark Dies ist die Antwort auf Ihre Frage stackoverflow.com/a/11947755/3080016
HinoHara
6
setBackgroundDrawable()ist veraltet, da ich denke, API 16. Sie sollten setBackground()auch / stattdessen verwenden. Siehe stackoverflow.com/questions/27141279/…
Ban-Geoengineering
1

Wenn die akzeptierte Antwort nicht funktioniert, können Sie versuchen, sie festzulegen foreground.

color.setForeground(gradient);
Jakub Piga
quelle