Android LinearLayout Gradientowe tło

247

Mam problem ze stosowaniem gradientowego tła do LinearLayout.

Powinno to być stosunkowo proste z tego, co przeczytałem, ale wydaje się, że nie działa. Dla odniesienia opracowuję aktualizację 2.1.

header_bg.xml:

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle">
    <gradient
        android:angle="90"
        android:startColor="#FFFF0000"
        android:endColor="#FF00FF00"
        android:type="linear"/>
</shape>

main_header.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="50dip"
    android:orientation="horizontal"
    android:background="@drawable/header_bg">
</LinearLayout>

Jeśli zmienię @ drawable / header_bg na kolor - np. # FF0000, działa to doskonale. Czy brakuje mi czegoś oczywistego?

Geneza
źródło
android: backgroundTint android: backgroundTintMode stackoverflow.com/a/43341289/3209132
Pramod Garg

Odpowiedzi:

407

Ok, udało mi się to rozwiązać za pomocą selektora. Zobacz kod poniżej:

main_header.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="50dip"
    android:orientation="horizontal"
    android:background="@drawable/main_header_selector">
</LinearLayout>

main_header_selector.xml:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item>
    <shape>
        <gradient
            android:angle="90"
            android:startColor="#FFFF0000"
            android:endColor="#FF00FF00"
            android:type="linear" />
    </shape>
</item>
</selector>

Mam nadzieję, że pomoże to komuś, kto ma ten sam problem.

Geneza
źródło
5
Wspaniały. Do Twojej wiadomości, zobacz inne typy gradientów: developer.android.com/reference/android/graphics/drawable/…
Bamaco
86

Możliwe jest również posiadanie trzeciego koloru (środek). I różne kształty.

Na przykład w drawable / gradient.xml:

<shape
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle">
    <gradient
        android:startColor="#000000"
        android:centerColor="#5b5b5b"
        android:endColor="#000000"
        android:angle="0" />
</shape>

To daje ci czarno - szaro - czarny (od lewej do prawej), który jest moim ulubionym bankomatem na ciemnym tle.

Pamiętaj, aby dodać gradient.xml jako tło w swoim układzie xml:

android:background="@drawable/gradient"

Możliwe jest również obracanie za pomocą:

kąt = „0”

daje linię pionową

i z

kąt = „90”

daje linię poziomą

Możliwe kąty to:

0, 90, 180, 270.

Istnieje również kilka różnych rodzajów kształtów:

android: shape = „prostokąt”

Zaokrąglony kształt:

android: shape = „owal”

i prawdopodobnie kilka innych.

Mam nadzieję, że to pomaga, na zdrowie!

Sindri Þór
źródło
40

W pliku graficznym XML:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item>
        <shape>
            <gradient android:angle="90"
                android:endColor="#9b0493"
                android:startColor="#38068f"
                android:type="linear" />
        </shape>
    </item>
</selector>

W pliku układu: android: background = "@ drawable / gradient_background"

  <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@drawable/gradient_background"
        android:orientation="vertical"
        android:padding="20dp">
        .....

</LinearLayout>

wprowadź opis zdjęcia tutaj

Pacific P. Regmi
źródło
Cześć, jak udało Ci się uzyskać przezroczysty pasek stanu? Jeśli ustawię przezroczystość w styles.xml, stanie się czarny ..
Kironet
21

Spróbuj usunąć Androida: gradientRadius = „90”. Oto jeden, który działa dla mnie:

<shape 
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle"
>
    <gradient
        android:startColor="@color/purple"
        android:endColor="@color/pink"
        android:angle="270" />
</shape>
Vincent Mimoun-Prat
źródło
Niestety to nie działa dla mnie. Zaktualizowałem oryginalne pytanie tym, co mam teraz.
Księga Rodzaju
Czy nadal nie działa po dodaniu widgetu do układu (na przykład TextView?
Vincent Mimoun-Prat
Prawidłowo - nadal nie działa z TextView wewnątrz układu. Ponownie, jeśli zastosuję kolor statyczny zamiast rysowalnego, działa to dobrze. Jedną z rzeczy, które zauważyłem, jest to, że mogę (czasami) sprawić, by działało za pomocą selektora, ale z mojego zrozumienia nie powinno to być konieczne.
Księga Rodzaju
6

Mój problem polegał na tym, że rozszerzenie .xml nie zostało dodane do nazwy pliku nowo utworzonego pliku XML. Dodanie rozszerzenia .xml rozwiązało mój problem.

kwahn
źródło
3

Z Kotlin możesz to zrobić w zaledwie 2 liniach

Zmień wartości kolorów w tablicy

                  val gradientDrawable = GradientDrawable(
                        GradientDrawable.Orientation.TOP_BOTTOM,
                        intArrayOf(Color.parseColor("#008000"),
                                   Color.parseColor("#ADFF2F"))
                    );
                    gradientDrawable.cornerRadius = 0f;

                   //Set Gradient
                   linearLayout.setBackground(gradientDrawable);

Wynik

wprowadź opis zdjęcia tutaj

Hitesh Sahu
źródło
1

Nie wiem, czy to pomoże komukolwiek, ale mój problem polegał na tym, że próbowałem ustawić gradient na właściwość „src” ImageView w następujący sposób:

<ImageView 
    android:id="@+id/imgToast"
    android:layout_width="wrap_content"
    android:layout_height="60dp"
    android:src="@drawable/toast_bg"
    android:adjustViewBounds="true"
    android:scaleType="fitXY"/>

Nie jestem w 100% pewien, dlaczego to nie zadziałało, ale teraz to zmieniłem i umieściłem drawable we właściwości „background” rodzica ImageView, która w moim przypadku jest RelativeLayout, tak: (to zadziałało pomyślnie)

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:id="@+id/custom_toast_layout_id"
    android:layout_height="match_parent"
    android:background="@drawable/toast_bg">
wystąpienie
źródło
0

Sprawdziłbym twój kanał alfa na twoich gradientowych kolorach. Dla mnie, kiedy testowałem mój kod, miałem źle ustawiony kanał alfa na kolorach i to nie działało dla mnie. Po ustawieniu kanału alfa wszystko działało!

Ray Hunter
źródło
0

Aby to zrobić, możesz użyć widoku niestandardowego. Dzięki temu rozwiązaniu uzyskasz kształty gradientu wszystkich kolorów w twoich projektach:

class GradientView(context: Context, attrs: AttributeSet) : View(context, attrs) {

    // Properties
    private val paint: Paint = Paint()
    private val rect = Rect()

    //region Attributes
    var start: Int = Color.WHITE
    var end: Int = Color.WHITE
    //endregion

    override fun onSizeChanged(w: Int, h: Int, oldw: Int, oldh: Int) {
        super.onSizeChanged(w, h, oldw, oldh)
        // Update Size
        val usableWidth = width - (paddingLeft + paddingRight)
        val usableHeight = height - (paddingTop + paddingBottom)
        rect.right = usableWidth
        rect.bottom = usableHeight
        // Update Color
        paint.shader = LinearGradient(0f, 0f, width.toFloat(), 0f,
                start, end, Shader.TileMode.CLAMP)
        // ReDraw
        invalidate()
    }

    override fun onDraw(canvas: Canvas) {
        super.onDraw(canvas)
        canvas.drawRect(rect, paint)
    }

}

Tworzę również projekt Open Source GradientView z tym niestandardowym widokiem:

https://github.com/lopspower/GradientView

implementation 'com.mikhaellopez:gradientview:1.1.0'
lopez.mikhael
źródło
Wygląda ciekawie. Czy to działa z późniejszymi wersjami Androida. Miałem problemy z innymi odpowiedziami, ponieważ wydają się one już nieaktualne: Issuetracker.google.com/issues/37114374
trees_are_great