Bagaimana cara menyetel radius sudut membulat dari drawable warna menggunakan xml?

108

Di situs android, ada bagian tentang color drawable . Mendefinisikan drawable ini dalam xml terlihat seperti ini:

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

Dalam java api, mereka memiliki metode berikut untuk menentukan sudut membulat:

setCornerRadius(float radius)

Apakah ada cara untuk menyetel sudut membulat di xml?

Jay Askren
sumber
Untuk sudut set dari kode lihat (Gradient digambar): stackoverflow.com/questions/8709595/...
samis

Jawaban:

319

Gunakan <shape>tag untuk membuat drawable dalam XML dengan sudut membulat. (Anda dapat melakukan hal lain dengan tag bentuk seperti menentukan gradien warna juga).

Berikut salinan file XML yang saya gunakan di salah satu aplikasi saya untuk membuat drawable dengan latar belakang putih, batas hitam, dan sudut membulat:

<?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>
Mark B
sumber
1
di mana menyimpan file ini dan bagaimana mendapatkannya di kode java saya? terima kasih
shyam
7
simpan sebagai file xml di direktori drawable, lalu gunakan seperti Anda akan menggunakan drawable (ikon atau file resource) menggunakan nama resource-nya (R.drawable.your_xml_name)
Guillaume
30
dalam kasus khusus ini semua jari-jarinya sama, jadi Anda bisa menggunakan android: radius = "7dp"
Will Kru
2
Selain itu, perender tata letak di Android Studio tidak akan dapat merendernya jika Anda menentukan radius secara terpisah (bahkan dengan nilai yang sama) dan akan memberi Anda peringatan "Pat.isConvex tidak didukung". Cukup gunakan <corners android: radius = "7dp" />
Francesco Ambrosini
@shyam Anda dapat mengaturnya sebagai "latar belakang". Jika Anda menggunakannya pada TextView, Anda harus ingat untuk menambahkan padding untuk awal dan akhir sehingga teks tidak penuh sesak dengan tepi yang membulat
RowanPD
19

Jawaban mbaird berfungsi dengan baik. Sadarilah bahwa tampaknya ada bug di Android (setidaknya 2.1), bahwa jika Anda menyetel radius sudut mana pun ke 0, itu memaksa semua sudut ke 0 (setidaknya itu yang terjadi dengan unit "dp"; saya tidak tidak mencobanya dengan unit lain).

Saya membutuhkan bentuk di mana sudut atas dibulatkan dan sudut bawah berbentuk persegi. Saya mencapai ini dengan mengatur sudut yang saya inginkan menjadi persegi ke nilai yang sedikit lebih besar dari 0: 0.1dp. Ini masih dirender sebagai sudut persegi, tetapi tidak memaksa sudut lainnya menjadi jari-jari 0.

John Pisello
sumber
apakah kamu baru saja menulis 0,1 dp? apakah itu berfungsi, saya juga perlu sudut membulat atas dan yang lebih rendah, masalah yang sama seperti yang Anda baru saja saya gunakan 1 dp, di sudut persegi dan 10dp pada yang bulat, Anda benar itu masih terlihat, tetapi memberi saya 90% apa yang saya inginkan, menurut pengaturan dokumentasi 0 di sudut unround seharusnya bekerja.
codeScriber
Sebenarnya ini bukan bug, itu ada di dokumentasi: developer.android.com/guide/topics/resources/…
Tsuharesu
1

Coba kode di bawah ini

<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>
Mujahid Khan
sumber