ฉันจะตั้งค่ารัศมีมุมโค้งมนของสีที่วาดได้โดยใช้ xml ได้อย่างไร


108

ในเว็บไซต์ของ Android มีส่วนเกี่ยวกับสีที่วาดได้ การกำหนด drawables เหล่านี้ใน xml มีลักษณะดังนี้:

<resources>
    <drawable name="solid_red">#f00</drawable>
    <drawable name="solid_blue">#0000ff</drawable>
    <drawable name="solid_green">#f0f0</drawable>
</resources>

ใน java api มีวิธีการต่อไปนี้เพื่อกำหนดมุมโค้งมน:

setCornerRadius(float radius)

มีวิธีกำหนดมุมมนใน xml หรือไม่?


หากต้องการกำหนดมุมจากโค้ดโปรดดู (Gradient Drawables): stackoverflow.com/questions/8709595/…
samis

คำตอบ:


319

ใช้<shape>แท็กเพื่อสร้าง drawable ใน XML ที่มีมุมโค้งมน (คุณสามารถทำอย่างอื่นด้วยแท็กรูปร่างเช่นกำหนดการไล่ระดับสีได้เช่นกัน)

นี่คือสำเนาของไฟล์ XML ที่ฉันใช้ในหนึ่งในแอปของฉันเพื่อสร้างไฟล์ที่วาดได้โดยมีพื้นหลังสีขาวขอบดำและมุมโค้งมน:

<?xml version="1.0" encoding="UTF-8"?> 
<shape xmlns:android="http://schemas.android.com/apk/res/android"> 
    <solid android:color="#ffffffff"/>    
             
    <stroke android:width="3dp"
            android:color="#ff000000" />

    <padding android:left="1dp"
             android:top="1dp"
             android:right="1dp"
             android:bottom="1dp" /> 
             
    <corners android:radius="7dp" /> 
</shape>

1
จะบันทึกไฟล์นี้ได้ที่ไหนและจะรับในรหัส java ได้อย่างไรขอบคุณ
shyam

7
บันทึกเป็นไฟล์ xml ในไดเร็กทอรี drawable จากนั้นใช้เหมือนที่คุณใช้วาดได้ (ไอคอนหรือไฟล์ทรัพยากร) โดยใช้ชื่อทรัพยากร (R.drawable.your_xml_name)
Guillaume

30
ในกรณีนี้รัศมีทั้งหมดเหมือนกันดังนั้นคุณสามารถใช้ android: radius = "7dp"
จะครู

2
นอกจากนี้ตัวแสดงเค้าโครงใน Android Studio จะไม่สามารถแสดงผลได้หากคุณกำหนดรัศมีแยกจากกัน (แม้ว่าจะมีค่าเดียวกันก็ตาม) และจะแจ้งเตือนว่า "ไม่รองรับ Pat.isConvex" เพียงใช้ <corner android: radius = "7dp" />
Francesco Ambrosini

@shyam คุณสามารถตั้งเป็น "พื้นหลัง" ได้ หากคุณใช้บน TextView คุณจะต้องจำไว้ว่าต้องเพิ่มช่องว่างภายในสำหรับจุดเริ่มต้นและจุดสิ้นสุดเพื่อให้ข้อความไม่แออัดจากขอบโค้งมน
RowanPD

19

คำตอบของ mbaird ใช้งานได้ดี โปรดทราบว่าดูเหมือนจะมีข้อบกพร่องใน Android (อย่างน้อย 2.1) หากคุณตั้งค่ารัศมีของมุมใด ๆ เป็น 0 จะบังคับให้ทุกมุมเป็น 0 (อย่างน้อยก็เป็นกรณีของหน่วย "dp" ฉันไม่ได้ ไม่ลองใช้กับหน่วยอื่น)

ฉันต้องการรูปทรงที่มุมด้านบนโค้งมนและมุมด้านล่างเป็นสี่เหลี่ยมจัตุรัส ฉันทำได้โดยการตั้งค่ามุมที่ฉันต้องการให้เป็นสี่เหลี่ยมจัตุรัสเป็นค่าที่มากกว่า 0: 0.1dp เล็กน้อย สิ่งนี้ยังคงแสดงเป็นมุมสี่เหลี่ยมจัตุรัส แต่ไม่ได้บังคับให้มุมอื่นเป็นรัศมี 0


คุณเขียน 0.1 dp หรือเปล่า มันใช้งานได้หรือไม่ฉันยังต้องการมุมมนบนและสี่เหลี่ยมจัตุรัสล่างปัญหาเดียวกับที่คุณเพิ่งใช้ 1 dp ที่มุมสี่เหลี่ยมและ 10dp สำหรับรอบคุณพูดถูกมันยังคงสังเกตเห็นได้ แต่ให้สิ่งที่ฉัน 90% ต้องการตามเอกสารการตั้งค่า 0 ที่มุมที่ไม่ได้ล้อมรอบควรใช้งานได้
codeScriber

จริงๆแล้วมันไม่ใช่ข้อผิดพลาดมีอยู่ในเอกสาร: developer.android.com/guide/topics/resources/…
Tsuharesu

1

ลองใช้โค้ดด้านล่าง

<shape xmlns:android="http://schemas.android.com/apk/res/android">
<corners
    android:bottomLeftRadius="30dp"
    android:bottomRightRadius="30dp"
    android:topLeftRadius="30dp"
    android:topRightRadius="30dp" />
<solid android:color="#1271BB" />

<stroke
    android:width="5dp"
    android:color="#1271BB" />

<padding
    android:bottom="1dp"
    android:left="1dp"
    android:right="1dp"
    android:top="1dp" /></shape>
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.