วิธีการวาดเส้นขอบในด้านเดียวของเค้าโครงเชิงเส้น?


186

ฉันสามารถวาดเส้นขอบเป็นเลย์เอาต์แบบเส้นตรงได้ แต่มันถูกวาดขึ้นทุกด้าน ฉันต้องการ จำกัด เฉพาะด้านขวาเท่านั้นเช่นคุณใน CSS (เส้นขอบขวา: 1px solid red;)

ฉันเคยลองมาแล้ว แต่มันก็ยังดึงดูดทุกด้าน:

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
<item>
    <shape android:shape="rectangle" >
        <stroke
            android:height="2dp"
            android:width="2dp"
            android:color="#FF0000" />

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

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

        <corners
            android:bottomLeftRadius="0dp"
            android:bottomRightRadius="5dp"
            android:radius="1dp"
            android:topLeftRadius="5dp"
            android:topRightRadius="0dp" />
    </shape>
</item>

มีข้อเสนอแนะเกี่ยวกับวิธีการทำสิ่งนี้ให้สำเร็จหรือไม่?

BTW ฉันไม่ต้องการใช้แฮ็คในการวางมุมมองของความกว้าง 1dp ในด้านที่ต้องการ


คุณสามารถใช้ drawableLeft ในเค้าโครงของคุณได้
njzk2

คำตอบ:


359

คุณสามารถใช้สิ่งนี้เพื่อทำขอบด้านหนึ่ง

<?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="#FF0000" />
    </shape>
</item>
<item android:left="5dp">
    <shape android:shape="rectangle">
        <solid android:color="#000000" />
    </shape>
</item>
</layer-list>

แก้ไข

เนื่องจากหลายคนรวมถึงฉันต้องการที่จะมีเส้นขอบด้านหนึ่งที่มีพื้นหลังโปร่งใสฉันได้ใช้BorderDrawableเส้นขอบที่มีขนาดและสีที่แตกต่างกันในแบบเดียวกับที่เราใช้ css แต่ไม่สามารถใช้งานผ่าน xml ได้ สำหรับการสนับสนุน XML ฉันได้เพิ่มBorderFrameLayoutโครงร่างที่สามารถห่อของคุณ

ดูGitHubของฉันสำหรับแหล่งที่สมบูรณ์


5
ถ้าคุณต้องการสีอัลฟาที่มีเส้นขอบด้านล่างล่ะ ฉันคิดว่าจะแก้ปัญหาด้วย Android API XML ของ Android Drawable แต่ฉันไม่สามารถเข้าใจได้
Mario Lenci

สิ่งนี้ไม่ได้ผลสำหรับฉัน - สิ่งที่ตรงกันข้ามที่ฉันต้องการมีสีเข้มกว่าภายในมีการไล่ระดับสีเทาที่ฉันซ้อนทับสำหรับผู้โดยสาร รับความคิดเกี่ยวกับการทำรูปสี่เหลี่ยมผืนผ้าที่วาดได้ในขนาดที่แน่นอน ดูเหมือนจะไม่คล่องตัวเท่านี้
jbenowitz

@jbenowitz: ลำดับของรายการในรายการเลเยอร์สำคัญกว่า หากคุณกลับรายการคุณจะได้รับผลลัพธ์เหล่านั้น
Vivek Khandelwal

ฉันได้รับการแก้ไขโดยการเพิ่มสีเส้นขอบจังหวะและรูปร่างที่เหลือสีปุ่ม นั่นเป็นการหลอกลวง
jbenowitz

242

ง่ายเหมือนพายทำให้ bg โปร่งใส:

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle">
    <gradient
        android:angle="0"
        android:startColor="#f00"
        android:centerColor="@android:color/transparent"
        android:centerX="0.01" />
</shape>

เปลี่ยนมุมเพื่อเปลี่ยนตำแหน่งเส้นขอบ:

  • 0 = เหลือ
  • 90 = ด้านล่าง
  • 180 = ขวา
  • 270 = ด้านบน

19
นี่คือคำตอบที่ดีที่สุดโดยที่นี่แย่เกินไปที่จะไม่
อัปเดต

11
ดีมาก แต่ฉันจะไม่อธิบายอย่างแน่นอนว่า "ง่ายเหมือนพาย"
funkybro

7
วิธีนี้ใช้ไม่ได้หากคุณต้องการเส้นขอบที่หนาขึ้นหรือหากคุณต้องการเส้นขอบหลายด้าน
หลักการโฮโลแกรม

1
@codeman - ใช้สิ่งนี้เป็นพื้นหลังในมุมมองของคุณจากนั้นมันจะสืบทอดความสูงของมัน
Breed Oded

2
วิธีปรับความกว้างของเส้นขีดหรือเส้นขอบ
Ruturaj Patil

101

นอกจากนี้ยังเป็นไปได้ที่จะใช้สิ่งที่คุณต้องการโดยใช้เลเยอร์เดียว

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

    <item
        android:bottom="-5dp"
        android:right="-5dp"
        android:top="-5dp">
        <shape android:shape="rectangle" >
            <solid android:color="@color/color_of_the_background" />

            <stroke
                android:width="5dp"
                android:color="@color/color_of_the_border" />
        </shape>
    </item>

</layer-list>

วิธีนี้เท่านั้นที่ขอบด้านซ้ายจะมองเห็น แต่คุณสามารถบรรลุรวมกันใด ๆ ที่คุณต้องการด้วยการเล่นกับbottom, left, rightและtopแอตทริบิวต์ของitemองค์ประกอบ


3
สิ่งนี้มีประโยชน์แน่นอนเมื่อคุณมีสีพื้นหลังอื่นและคุณต้องการวางซ้อน bg ที่วาดได้นี้ด้วยเส้นขอบ (y)
Aung Pyae

3
สิ่งที่ฉันต้องการจริงๆ แต่ถูกต้องหรือไม่ที่จะใช้ช่องว่างภายในเชิงลบ
IlyaEremin

1
นี่คือทางออกที่ดีที่สุด ฉันรบกวนสิ่งที่ -5dp ทำที่นั่น
Amit Kumar

1
การเว้นว่างเชิงลบเป็นเรื่องปกติใน HTML / CSS มันแค่ผลักสิ่งต่าง ๆ ไปในทิศทางอื่น จากประสบการณ์ของฉันดูเหมือนว่าใช้ได้อย่างสมบูรณ์ใน Android เช่นกัน
spaaarky21

การใช้งานโดยใช้ระยะขอบลบไม่ทำงานหากเค้าโครงของคุณมี clipChildren = false หรือ clipToPadding = false หากเป็นกรณีนี้คุณสามารถใช้วิธีแก้ปัญหาที่มีสองรูปสี่เหลี่ยมผืนผ้าที่ทับซ้อนกันเช่นที่เสนอโดย Vivek Khandelwal
Jesús Barrera

80

ในการรับเส้นขอบที่ด้านใดด้านหนึ่งของ drawable ให้ใช้ค่าลบinsetกับอีก 3 ด้าน (ทำให้เส้นขอบเหล่านั้นถูกดึงออกจากหน้าจอ)

<?xml version="1.0" encoding="utf-8"?>
<inset xmlns:android="http://schemas.android.com/apk/res/android"
    android:insetTop="-2dp" 
    android:insetBottom="-2dp"
    android:insetLeft="-2dp">

    <shape android:shape="rectangle">
        <stroke android:width="2dp" android:color="#FF0000" />
        <solid android:color="#000000" />
    </shape>

</inset>

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

วิธีการนี้จะคล้ายกับคำตอบ naykah layer-listแต่โดยไม่ต้องใช้ที่


4
นี่คือคำตอบที่ดีที่สุด IMO
James

คำตอบที่ดีมากฉันแค่ต้องเปลี่ยนความกว้างและใส่ 10dp :) และยิ่งกว่านั้นฉันต้องการเส้นขอบด้านซ้ายดังนั้นฉันจึงเปลี่ยน android: insetLeft เป็น android: insetRight ง่ายมาก! คลิกปุ่มเก็บวัสดุ: D
Phuong

สิ่งที่ฉันต้องการเปลี่ยนinsertXที่ด้านบนสุดเพื่อตัดสินใจว่าจะแสดงเส้นขอบอะไรและไม่ควรทำ
CularBytes

ฉันยังสามารถมีสีทึบของ @null แล้ววิธีนี้ทำให้ไม่มีการเบิกเกิน อัจฉริยภาพ ขอบคุณ!
ทราบ

2
ข้อควรสนใจ: สิ่งนี้จะเปลี่ยนเนื้อหาในมุมมองของคุณและจะปรับขนาดด้วย ใช้ด้วยความระมัดระวัง
vovahost

7

เป็นอีกทางเลือกหนึ่ง (หากคุณไม่ต้องการใช้พื้นหลัง) คุณสามารถทำได้โดยทำมุมมองดังนี้:

<View
    android:layout_width="2dp"
    android:layout_height="match_parent"
    android:background="#000000" />

สำหรับการมีเส้นขอบด้านขวาเท่านั้นให้วางสิ่งนี้ไว้หลังการจัดวาง (ที่คุณต้องการให้มีเส้นขอบ):

<View
    android:layout_width="2dp"
    android:layout_height="match_parent"
    android:background="#000000" />

สำหรับการมีเส้นขอบด้านซ้ายเท่านั้นให้วางสิ่งนี้ไว้ข้างหน้าโครงร่าง (ที่คุณต้องการมีเส้นขอบ):

ทำงานให้ฉัน ... หวังว่ามันจะช่วยได้บ้าง


6

ฉันสามารถบรรลุผลด้วยรหัสต่อไปนี้

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
    <item android:left="0dp" android:right="-5dp" android:top="-5dp" android:bottom="-5dp">
        <shape
        android:shape="rectangle">
            <stroke android:width="1dp" android:color="#123456" />
        </shape>
    </item>
</layer-list>

คุณสามารถปรับตำแหน่งที่ต้องการสำหรับตำแหน่งชายแดนได้โดยเปลี่ยนทิศทางการเคลื่อนที่


5
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_pressed="true" >
        <shape>
            <solid
                android:color="#f28b24" />
            <stroke
                android:width="1dp"
                android:color="#f28b24" />
            <corners
                android:radius="0dp"/>
            <padding
                android:left="0dp"
                android:top="0dp"
                android:right="0dp"
                android:bottom="0dp" />
        </shape>
    </item>
    <item>
        <shape>
            <gradient
                android:startColor="#f28b24"
                android:endColor="#f28b24"
                android:angle="270" />
            <stroke
                android:width="0dp"
                android:color="#f28b24" />
            <corners
                android:bottomLeftRadius="8dp"
                android:bottomRightRadius="0dp"
                android:topLeftRadius="0dp"
                android:topRightRadius="0dp"/>
            <padding
                android:left="10dp"
                android:top="10dp"
                android:right="10dp"
                android:bottom="10dp" />
        </shape>
    </item>
</selector>

5

อีกตัวอย่างที่ยอดเยี่ยม ตัวอย่าง

<?xml version="1.0" encoding="UTF-8" standalone="no"?> 
<inset xmlns:android="http://schemas.android.com/apk/res/android"
     android:insetRight="-2dp">

     <shape android:shape="rectangle">
         <corners
             android:bottomLeftRadius="4dp"
             android:bottomRightRadius="0dp"
             android:topLeftRadius="4dp"
             android:topRightRadius="0dp" />
         <stroke
             android:width="1dp"
             android:color="@color/nasty_green" />
         <solid android:color="@android:color/transparent" />
     </shape>

</inset>

2

ไม่มีการพูดถึงไฟล์เก้าแพทช์ที่นี่ ใช่คุณต้องสร้างไฟล์อย่างไรก็ตามมันค่อนข้างง่ายและเป็นโซลูชัน" ข้ามเวอร์ชันและสนับสนุนความโปร่งใส " จริงๆ หากไฟล์ถูกวางไว้ในdrawable-nodpiไดเรกทอรีไฟล์นั้นจะทำงานได้pxตามปกติและจะอยู่ในรูปแบบdrawable-mdpiประมาณฐาน dp (ขอบคุณสำหรับการสุ่มตัวอย่าง)

ไฟล์ตัวอย่างสำหรับคำถามเดิม ( เส้นขอบขวา: 1px solid red; ) อยู่ที่นี่:

http://ge.tt/517ZIFC2/v/3?c

เพียงวางไว้ในdrawable-nodpiไดเรกทอรี


2

เส้นขอบของสีที่ต่างกัน ฉันใช้ 3 รายการ

<?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="@color/colorAccent" />
        </shape>
    </item>
    <item android:top="3dp">
        <shape android:shape="rectangle">
            <solid android:color="@color/light_grey" />
        </shape>
    </item>
    <item
        android:bottom="1dp"
        android:left="1dp"
        android:right="1dp"
        android:top="3dp">
        <shape android:shape="rectangle">
            <solid android:color="@color/colorPrimary" />
        </shape>
    </item>
</layer-list>
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.