LinearLayout ของ Android: เพิ่มเส้นขอบด้วยเงารอบ ๆ LinearLayout


147

ฉันต้องการสร้างเส้นขอบเดียวกันของ LinearLayout นี้เป็นตัวอย่าง:

ป้อนคำอธิบายรูปภาพที่นี่

ในตัวอย่างนี้เราจะเห็นว่าเส้นขอบนั้นไม่เหมือนกันทั่ว linearLayout ฉันจะสร้างสิ่งนี้โดยใช้ไฟล์ XML ที่สามารถวาดได้ได้อย่างไร

สำหรับตอนนี้ฉันสามารถสร้างเส้นขอบอย่างง่าย ๆ ทั่ว LinearLayout ดังนี้:

<?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
คุณสามารถใช้backgroundคุณสมบัติสำหรับสิ่งนั้นได้ ... สร้างไฟล์ XML หนึ่งไฟล์ที่มีรูปร่างเช่นสี่เหลี่ยมสีและเอฟเฟกต์เงาสำหรับมันและตั้งเป็นพื้นหลังสำหรับเลย์เอาต์เชิงเส้นของคุณ ..
Pragnesh Ghoda シ

ใช้เส้นขีดสำหรับขอบสีเทาและขอบ
แพ็ดดิ้ง

ฉันคิดว่ามันมีสองเลย์เอาต์ xml บอกว่าหนึ่งคือเลย์เอาต์แบบเชิงเส้นและด้านในเป็นเลย์เอาต์แบบสัมพัทธ์ที่มีช่องว่างภายใน
Giru Bhai

@ Prag's คุณช่วยฉันสร้างไฟล์ xml นี้ได้มั้ย
wawanopoulos

1
อีกทางเลือกหนึ่งอาจใช้อิมเมจแพทช์ 9 เป็นพื้นหลังสำหรับเลย์เอาต์ สิ่งนี้จะช่วยให้เงาที่ซีดจางและซีดจาง (ในความคิดของฉัน)
Phantômaxx

คำตอบ:


257

ลองนี้ ..

<?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 ขอบคุณมาก! ฉันลองใช้รหัสของคุณแล้วดูเหมือนว่าจะโอเค แต่มีสิ่งหนึ่งที่ต้องทำยังไงฉันจะเพิ่มเส้นขอบบาง ๆ (1dp) ทางซ้ายและทางขวาของ linearlayout ได้อย่างไร (ตามตัวอย่าง)
wawanopoulos

2
@wawanopoulos เพียงแทนที่"0dp"ด้วย"1dp"ในคำตอบของ Hariharan
Phantômaxx

คุณสามารถเพิ่ม #EAEAEA สีให้กับเลย์เอาต์หลักดังนั้นมันจะเหมือนกับภาพคำถาม
Samad

3
ฉันขอแนะนำสำหรับสิ่งนี้คุณสามารถใช้<gradient>ในของคุณ<shape>เพื่อเพิ่มเอฟเฟกต์เส้นขอบและถ้าเป็นเอฟเฟกต์ที่ UI ของคุณต้องการจริงๆแทนที่จะเป็นแค่ขอบสีทึบ
patrickjason91

ตรวจสอบให้แน่ใจว่าคุณมีเลย์เอาต์ด้านในที่มี match_parent แล้วให้มาร์จิ้น 1 ถึงเลย์เอาต์ด้านใน
Shaktisinh Jadeja

82

นั่นเป็นเหตุผลที่ CardView มีอยู่จริง CardView | นักพัฒนา Android
เป็นเพียง 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>

ในการใช้สิ่งนี้คุณต้องเพิ่มการพึ่งพาbuild.gradle:

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

จะเปลี่ยนสีเงาได้อย่างไร
Aditay Kaushal

เงาจะอ่อนแอมากstackoverflow.com/questions/49076188/...
user924

1
พฤติกรรมที่แปลกมากในอุปกรณ์ที่มี 4.4.4 (หรือคล้ายกัน) ระยะขอบขนาดใหญ่ถูกเพิ่มเข้ามาใน cardview และทำให้ UI น่าเกลียดมาก
Morteza Rastgoo

นี่ควรเป็นคำตอบที่ยอมรับได้ แม้ว่าจะมีการอัพเดทเล็กน้อย คุณควรใช้ androidx one -> androidx.cardview.widget.CardView
bogdan

59

ฉันได้รับผลลัพธ์ที่ดูดีที่สุดโดยใช้กราฟิกปะ 9

คุณสามารถสร้างกราฟฟิคแพทช์ 9 ตัวโดยใช้โปรแกรมแก้ไขต่อไปนี้: http://inloop.github.io/shadow4android/

ตัวอย่าง:

กราฟิกแพทช์ 9:

กราฟิกแพทช์ 9:

ผลลัพธ์:

ป้อนคำอธิบายรูปภาพที่นี่

แหล่งที่มา:

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

1
ฉันจะซ่อนเส้นสีดำได้อย่างไร กรุณาช่วย
Isaac Darlong

@Isaac บันทึกภาพเป็น my_nine_patch.9.png (.9.png คือ 9 รูปอิมเมจ)
อรุณ

นี่คือสิ่งที่ดีที่สุด!
Numanqmr

35

โอเคฉันรู้ว่ามันสายเกินไปแล้ว แต่ฉันมีความต้องการเดียวกัน ฉันแก้ไขแบบนี้

1. ขั้นแรกสร้างไฟล์ xml (ตัวอย่าง: border_shadow.xml) ในโฟลเดอร์ "drawable" และคัดลอกรหัสด้านล่างลงไป

<?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. ทราบเกี่ยวกับเค้าโครงที่คุณต้องการเงา (ตัวอย่าง: LinearLayout) เพิ่มสิ่งนี้ใน android: พื้นหลัง

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

และนั่นก็ใช้ได้กับฉัน


20

มันง่ายมาก:

สร้างไฟล์ drawable ที่มีการไล่ระดับสีดังนี้:

สำหรับเงาใต้มุมมอง 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>

สำหรับเงาเหนือมุมมอง 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>

และอื่น ๆ สำหรับเงาด้านซ้ายและขวาเพียงแค่เปลี่ยนมุมของการไล่ระดับสี :)


ฉันจะโทรไปที่ พื้นหลังของมุมมอง?
Arthur Melo

1
สร้างไฟล์ด้านล่าง _shadow xml จากนั้นในมุมมองของคุณเพิ่ม "มุมมอง" ในเลย์เอาต์ของคุณและตั้งด้านล่าง _shadow.xml เป็นพื้นหลังของมุมมองนี้
Morteza Rastgoo

ฉันทำเช่นเดียวกับที่คุณบอก แต่ "above_shadow" ของฉันไม่โปร่งใสเมื่อฉันวางมุมมองนั้นในมุมมองที่กำหนดเอง มันทำงานได้ดีแยกกัน ฉันควรทำอย่างไรดี?
SoYoung

18

คุณอาจใช้อิมเมจแพทช์ 9 อันเป็นพื้นหลังสำหรับเลย์เอาต์ของคุณซึ่งจะทำให้มีเงา "เป็นธรรมชาติ" มากขึ้น:

ป้อนคำอธิบายรูปภาพที่นี่

ผลลัพธ์:

ป้อนคำอธิบายรูปภาพที่นี่

ใส่ภาพใน/res/drawableโฟลเดอร์ของคุณ
ตรวจสอบให้แน่ใจว่านามสกุลไฟล์.9.pngไม่ใช่.png

นี่คือการแก้ไข (ลดขนาดเป็นสี่เหลี่ยมจัตุรัสต่ำสุด) ของทรัพยากรที่มีอยู่ที่พบในโฟลเดอร์ทรัพยากร API 19 sdk
ฉันออกจากเครื่องหมายสีแดงเนื่องจากพวกเขาดูเหมือนจะไม่เป็นอันตรายดังที่แสดงในเครื่องมือ draw9patch

[แก้ไข]

ประมาณ 9 แพตช์ในกรณีที่คุณไม่เคยทำอะไรกับมัน

เพียงเพิ่มเป็นพื้นหลังของมุมมองของคุณ

พื้นที่ที่มีเครื่องหมายสีดำ (ซ้ายและด้านบน) จะยืดออก (แนวตั้งแนวนอน)
พื้นที่ที่มีเครื่องหมายสีดำ (ขวา, ด้านล่าง) กำหนด "พื้นที่เนื้อหา" (ซึ่งเป็นไปได้ที่จะเพิ่มข้อความหรือมุมมอง - คุณสามารถเรียก "ช่องว่างภายใน" ที่ไม่ได้ทำเครื่องหมายไว้ในพื้นที่ได้หากคุณต้องการ)

บทช่วยสอน: http://radleymarx.com/blog/simple-guide-to-9-patch/


1
เพียงเพิ่มเป็นพื้นหลังของมุมมองของคุณ พื้นที่ที่มีเครื่องหมายสีดำ (ซ้ายและด้านบน) จะยืดออก (แนวตั้งแนวนอน) พื้นที่ที่มีเครื่องหมายสีดำ (ขวา, ด้านล่าง) กำหนด "พื้นที่เนื้อหา" (ซึ่งเป็นไปได้ที่จะเพิ่มข้อความหรือมุมมอง - เรียกว่า "ช่องว่างภายใน" หากคุณต้องการ) บทช่วยสอน: radleymarx.com/blog/simple-guide-to-9-patch
Phantômaxx

9

คุณสร้างไฟล์. xml โดยวาดได้ด้วยชื่อ drop_shadow.xml:

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

แล้ว:

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

3

ใช้บรรทัดเดียวนี้และหวังว่าคุณจะได้ผลลัพธ์ที่ดีที่สุด

การใช้งาน: android:elevation="3dp" ปรับขนาดมากที่สุดเท่าที่คุณต้องการและนี่คือวิธีที่ดีที่สุดและง่ายที่สุดในการทำให้เกิดเงาเช่นปุ่มและเงาหุ่นยนต์เริ่มต้นอื่น ๆ แจ้งให้เราทราบหากใช้งานได้!


@ MichałZiobroใช้กับเลย์เอาต์ของคุณเช่นถ้าคุณมีเลย์เอาต์ที่มีขนาดเล็กกว่าและคุณต้องการแสดงเงา มันควรจะทำงาน คุณอาจพบว่าข้อความและปุ่มของคุณจะมองไม่เห็น แต่เมื่อคุณเรียกใช้แอพคุณจะเห็นเงาที่ดีที่สุด ฉันไม่แน่ใจว่าเป็นข้อบกพร่องบางอย่างหรือบางอย่าง แต่ในกรณีของฉันเมื่อฉันใช้รหัสนั้นจะทำให้ Views ทั้งหมดของฉันไม่ปรากฏในภาพตัวอย่าง AS แต่ทำงานได้ดีที่สุดในแอพเมื่อฉันดีบัก / เปิดใช้งานในอุปกรณ์ของฉัน แจ้งให้เราทราบว่ามันใช้งานได้หรือไม่ ขอบคุณ
Tamim

3

หากคุณมีเส้นขอบจากรูปร่างแล้วให้เพิ่มระดับความสูง:

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

2
API บน <21 คืออะไร
CoolMind

1
น่าเสียดายที่มันใช้งานไม่ได้กับ Lollipop ดังนั้นคุณควรใช้คำตอบอื่น ๆ จากคำถามนี้ แต่ถ้าคุณกำลังกำหนดเป้าหมายโทรศัพท์รุ่นใหม่นี่เป็นวิธีที่ง่ายมากที่จะใช้งานได้ดี
Krzynool

2

1. ขั้นแรกสร้างชื่อไฟล์ xml shadow.xml ในโฟลเดอร์ "drawable" และคัดลอกโค้ดด้านล่างลงไป

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

จากนั้นเพิ่มเลเยอร์รายการเป็นพื้นหลังใน LinearLayout ของคุณ

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

ขอบคุณมากรหัสของคุณก็โอเค ...
John dahat

1
@Johndahat ไม่เป็นไร
Sudhir singh

1

Ya Mahdi aj --- สำหรับญาติเลย์เอาต์

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

1

ฉันรู้ว่ามันสายไปแล้ว แต่มันก็ช่วยใครซักคนได้

คุณสามารถใช้ constraintLayout และเพิ่มคุณสมบัติต่อไปนี้ใน xml

        android:elevation="4dp"

0

ฉันพบวิธีที่ดีที่สุดในการแก้ไขปัญหานี้

  1. คุณต้องตั้งค่าพื้นหลังสี่เหลี่ยมผืนผ้าทึบบนเค้าโครง

  2. ใช้รหัสนี้ - ViewCompat.setElevation(view , value)

  3. ในชุดรูปแบบผู้ปกครอง android:clipToPadding="false"


2
ในกรณีที่คุณไม่ได้รู้ว่านี่คือการดำเนินการปัจจุบันของViewCompat.setElevation()วิธีการในระดับ public void setElevation(View view, float elevation) {}ViewCompat: อย่างที่คุณเห็นมันไม่ได้ถูกนำไปใช้ ฉันสงสัยจริงๆว่ามันจะเป็นการช่วยเหลือใด ๆ และสงสัยจริงๆว่าถ้าคุณทดสอบคำตอบของคุณจริงๆแล้วฮ่า ๆ ๆ
mradzinski
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.