Android View shadow


102

Saya mencari-cari, dan saya tidak dapat menemukan cara yang tepat untuk melakukan ini. Saya ingin memiliki efek bayangan berikut pada pandangan saya: masukkan deskripsi gambar di sini

masukkan deskripsi gambar di sini

Sejujurnya, saya tidak tahu apakah yang kedua ini dilakukan dengan menerapkan efek bayangan. Ada ide?


1
Maksudmu ini? stackoverflow.com/questions/4406524/… (periksa jawaban suara tertinggi, bukan jawaban yang ditandai)
Luke Vo

1
@DatVM, terima kasih, ini sepertinya melakukan trik, tapi saya berpikir mungkin ada alat bawaan di sdk android. Misalnya, menambahkan bayangan jatuh untuk tata letak linier hanya dengan menambahkan beberapa baris kode: P
longwalker

Pertanyaan serupa - stackoverflow.com/q/52954743/9640177 - menambahkan bayangan ke
drawable

Jawaban:


158

Aku tahu pertanyaan ini sudah dijawab tapi aku ingin kau tahu bahwa aku menemukan drawablepada Android Studioyang sangat mirip dengan foto yang Anda miliki dalam pertanyaan: Lihatlah ini:

android:background="@drawable/abc_menu_dropdown_panel_holo_light"

Ini terlihat seperti ini:

masukkan deskripsi gambar di sini

Semoga bermanfaat

Edit

Opsi di atas adalah untuk versi yang lebih lama Android Studiosehingga Anda mungkin tidak menemukannya. Untuk versi yang lebih baru:

android:background="@android:drawable/dialog_holo_light_frame"

Selain itu, jika ingin memiliki custom shape sendiri, saya sarankan untuk menggunakan software like Photoshopand draw.

masukkan deskripsi gambar di sini

Jangan lupa menyimpannya sebagai .9.pngfile (contoh my_background.9.png:)

Baca dokumentasinya: Gambar 9-patch

Edit 2

Solusi yang lebih baik dan tidak terlalu sulit adalah menggunakan a CardViewdan set app:cardPreventCornerOverlap="false"untuk mencegah tampilan tumpang tindih dengan batas:

<android.support.v7.widget.CardView
    android:id="@+id/card_view"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    app:cardCornerRadius="2dp"
    app:cardElevation="2dp"
    app:cardPreventCornerOverlap="false"
    app:contentPadding="0dp">

    <!-- your layout stuff here -->

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

Pastikan juga untuk menyertakan versi terbaru dalam build.gradle, saat ini

compile 'com.android.support:cardview-v7:26.0.0'

Terima kasih, sebenarnya, tampilannya sangat mirip. Saya juga menemukan "tata letak kartu google" untuk android, dan mereka cukup keren!
longwalker

6
Hebat. Hanya FYI untuk pemirsa masa depan, ini masuk /<sdk-path>/extras/android/support.
theblang

2
Bagaimana dengan menggunakancardView
Alex Chengalan

100

Saya menggunakan Android Studio 0.8.6 dan saya tidak dapat menemukan:

android:background="@drawable/abc_menu_dropdown_panel_holo_light"

jadi saya menemukan ini sebagai gantinya:

android:background="@android:drawable/dialog_holo_light_frame"

dan terlihat seperti ini:

masukkan deskripsi gambar di sini


1
tapi kita tidak bisa menambahkan radius sudut dengan itu ?!
Fay007

40

menempatkan latar belakang @android:drawable/dialog_holo_light_frame, memberi bayangan tetapi Anda tidak dapat mengubah warna latar belakang atau gaya batas, jadi lebih baik memanfaatkan bayangan itu, sambil tetap dapat menempatkan latar belakang melalui daftar lapisan

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <!--the shadow comes from here-->
    <item
        android:bottom="0dp"
        android:drawable="@android:drawable/dialog_holo_light_frame"
        android:left="0dp"
        android:right="0dp"
        android:top="0dp">

    </item>

    <item
        android:bottom="0dp"
        android:left="0dp"
        android:right="0dp"
        android:top="0dp">
        <!--whatever you want in the background, here i preferred solid white -->
        <shape android:shape="rectangle">
            <solid android:color="@android:color/white" />

        </shape>
    </item>
</layer-list>

simpan di folder drawable di bawah say shadow.xml

untuk menetapkannya ke tampilan, dalam file layout xml setel latar belakangnya

android:background="@drawable/shadow"

Apakah Anda sudah memeriksa apakah itu berhasil? <item> kedua tidak melakukan apapun. Saya tidak bisa mengubahnya menjadi sudut transparan atau bulat.
zeeshan

2
Di antara semua yang saya coba, ini adalah satu-satunya yang berhasil, terima kasih.
Shyam Sunder

1
solusi fantastis
pengguna1974368

34

Buat card_background.xml di folder res / drawable dengan kode berikut:

<?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="#BDBDBD"/>
        <corners android:radius="5dp"/>
    </shape>
</item>

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

Kemudian tambahkan kode berikut ke elemen yang Anda inginkan untuk tata letak kartunya

android:background="@drawable/card_background"

baris berikut menentukan warna bayangan untuk kartu tersebut

<solid android:color="#BDBDBD"/>

10
Ini sebenarnya bukan bayangan - karena tidak pudar. Ini lebih seperti perbatasan di dua sisi.
ban-geoengineering

ini bukan bayangan
ShadeToD

24

CardView memberi Anda bayangan sebenarnya di Android 5+ dan memiliki pustaka dukungan. Cukup bungkus pandangan Anda dengannya dan selesai.

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

Ini membutuhkan ketergantungan berikutnya.

dependencies {
    ...
    compile 'com.android.support:cardview-v7:21.0.+'
}

1
Ini adalah satu-satunya jawaban yang benar, karena hanya CardViewjuga memiliki tingkat bayangan yang berbeda-beda untuk berbagai ketinggian dalam mode compat.
Jarett Millard

Saya merekomendasikan MaterialCardView karena lebih jelas dan memiliki lebih banyak kemampuan.
H. Farid


12

Ini mungkin terlambat tetapi bagi mereka yang masih mencari jawaban untuk ini saya menemukan proyek di git hub dan ini adalah satu-satunya yang benar-benar sesuai dengan kebutuhan saya. android-materialshadowninepatch

Cukup tambahkan baris ini pada dependensi build.gradle Anda

compile 'com.h6ah4i.android.materialshadowninepatch:materialshadowninepatch:0.6.3'

Bersulang. diacungi jempol untuk pencipta! happycodings


Hai @ralphgabb, Apakah ini masih berfungsi dengan baik untuk Anda atau Anda memiliki solusi yang lebih baik untuk perangkat pra-lollipop?
Swapnil

@Swapnil tidak yakin apakah AndroidX mendukungnya sekarang, saya tidak lagi mendukung perangkat pra-Marshmallow.
ralphgabb

5

Saya tahu ini bodoh sekali,
tetapi jika Anda ingin mendukung di bawah v21, inilah pencapaian saya.

rectangle_with_10dp_radius_white_bg_and_shadow.xml

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

    <!-- Shadow layers -->
    <item
        android:left="1dp"
        android:right="1dp"
        android:top="3dp">
        <shape>
            <corners android:radius="10dp" />
            <padding
                android:bottom="1.8dp"
                android:left="1dp"
                android:right="1dp"
                android:top="1dp" />
            <solid android:color="@color/shadow_hack_level_1" />
        </shape>
    </item>
    <item
        android:left="1dp"
        android:right="1dp"
        android:top="3dp">
        <shape>
            <corners android:radius="10dp" />
            <padding
                android:bottom="1.8dp"
                android:left="1dp"
                android:right="1dp"
                android:top="1dp" />
            <solid android:color="@color/shadow_hack_level_2" />
        </shape>
    </item>
    <item
        android:left="1dp"
        android:right="1dp"
        android:top="3dp">
        <shape>
            <corners android:radius="10dp" />
            <padding
                android:bottom="1.8dp"
                android:left="1dp"
                android:right="1dp"
                android:top="1dp" />
            <solid android:color="@color/shadow_hack_level_3" />
        </shape>
    </item>
    <item
        android:left="1dp"
        android:right="1dp"
        android:top="3dp">
        <shape>
            <corners android:radius="10dp" />
            <padding
                android:bottom="1.8dp"
                android:left="1dp"
                android:right="1dp"
                android:top="1dp" />
            <solid android:color="@color/shadow_hack_level_4" />
        </shape>
    </item>
    <item
        android:left="1dp"
        android:right="1dp"
        android:top="3dp">
        <shape>
            <corners android:radius="10dp" />
            <padding
                android:bottom="1.8dp"
                android:left="1dp"
                android:right="1dp"
                android:top="1dp" />
            <solid android:color="@color/shadow_hack_level_5" />
        </shape>
    </item>
    <item
        android:left="1dp"
        android:right="1dp"
        android:top="3dp">
        <shape>
            <corners android:radius="10dp" />
            <padding
                android:bottom="1.8dp"
                android:left="1dp"
                android:right="1dp"
                android:top="1dp" />
            <solid android:color="@color/shadow_hack_level_6" />
        </shape>
    </item>
    <item
        android:left="1dp"
        android:right="1dp"
        android:top="3dp">
        <shape>
            <corners android:radius="10dp" />
            <padding
                android:bottom="1.8dp"
                android:left="1dp"
                android:right="1dp"
                android:top="1dp" />
            <solid android:color="@color/shadow_hack_level_7" />
        </shape>
    </item>
    <item
        android:left="1dp"
        android:right="1dp"
        android:top="3dp">
        <shape>
            <corners android:radius="10dp" />
            <padding
                android:bottom="1.8dp"
                android:left="1dp"
                android:right="1dp"
                android:top="1dp" />
            <solid android:color="@color/shadow_hack_level_8" />
        </shape>
    </item>
    <item
        android:left="1dp"
        android:right="1dp"
        android:top="3dp">
        <shape>
            <corners android:radius="10dp" />
            <padding
                android:bottom="1.8dp"
                android:left="1dp"
                android:right="1dp"
                android:top="1dp" />
            <solid android:color="@color/shadow_hack_level_9" />
        </shape>
    </item>
    <item
        android:left="1dp"
        android:right="1dp"
        android:top="3dp">
        <shape>
            <corners android:radius="10dp" />
            <padding
                android:bottom="1.8dp"
                android:left="1dp"
                android:right="1dp"
                android:top="1dp" />
            <solid android:color="@color/shadow_hack_level_10" />
        </shape>
    </item>

    <!-- Background layer -->
    <item>
        <shape>
            <solid android:color="@android:color/white" />
            <corners android:radius="10dp" />
        </shape>
    </item>

</layer-list>

rectangle_with_10dp_radius_white_bg_and_shadow.xml (v21)

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

view_incoming.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@drawable/rectangle_with_10dp_radius_white_bg_and_shadow"
    android:elevation="7dp"
    android:gravity="center"
    android:minWidth="240dp"
    android:minHeight="240dp"
    android:orientation="horizontal"
    android:padding="16dp"
    tools:targetApi="lollipop">

    <TextView
        android:id="@+id/text1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        tools:text="Hello World !" />

</LinearLayout>

Inilah hasilnya:

Di bawah v21 (ini adalah yang Anda dibuat dengan xml) masukkan deskripsi gambar di sini

Di atas v21 (rendering elevasi nyata) masukkan deskripsi gambar di sini

  • Satu perbedaan signifikan adalah itu akan menempati ruang dalam dari tampilan sehingga area konten Anda yang sebenarnya bisa lebih kecil dari > = perangkat lollipop .

3

Jika Anda membutuhkan bayangan dengan benar untuk diterapkan maka Anda harus melakukan hal berikut.

Pertimbangkan tampilan ini, yang ditentukan dengan drawable latar belakang:

<TextView
    android:id="@+id/myview"
    ...
    android:elevation="2dp"
    android:background="@drawable/myrect" />

Drawable latar belakang didefinisikan sebagai persegi panjang dengan sudut membulat:

<shape xmlns:android="http://schemas.android.com/apk/res/android"
       android:shape="rectangle">
    <solid android:color="#42000000" />
    <corners android:radius="5dp" />
</shape>

Ini adalah cara yang disarankan untuk mengaplikasikan bayangan, lihat ini https://developer.android.com/training/material/shadows-clipping.html#Shadows


2

Gunakan properti elevasi untuk pengaruh bayangan:

<YourView
    ...
    android:elevation="3dp"/>

Menggunakan Elevasi membutuhkan perangkat untuk menjalankan Lollipop.
Shane Rowatt

2

Buat latar belakang drawable seperti ini untuk menunjukkan bayangan bulat.

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <!-- Drop Shadow Stack -->
    <item>
        <shape>
            <corners android:radius="4dp" />
            <padding android:bottom="1dp" android:left="1dp"
                     android:right="1dp"  android:top="1dp" />
            <solid android:color="#00CCCCCC" />
        </shape>
    </item>
    <item>
        <shape>
            <corners android:radius="4dp" />
            <padding android:bottom="1dp" android:left="1dp"
                     android:right="1dp"  android:top="1dp" />
            <solid android:color="#10CCCCCC" />
        </shape>
    </item>
    <item>
        <shape>
            <corners android:radius="4dp" />
            <padding android:bottom="1dp" android:left="1dp"
                     android:right="1dp"  android:top="1dp" />
            <solid android:color="#20d5d5d5" />
        </shape>
    </item>
    <item>
        <shape>
            <corners android:radius="6dp" />
            <padding android:bottom="1dp" android:left="1dp"
                     android:right="1dp"  android:top="1dp" />
            <solid android:color="#30cbcbcb" />
        </shape>
    </item>
    <item>
        <shape>
            <corners android:radius="4dp" />
            <padding android:bottom="1dp" android:left="1dp"
                     android:right="1dp"  android:top="1dp" />
            <solid android:color="#50bababa" />
        </shape>
    </item>

    <!-- Background -->
    <item>
        <shape>
            <solid android:color="@color/gray_100" />
            <corners android:radius="4dp" />
        </shape>
    </item>
</layer-list>

Silakan tambahkan juga deskripsi untuk kode yang telah Anda berikan.
Mangaldeep Pannu

Solusi khusus xml yang sangat bagus
Bruno Bieri

2

Pertanyaan ini mungkin sudah lama, tetapi bagi siapa pun di masa depan yang menginginkan cara sederhana untuk mencapai efek bayangan kompleks, lihat perpustakaan saya di sini https://github.com/BluRe-CN/ComplexView

Menggunakan pustaka, Anda dapat mengubah warna bayangan, mengubah tepi, dan banyak lagi. Berikut adalah contoh untuk mencapai apa yang Anda cari.

<com.blure.complexview.ComplexView
        android:layout_width="400dp"
        android:layout_height="600dp"
        app:radius="10dp"
        app:shadow="true"
        app:shadowSpread="2">

        <com.blure.complexview.ComplexView
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            app:color="#fdfcfc"
            app:radius="10dp" />
    </com.blure.complexview.ComplexView>

Untuk mengubah warna bayangan, gunakan app: shadowColor = "kode warna Anda".


1

gunakan bentuk ini sebagai latar belakang:

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

    <item android:drawable="@android:drawable/dialog_holo_light_frame"/>

    <item>
        <shape android:shape="rectangle">
            <corners android:radius="1dp" />
            <solid android:color="@color/gray_200" />
        </shape>
    </item>

</layer-list>
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.