Android LinearLayout Gradyan Arka Planı


247

Degrade arka plan LinearLayout için uygulamada sorun yaşıyorum.

Bu, okuduğumdan nispeten basit olmalı, ancak işe yaramıyor gibi görünüyor. Referans paketleri için 2.1-update1 üzerinde geliştiriyorum.

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>

@ Drawable / header_bg öğesini bir renge değiştirirsem - örneğin # FF0000 mükemmel bir şekilde çalışır. Burada bariz bir şeyi mi kaçırıyorum?


android: backgroundTint android: backgroundTintMode stackoverflow.com/a/43341289/3209132
Pramod Garg

Yanıtlar:


407

Tamam, bunu bir seçici kullanarak çözmeyi başardım. Aşağıdaki koda bakın:

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>

Umarım bu aynı sorunu yaşayan birine yardımcı olur.


5
Harika. Bilginize, diğer gradyan türlerine bakın: developer.android.com/reference/android/graphics/drawable/…
Bamaco

86

Üçüncü renge (ortada) sahip olmak da mümkündür. Ve farklı şekiller.

Örneğin drawable / gradient.xml dosyasında:

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

Bu size en sevdiğim koyu arka plan atmım olan siyah - gri - siyah (soldan sağa) verir.

Gradient.xml dosyasını mizanpajınızın xml arka planı olarak eklemeyi unutmayın:

android:background="@drawable/gradient"

Aşağıdakilerle birlikte döndürmek de mümkündür:

açısı = "0"

size dikey bir çizgi verir

Ve birlikte

açısı = "90"

yatay bir çizgi verir

Olası açılar:

0, 90, 180, 270.

Ayrıca birkaç farklı şekil vardır:

robot: şekil = "dikdörtgen"

Yuvarlak şekil:

robot: şekil = "oval"

ve muhtemelen birkaç tane daha.

Umarım yardımcı olur, şerefe!


40

XML Çekilebilir Dosyasında:

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

Düzen dosyanızda: 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>

resim açıklamasını buraya girin


Merhaba, şeffaf durum çubuğuna nasıl ulaştınız? Styles.xml'de saydam yaparsam siyah olur ..
kironet

21

Android'i kaldırmayı deneyin: gradientRadius = "90". İşte benim için çalışan bir tane:

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

Ne yazık ki bu benim için çalışmıyor. Orijinal soruyu şimdi sahip olduğum soru ile güncelledim.
Genesis

Düzene bir widget eklediğinizde hala çalışmıyor mu (örneğin bir TextView?)
Vincent Mimoun-Prat

Düzeltme - Düzen içinde bir TextView ile çalışmaz. Yine, çekilebilir yerine statik bir renk uygularsam, gayet iyi çalışır. Fark ettiğim bir şey, (bazen) bir seçici kullanarak çalışmasını sağlayabiliyorum ama bu benim anlayışımdan gerekli olmamalı.
Genesis

6

Benim sorunum .xml uzantısı yeni oluşturulan XML dosyasının dosya adına eklenmedi. .Xml uzantısını eklemek sorunumu düzeltti.


3

Kotlin ile bunu sadece 2 satırda yapabilirsiniz

Dizideki renk değerlerini değiştirme

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

                   //Set Gradient
                   linearLayout.setBackground(gradientDrawable);

Sonuç

resim açıklamasını buraya girin


1

Bu kimseye yardımcı olur bilmiyorum, ama benim sorunum ben de böyle bir ImageView "src" özelliğine degrade ayarlamak için çalışıyordu oldu:

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

Neden işe yaramadı% 100 emin değilim, ama şimdi ben değiştirdim ve benim durumumda bir RelativeLayout olan ImageView ebeveyninin "arka plan" özelliğine çekilebilir koymak, şöyle: (başarıyla çalıştı)

<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

Alfa kanalınızı gradyan renklerinizde kontrol ederdim. Benim için, kodumu test ederken alfa kanalı renkleri yanlış ayarlanmış ve benim için çalışmadı. Alfa kanalını ayarladıktan sonra her şey işe yaradı!


0

Bunu yapmak için özel bir görünüm kullanabilirsiniz. Bu çözümle, projelerinizdeki tüm renklerin degrade şekillerini tamamladı:

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)
    }

}

Ayrıca bu özel görünüm ile açık kaynak kodlu bir proje GradientView oluşturuyorum:

https://github.com/lopspower/GradientView

implementation 'com.mikhaellopez:gradientview:1.1.0'

İlgi çekici görünüyor. Bu, Android'in sonraki sürümleriyle çalışır mı? Şu anda kullanımdan kaldırılmış gibi göründükleri için diğer cevaplarla ilgili sorunlar yaşıyordum
trees_are_great
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.