Android LinearLayout: LinearLayout çevresine gölgeli kenarlık ekleyin


150

Örnek olarak bu LinearLayout'un aynı sınırını oluşturmak istiyorum:

görüntü açıklamasını buraya girin

Bu örnekte, lineerLayout çevresinde sınırın aynı olmadığını görebiliriz. Bunu bir XML çekilebilir dosya kullanarak nasıl oluşturabilirim?

Şimdilik, LinearLayout'un her yerinde şu şekilde sadece basit bir sınır oluşturabildim:

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle">
  <corners
      android:radius="1dp"
      android:topRightRadius="0dp"
      android:bottomRightRadius="0dp"
      android:bottomLeftRadius="0dp" />
  <stroke
      android:width="1dp"
      android:color="#E3E3E1" />

  <solid android:color="@color/blanc" />

</shape>

1
backgroundbunun için özelliği kullanabilirsiniz ... dikdörtgen, renk ve gölge efekti gibi bir şekle sahip bir XML dosyası oluşturun ve bunu doğrusal düzeniniz için arka plan olarak ayarlayın ..
Pragnesh Ghoda シ

gri kenarlık ve dolgu efekti için de vuruş kullanın
Pragnesh Ghoda シ

Bence, iki düzen xml olduğunu, bir lineer düzeni ve bağıl düzeni yaşıyor iç dolgu olduğunu söylemek
GIRU Bhai

@ Prag's Bu xml dosyasını oluştururken bana yardım eder misiniz lütfen?
wawanopoulos

1
Alternatif bir yol, düzeninizin arka planı olarak 9 yama görüntüsü kullanmak olabilir. Bu gerçekten pürüzsüz, solan bir gölgeye izin verir (bence çok gerçekçi).
Phantômaxx

Yanıtlar:


263

Bunu dene..

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item>
        <shape android:shape="rectangle">
            <solid android:color="#CABBBBBB"/>
            <corners android:radius="2dp" />
        </shape>
    </item>

    <item
        android:left="0dp"
        android:right="0dp"
        android:top="0dp"
        android:bottom="2dp">
        <shape android:shape="rectangle">
            <solid android:color="@android:color/white"/>
            <corners android:radius="2dp" />
        </shape>
    </item>
</layer-list>

@Hariharan Çok teşekkürler! Kodunuzu denedim ve tamam görünüyor. Ancak, henüz yapılacak bir şey var: Doğrusal düzenin soluna ve sağına nasıl ince bir kenarlık (1dp) ekleyebilirim? (örnek olarak)
wawanopoulos

2
@wawanopoulos Hariharan'ın cevabında "0dp"ile değiştirin "1dp".
Phantômaxx

#EAEAEA rengini ana mizanpajınıza ekleyebilirsiniz, böylece tıpkı soru resmi gibi olacaktır
Samad

3
Ben de bunun için kullanabileceğiniz öneririm <gradient>içinde senin <shape>sınır etkisini artırmak için, ve o UI yerine düz renk sınırın ihtiyacı etkisi gerçekten de eğer.
patrickjason91

match_parent ile iç düzeninizin olduğundan emin olun ve ardından iç düzene 1 kenar boşluğu verin
Shaktisinh Jadeja

86

CardView bu yüzden var. CardView | Android Geliştiricileri
Sadece lolipop öncesi cihazlarda yükseltmeyi destekleyen bir FrameLayout.

<android.support.v7.widget.CardView
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    app:cardUseCompatPadding="true"
    app:cardElevation="4dp"
    app:cardCornerRadius="3dp" >

    <!-- put whatever you want -->

</android.support.v7.widget.CardView>

Bunu kullanmak için aşağıdakilere bağımlılık eklemeniz gerekir build.gradle:

compile 'com.android.support:cardview-v7:23.+'

gölge rengi nasıl değiştirilir
Aditay Kaushal


1
4.4.4 (veya benzeri) cihazlarda çok garip davranış. Kart görünümüne büyük bir marj eklenir ve kullanıcı arayüzünü çok çirkinleştirir.
Morteza Rastgoo

Kabul edilen cevap bu olmalıdır. Yine de küçük bir güncelleme. Androidx one -> androidx.cardview.widget.CardView
bogdan

61

En iyi görünen sonuçları 9 yama grafiği kullanarak elde ederim.

Aşağıdaki düzenleyiciyi kullanarak tek bir 9 yama grafiği oluşturabilirsiniz: http://inloop.github.io/shadow4android/

Misal:

9 yama grafiği:

9 yama grafiği:

Sonuç:

görüntü açıklamasını buraya girin

Kaynak:

<LinearLayout
android:layout_width="200dp"
android:layout_height="200dp"
android:orientation="vertical"
android:background="@drawable/my_nine_patch"

1
Siyah çizgiyi nasıl gizleyebilirim? Lütfen yardım edin
Isaac Darlong

@Isaac resmi my_nine_patch olarak kaydedin. 9.png (.9.png 9 toplu resimdir)
2017

37

tamam, bunun çok geç olduğunu biliyorum. ama bende de aynı şart vardı. böyle çözdüm

1. İlk olarak "drawable" klasöründe bir xml dosyası (örnek: border_shadow.xml) oluşturun ve aşağıdaki kodu içine kopyalayın.

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle" >

<item>
    <shape>
        <!-- set the shadow color here -->
        <stroke
            android:width="2dp"
            android:color="#7000" />

        <!-- setting the thickness of shadow (positive value will give shadow on that side) -->

        <padding
            android:bottom="2dp"
            android:left="2dp"
            android:right="-1dp"
            android:top="-1dp" />

        <corners android:radius="3dp" />
    </shape>
</item>

<!-- Background -->

<item>
    <shape>
        <solid android:color="#fff" />
        <corners android:radius="3dp" />
    </shape>
</item>

2. gölgeyi istediğiniz yerdeki düzeni şimdi (örnek: LinearLayout) android'e ekleyin: arka plan

<LinearLayout
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_margin="8dip"
    android:background="@drawable/border_shadow"
    android:orientation="vertical">

ve bu benim için çalıştı.


22

Bu çok basit:

Bunun gibi bir degradeye sahip bir çekilebilir dosya oluşturun:

bir görünümün altındaki gölge için below_shadow.xml

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">   
<gradient
    android:startColor="#20000000"
    android:endColor="@android:color/transparent"
    android:angle="270" >
</gradient>
</shape>

bir görünümün üzerindeki gölge için above_shadow.xml

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">   
<gradient
    android:startColor="#20000000"
    android:endColor="@android:color/transparent"
    android:angle="90" >
</gradient>
</shape>

ve bu şekilde sağ ve sol gölge için sadece degradenin açısını değiştirin :)


aşağıdaki gölgeyi nerede aradım? bir görünümün arka planı?
Arthur Melo

1
Under_shadow xml dosyası oluşturun, ardından görünümünüzde, mizanpajınıza bir "Görünüm" ekleyin ve bu görünümün arka planı olarak below_shadow.xml'yi ayarlayın
Morteza Rastgoo

Söylediğinizin aynısını yaptım, ancak bu görünümü özel görünüme koyduğumda "yukarıdaki_ gölgem" şeffaf değil. Ayrı ayrı iyi çalışıyor. Ne yapmalıyım?
SoYoung

18

Alternatif olarak, mizanpajınız için arka plan olarak daha "doğal" gölgeler sağlayan bir 9 yama resmi kullanabilirsiniz:

görüntü açıklamasını buraya girin

Sonuç:

görüntü açıklamasını buraya girin

Resmi /res/drawableklasörünüze koyun .
Emin olun dosya uzantısıdır .9.pngdeğil.png

Bu arada, bu, API 19 sdk kaynaklar klasöründe bulunan mevcut bir kaynağın değiştirilmiş (minimum kare boyutuna indirgenmiştir).
Draw9patch aracında gösterildiği gibi zararlı görünmedikleri için kırmızı işaretleri bıraktım.

[DÜZENLE]

Onlarla hiçbir ilginiz yoksa diye yaklaşık 9 yama.

Görünümünüzün arka planı olarak eklemeniz yeterlidir.

Siyah işaretli alanlar (sol ve üst) uzayacaktır (dikey, yatay).
Siyah işaretli alanlar (sağ, alt) "içerik alanını" (metin veya Görünüm eklemenin mümkün olduğu yerlerde - isterseniz işaretlenmemiş bölgeleri "dolgu" olarak adlandırabilirsiniz) tanımlar.

Öğretici: http://radleymarx.com/blog/simple-guide-to-9-patch/


1
Görünümünüzün arka planı olarak eklemeniz yeterlidir. Siyah işaretli alanlar (sol ve üst) uzayacaktır (dikey, yatay). Siyah işaretli alanlar (sağda, altta) "içerik alanını" (metin veya Görünüm eklemenin mümkün olduğu yerlerde - isterseniz "dolgu" olarak adlandırın) tanımlar. Öğretici: radleymarx.com/blog/simple-guide-to-9-patch
Phantômaxx

9

Drop_shadow.xml adıyla çekilebilir bir .xml dosyası oluşturursunuz:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <!--<item android:state_pressed="true">
        <layer-list>
            <item android:left="4dp" android:top="4dp">
                <shape>
                    <solid android:color="#35000000" />
                    <corners android:radius="2dp"/>
                </shape>
            </item>
            ...
        </layer-list>
    </item>-->
    <item>
        <layer-list>
            <!-- SHADOW LAYER -->
            <!--<item android:top="4dp" android:left="4dp">
                <shape>
                    <solid android:color="#35000000" />
                    <corners android:radius="2dp" />
                </shape>
            </item>-->
            <!-- SHADOW LAYER -->
            <item>
                <shape>
                    <solid android:color="#35000000" />
                    <corners android:radius="2dp" />
                </shape>
            </item>
            <!-- CONTENT LAYER -->
            <item android:bottom="3dp" android:left="1dp" android:right="3dp" android:top="1dp">
                <shape>
                    <solid android:color="#ffffff" />
                    <corners android:radius="1dp" />
                </shape>
            </item>
        </layer-list>
    </item>
</selector>

Sonra:

<LinearLayout
...
android:background="@drawable/drop_shadow"/>

3

Bu tek satırı kullanın ve umarız en iyi sonucu alırsınız;

Kullanım: android:elevation="3dp" Boyutu istediğiniz kadar ayarlayın ve bu, düğmeler ve diğer varsayılan android gölgeleri gibi gölge elde etmenin en iyi ve en basit yoludur. İşe yarayıp yaramadığını bana bildirin!


@ MichałZiobro Daha küçük bir düzeniniz varsa ve gölgeyi göstermek istiyorsanız, bunu düzenlerinizle birlikte kullanın. İşe yaramalı. Metinlerinizin ve düğmelerinizin görünmez olduğunu görebilirsiniz, ancak uygulamayı çalıştırdığınızda en iyi gölgeyi göreceksiniz. Bunun bir tür hata veya başka bir şey olduğundan emin değilim, ancak benim durumumda bu kodu kullandığımda, tüm Görünümlerimi AS önizlemesinde görünmez hale getiriyor, ancak uygulamada en iyi sonucu cihazımda hata ayıkladığımda / başlattığımda çalışıyor. İşe yarayıp yaramadığını bana bildirin. Teşekkürler.
Tamim

3

Zaten şekilden kenarlığa sahipseniz, sadece yükseklik ekleyin:

<LinearLayout
    android:id="@+id/layout"
    ...
    android:elevation="2dp"
    android:background="@drawable/rectangle" />

2
API <21'de davranış nedir?
CoolMind

1
Maalesef Lollipop öncesi çalışmıyor, bu yüzden bu sorunun diğer cevaplarından bazılarını kullanmalısınız. Ancak daha yeni telefonları hedefliyorsanız, bu, işe yarayan oldukça kolay bir yoldur.
Krzynool

3

1. İlk olarak "drawable" klasöründe bir xml dosya adı shadow.xml oluşturun ve aşağıdaki kodu içine kopyalayın.

 <?xml version="1.0" encoding="utf-8"?>
    <layer-list xmlns:android="http://schemas.android.com/apk/res/android">
        <item>
            <shape android:shape="rectangle">
                <solid android:color="#CABBBBBB" />
                <corners android:radius="10dp" />
            </shape>
        </item>

        <item
            android:bottom="6dp"
            android:left="0dp"
            android:right="6dp"
            android:top="0dp">
            <shape android:shape="rectangle">
                <solid android:color="@android:color/white" />
                <corners android:radius="4dp" />
            </shape>
        </item>
    </layer-list>

Ardından katman listesini LinearLayout'unuza arka plan olarak ekleyin.

<LinearLayout
        android:id="@+id/header_bar"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@drawable/shadow"
        android:orientation="vertical">

1
@Johndahat its ok
Sudhir singh

2

Ya Mehdi aj --- Göreceli Düzen için

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item>
        <shape android:shape="rectangle">
            <gradient
                android:startColor="#7d000000"
                android:endColor="@android:color/transparent"
                android:angle="90" >
            </gradient>
            <corners android:radius="2dp" />
        </shape>
    </item>

    <item
        android:left="0dp"
        android:right="3dp"
        android:top="0dp"
        android:bottom="3dp">
        <shape android:shape="rectangle">
            <padding
                android:bottom="40dp"
                android:top="40dp"
                android:right="10dp"
                android:left="10dp"
                >
            </padding>
            <solid android:color="@color/Whitetransparent"/>
            <corners android:radius="2dp" />
        </shape>
    </item>
</layer-list>

2

Geç olduğunu biliyorum ama birine yardımcı olabilir.

Bir constraintLayout kullanabilir ve aşağıdaki özelliği xml'ye ekleyebilirsiniz,

        android:elevation="4dp"

0

Bununla başa çıkmanın en iyi yolunu buldum.

  1. Düzende düz bir dikdörtgen arka plan ayarlamanız gerekir.

  2. Bu kodu kullanın - ViewCompat.setElevation(view , value)

  3. Üst düzen kümesinde android:clipToPadding="false"


2
Eğer bilmiyordum durumda, bunun mevcut uygulamasıdır ViewCompat.setElevation()ViewCompat sınıfına yöntemle: public void setElevation(View view, float elevation) {}. Gördüğünüz gibi uygulanmadı. Gerçekten lol, herhangi bir yardım olacak şüphesiz, ve gerçekten artık kendi cevap test acaba
mradzinski
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.