Android - drawable ที่มีมุมโค้งมนที่ด้านบนเท่านั้น


151

ฉันวาดภาพนี้ให้สี่เหลี่ยมมุมฉากเป็นพื้นหลังได้:

<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <solid android:color="@color/white" />
    <stroke android:width="1dp" android:color="@color/light_gray" />
    <padding android:left="10dp" android:top="10dp" android:right="10dp" android:bottom="10dp" />
    <corners android:radius="6dp" />
</shape>

ทำงานได้ดีตามที่คาดไว้

ตอนนี้ฉันต้องการเปลี่ยนสิ่งนี้ให้ปัดเฉพาะมุมบนสุดเท่านั้นดังนั้นฉันจึงเปลี่ยนเป็น:

<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <solid android:color="@color/white" />
    <stroke android:width="1dp" android:color="@color/light_gray" />
    <padding android:left="10dp" android:top="10dp" android:right="10dp" android:bottom="10dp" />
    <corners android:topLeftRadius="6dp" android:topRightRadius="6dp"
             android:bottomLeftRadius="0dp" android:bottomRightRadius="0dp"/>
</shape>

แต่ตอนนี้ไม่มีมุมใดมนและฉันได้รูปสี่เหลี่ยมผืนผ้าธรรมดา ฉันหายไปนี่อะไร


นี่ไม่ใช่วิธีแก้ปัญหา แต่ฉันคิดว่าฉันเคยมีปัญหาที่คล้ายกัน การเพิ่มสโต๊คเป็น 2 พิกเซลช่วย แต่คุณก็รู้นั่นไม่ใช่วิธีแก้ปัญหา
Code Poet

นี่คือปัญหาเกี่ยวกับมุมรูปร่าง: code.google.com/p/android/issues/detail?id=939
Knickedi

คำตอบ:


304

ลองให้ค่าเหล่านี้:

 <corners android:topLeftRadius="6dp" android:topRightRadius="6dp"
         android:bottomLeftRadius="0.1dp" android:bottomRightRadius="0.1dp"/>

โปรดทราบว่าฉันมีการเปลี่ยนแปลงไป0dp0.1dp

แก้ไข: ดูความคิดเห็นAleks G ด้านล่างสำหรับรุ่นที่สะอาดกว่า


131
การสำรวจเพิ่มเติมในครั้งนี้ฉันพบวิธีแก้ปัญหาที่ดียิ่งขึ้น: <corners android:radius="1dp" android:topLeftRadius="6dp" android:topRightRadius="6dp" android:bottomLeftRadius="0dp" android:bottomRightRadius="0dp"/>- ทำให้เกิดมุมล่างที่สมบูรณ์แบบโดยไม่ต้องปัดเศษ อย่างไรก็ตามโซลูชันของคุณใช้งานได้ดีมาก
Aleks G

วิธีทำในรหัสให้บิตแมป? และวิธีเพิ่มเค้าร่าง (จังหวะ AKA) รอบ ๆ ?
นักพัฒนา android

@Aleks G ฉันไม่เห็นว่าจำเป็นต้องระบุandroid:radius="1dp"
hmac

@hmac มันเป็นสิ่งที่จำเป็น อ่านเอกสารมันทำให้ชัดเจน
Aleks G

@AleksG ใช่เอกสารผิดการทดสอบ Samsung 10, Android 9: "ทุกมุมจะต้อง (เริ่มแรก) จะต้องมีรัศมีมุมมากกว่า 1 หรือมิฉะนั้นจะไม่มีการปัดเศษมุมถ้าคุณต้องการให้มุมที่ไม่ถูกปัดเศษ a การทำงานรอบ ๆ คือการใช้ Android: รัศมีเพื่อตั้งค่ารัศมีมุมเริ่มต้นที่มากกว่า 1 แต่แล้วแทนที่ "- ไม่จริงฉันระบุด้านล่างขวา, ขวาบน, ซ้ายบนเป็นศูนย์และซ้ายล่าง + ve และล่างซ้ายโค้งถูกต้อง
hmac

14

ลองทำสิ่งนี้:

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:bottom="-20dp" android:left="-20dp">
        <shape android:shape="rectangle">
            <solid android:color="@color/white" />

            <corners android:radius="20dp" />
        </shape>
    </item>
</layer-list>

ดูเหมือนว่าไม่เหมาะที่จะตั้งค่ารัศมีมุมที่แตกต่างของสี่เหลี่ยมผืนผ้า ดังนั้นคุณสามารถใช้แฮ็คนี้


ดูคำตอบของฉัน - เป็นที่ยอมรับได้อย่างสมบูรณ์ว่ามีรัศมีที่แตกต่างกันสำหรับมุมที่ต่างกัน
Aleks G

ฉันลองวิธีนี้เป็นที่ยอมรับไม่ได้ IDE บอกว่ามันไม่เหมาะสมที่จะมี rsdius ที่แตกต่างกันและไม่สนใจมัน
busylee

11

ในกรณีของฉันด้านล่างรหัส

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

        <shape android:shape="rectangle">
            <solid android:color="@color/maincolor" />

            <corners
                android:topLeftRadius="10dp"
                android:topRightRadius="10dp"
                android:bottomLeftRadius="0dp"
                android:bottomRightRadius="0dp"
            />
        </shape>

    </item>
    </layer-list>

1
คุณสมบัติด้านบนและด้านล่างของรายการไม่จำเป็นต้องใช้เว้นแต่คุณต้องการแพ็ดดิ้งในมุมมอง แต่ไม่เช่นนั้นจะใช้งานได้
RominaV

9

สร้างเมื่อคำตอบของ busyleeนี้เป็นวิธีที่คุณสามารถทำ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="@color/white" />
            <!-- A numeric value is specified in "radius" for demonstrative purposes only,
                  it should be @dimen/val_name -->
            <corners android:radius="10dp" />
        </shape>
    </item>
    <!-- To keep the TOP-LEFT corner UNROUNDED set both OPPOSITE offsets (bottom+right): -->
    <item
        android:bottom="10dp"
        android:right="10dp">
        <shape android:shape="rectangle">
            <solid android:color="@color/white" />
        </shape>
    </item>
</layer-list>

โปรดทราบว่าข้างต้นdrawableจะไม่ได้แสดงให้เห็นอย่างถูกต้องในการแสดงตัวอย่างของ Android สตูดิโอ (2.0.0p7) android:background="@drawable/..."หากต้องการดูตัวอย่างมันต่อไปสร้างมุมมองอื่นและใช้สิ่งนี้เป็น


6
@AleksG - แน่นอน มันเกี่ยวข้องกันวันนี้เหมือนเดิม (เป็นหลักฐาน - ฉันต้องการอะไรแบบนั้น) คุณต้องรู้ว่าในช่วงหลายปีที่ผ่านมาบางสิ่งบางอย่างกลายเป็นสิ่งที่เลิกใช้แล้วและอาจจำเป็นต้องถูกแทนที่ด้วยสิ่งที่ทันสมัยกว่า ตามที่กล่าวถึงbusylee IDE จะบ่นเมื่อกำหนดรัศมีมุมที่แตกต่างซึ่งไม่ใช่กรณีด้วยวิธีการปัจจุบัน ยิ่งกว่านั้นเนื่องจากคำถามนี้เป็นคำถามแรกที่ฉันพบใน Google (iirc) ฉันจึงควรอัปเดต ทั้งนี้ผมมั่นใจว่าดังนั้นจะไม่คิดอีกไม่กี่ KB รหัส ... :)
Dev-iL

2

ฉันลองใช้รหัสของคุณและมีปุ่มมุมโค้งมนด้านบน ผมให้สีเป็นและโรคหลอดเลือดสมองผมให้@ffffff#C0C0C0

ลอง

  1. การให้ android: bottomLeftRadius = "0.1dp" แทนที่จะเป็น 0 หากไม่ได้ผล
  2. ตรวจสอบสิ่งที่ drawable และความละเอียดของโปรแกรมจำลอง ฉันสร้างโฟลเดอร์ drawable ภายใต้ res และใช้มัน (hdpi, mdpi ldpi) โฟลเดอร์ที่คุณมี XML นี้ นี่คือผลลัพธ์ของฉัน

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


นี่เป็นรุ่น android อะไร? แอปของฉันต้องทำงานบน 1.6 - และตัวจำลอง 1.6 มีปัญหา
Aleks G

1

คุณอาจต้องอ่านhttps://developer.android.com/guide/topics/resources/drawable-resource.html#Shapeนี้

และด้านล่างมีหมายเหตุ

หมายเหตุทุก ๆ มุม (ในตอนแรก) จะต้องได้รับรัศมีมุมที่มากกว่า 1 หรือมิฉะนั้นจะไม่มีการปัดเศษมุม หากคุณต้องการให้มุมที่ไม่ถูกปัดเศษการแก้ไขคือการใช้ android: radius เพื่อตั้งค่ารัศมีมุมเริ่มต้นที่มากกว่า 1 แต่จากนั้นแทนที่แต่ละมุมด้วยค่าที่คุณต้องการโดยให้เป็นศูนย์ ("0dp" ) ที่คุณไม่ต้องการมุมโค้งมน


1

สร้าง roung_top_corners.xml บน drawable และคัดลอกโค้ดด้านล่าง

<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle" >
<corners
    android:topLeftRadius="22dp"
    android:topRightRadius="22dp"
    android:bottomLeftRadius="0dp"
    android:bottomRightRadius="0dp"
    />
<gradient
    android:angle="180"
    android:startColor="#1d2b32"
    android:centerColor="#465059"
    android:endColor="#687079"
    android:type="linear" />
<padding
    android:left="0dp"
    android:top="0dp"
    android:right="0dp"
    android:bottom="0dp"
    />
<size
    android:width="270dp"
    android:height="60dp"
    /></shape>
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.