วิธีสร้างรูปร่างด้วยมุมมนด้านซ้ายบนและมุมมนด้านซ้ายล่าง?


84

ฉันต้องการสร้างรูปร่างโดยมีมุมมนด้านซ้ายบนและมุมมนซ้ายล่าง:

<?xml version="1.0" encoding="UTF-8"?> 
<shape xmlns:android="http://schemas.android.com/apk/res/android"> 
    <solid android:color="#555555"/>    

    <stroke android:width="3dp"
            android:color="#555555"
            />

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

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

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

คำตอบ:


62

ดูเหมือนว่าข้อผิดพลาดhttp://code.google.com/p/android/issues/detail?id=939

ในที่สุดฉันก็ต้องเขียนสิ่งนี้:

 <stroke android:width="3dp"
         android:color="#555555"
         />

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

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

ฉันต้องระบุ android: bottomRightRadius = "2dp" สำหรับมุมมนด้านซ้ายล่าง (ข้อบกพร่องอื่นที่นี่)


1
ใช่ฉันสามารถยืนยันคำสั่ง / ข้อบกพร่องล่าสุดของคุณว่ามีการสลับไปทางซ้าย / ขวาที่นั่น ฉันพบสิ่งเดียวกันนี้ในแอปของฉันเช่นกัน (sdk 2.1) คุณได้ยื่นรายงานข้อบกพร่องบน b.android.com แล้วหรือได้รับรายงานไปแล้ว?
Mathias Conradt

3
ฉันเพียงแค่ยื่นข้อผิดพลาดcode.google.com/p/android/issues/detail?id=9161 สิ่งที่น่าเศร้าคือหลังจากที่พวกเขาแก้ไขข้อผิดพลาดฉันต้องเปลี่ยนรหัสอีกครั้ง :(
user256239

58

ในขณะที่คำถามนี้ได้รับคำตอบแล้ว (เป็นข้อผิดพลาดที่ทำให้ bottomLeftRadius และ bottomRightRadius ถูกย้อนกลับ) ข้อผิดพลาดได้รับการแก้ไขใน Android 3.1 (api ระดับ 12 - ทดสอบบนโปรแกรมจำลอง)

ดังนั้นเพื่อให้แน่ใจว่า drawables ของคุณดูถูกต้องในทุกแพลตฟอร์มคุณควรใส่เวอร์ชัน "แก้ไข" ของ drawables (เช่นที่รัศมีล่างซ้าย / ขวาถูกต้องใน xml) ในโฟลเดอร์ res / drawable-v12 ของแอปของคุณ วิธีนี้อุปกรณ์ทั้งหมดที่ใช้ Android เวอร์ชัน> = 12 จะใช้ไฟล์ที่วาดได้ที่ถูกต้องในขณะที่อุปกรณ์ที่ใช้ Android เวอร์ชันเก่าจะใช้ drawables "วิธีแก้ปัญหา" ที่อยู่ในโฟลเดอร์ res / drawables


4
อีกทางเลือกหนึ่งคือการใช้values/dimens.xmlไฟล์เริ่มต้นที่มีค่า bottom_left และ bottom_right แบบกลับด้านและvalues-v12/dimens.xmlไฟล์ใหม่ที่มีค่าที่ถูกต้อง ด้วยวิธีนี้คุณสามารถเก็บไฟล์ XML ที่วาดได้เพียงเวอร์ชันเดียวและมีการสลับเฉพาะค่า dimen ตามเวอร์ชัน API
โจ

35

จากเอกสารประกอบ :

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

เช่นคุณต้องตั้งค่าandroid:radius="<bigger than 1dp>"ให้สามารถทำสิ่งที่คุณต้องการ:

<corners 
    android:radius="2dp"
    android:bottomRightRadius="0dp" 
    android:topRightRadius="0dp"/> 

14

คุณยังสามารถใช้ตัวเลขที่เล็กมากสำหรับรัศมีของคุณ

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

นั่นเป็นครั้งแรกที่ฉันลอง ... แต่ไม่มีความหวัง .... ฉันกำลังทดสอบบน Android 2.2 ... ความคิดอื่น ๆ ... ขอบคุณ
Aamir Shah

12

สำหรับคนอื่น ๆ มีวิธีแก้ปัญหาสำหรับระดับ API ใด ๆ คุณสามารถวางรายการไว้ด้านบนของกันและกันตัวอย่าง:

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

<!-- my firt item with 4 corners radius(8dp)
 -->
    <item>
        <shape>
            <solid
                android:angle="270.0"
                android:color="#3D689A" />

            <corners android:topLeftRadius="8dp" />
        </shape>
    </item>
<!-- my second item is on top right for a fake corner radius(0dp)
 -->
    <item
        android:bottom="30dp"
        android:left="50dp">
        <shape>
            <solid android:color="#5C83AF" />
        </shape>
    </item>
<!-- my third item is on bottom left for a fake corner radius(0dp)
 -->
    <item
        android:right="50dp"
        android:top="30dp">
        <shape>
            <solid android:color="#5C83AF" />
        </shape>
    </item>

</layer-list>

ผลลัพธ์ที่มีสีอ่อนเพื่อแสดงให้คุณเห็นสามรายการ:

ใส่คำอธิบายภาพที่นี่

ผลลัพธ์สุดท้าย:

ใส่คำอธิบายภาพที่นี่

ขอแสดงความนับถืออย่างสูง.


8

ข้อผิดพลาดนี้จะยื่นที่นี่ นี่เป็นข้อบกพร่องของอุปกรณ์ Android ที่มีระดับ API น้อยกว่า 12 คุณต้องวางเค้าโครงเวอร์ชันที่ถูกต้องในโฟลเดอร์ drawable-v12 ซึ่งจะใช้สำหรับ API ระดับ 12 หรือสูงกว่า และเวอร์ชันที่ผิดพลาด (เปลี่ยนมุม / ย้อนกลับ) ของเลย์เอาต์เดียวกันจะถูกใส่ไว้ในโฟลเดอร์ที่วาดได้เริ่มต้นซึ่งจะใช้โดยอุปกรณ์ที่มีระดับ API น้อยกว่า 12

ตัวอย่างเช่นฉันต้องออกแบบปุ่มที่มีมุมโค้งมนที่ด้านล่างขวา

ในโฟลเดอร์ 'drawable' - button.xml:ฉันต้องทำให้มุมล่างซ้ายมน

<shape>
    <corners android:bottomLeftRadius="15dp"/>
</shape>

ในโฟลเดอร์ 'drawable-v12' - button.xml:รูปแบบที่ถูกต้องถูกวางไว้ที่นี่เพื่อใช้สำหรับ API ระดับ 12 หรือสูงกว่า

<shape>
    <corners android:bottomLeftRadius="15dp"/>
</shape>

7

ลองดู

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<solid android:color="@color/upkia"/>
<corners android:radius="10dp"
    android:topRightRadius="0dp"
    android:bottomRightRadius="0dp" />
</shape>
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.