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?


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.


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!


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


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>

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.


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


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

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!


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'

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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.