Android - dapat digambar dengan sudut bulat di bagian atas saja

151

Saya memiliki gambar ini untuk memiliki persegi panjang bulat sebagai latar belakang:

<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>

Ini berfungsi dengan baik, seperti yang diharapkan.

Sekarang, saya ingin mengubah ini hanya di tikungan atas, jadi saya mengubahnya ke ini:

<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>

Tapi sekarang tidak ada sudut yang bulat dan saya mendapatkan persegi panjang polos. Apa yang kulewatkan di sini?

Aleks G
sumber
Ini benar-benar bukan solusi tapi saya pikir saya pernah punya masalah yang sama. Meningkatkan stoke menjadi 2 piksel membantu, tetapi Anda tahu, itu bukan solusi.
Penyair Kode
Inilah masalah dengan sudut bentuk: code.google.com/p/android/issues/detail?id=939
Knickedi

Jawaban:

304

Coba berikan nilai-nilai ini:

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

Perhatikan bahwa saya telah berubah 0dpmenjadi0.1dp .

EDIT: Lihat Aleks G komentar di bawah untuk versi yang lebih bersih

aqs
sumber
131
Menjelajahi ini lebih lanjut, saya menemukan solusi yang lebih baik: <corners android:radius="1dp" android:topLeftRadius="6dp" android:topRightRadius="6dp" android:bottomLeftRadius="0dp" android:bottomRightRadius="0dp"/>- ini menghasilkan sudut bawah sempurna persegi tanpa sedikit pun pembulatan. Namun solusi Anda cukup berhasil.
Aleks G
Bagaimana melakukannya dalam kode, diberi bitmap? Dan bagaimana cara menambahkan outline (stroke AKA) di sekitarnya?
pengembang android
@Aleks G saya tidak melihat bahwa itu perlu ditentukanandroid:radius="1dp"
hmac
@ hmac itu perlu. Baca dokumentasi, itu membuatnya jelas.
Aleks G
@AlexG Ya dokumentasi salah, pengujian pada Samsung 10, Android 9: "Setiap sudut harus (awalnya) diberikan radius sudut lebih dari 1, atau jika tidak ada sudut dibulatkan. Jika Anda ingin sudut tertentu tidak dibulatkan, a bekerja-sekitar adalah menggunakan android: radius untuk menetapkan radius sudut default lebih besar dari 1, tetapi kemudian menimpanya "- tidak benar, saya menentukan kanan bawah, kanan atas, kiri atas sebagai nol dan kiri bawah + ve dan kiri bawah benar melengkung
hmac
14

Coba lakukan sesuatu seperti ini:

<?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>

Tampaknya tidak cocok untuk mengatur radius sudut persegi panjang yang berbeda. Jadi Anda bisa menggunakan hack ini.

busylee
sumber
Lihat jawaban saya sendiri - dapat diterima jika memiliki radius yang berbeda untuk sudut yang berbeda.
Aleks G
Saya mencoba pendekatan ini, itu tidak dapat diterima, ide mengatakan bahwa tidak tepat untuk memiliki rsdius yang berbeda dan mengabaikannya
busylee
11

Dalam kasus saya, kode di bawah ini

    <?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>
Shekhar
sumber
1
Properti atas dan bawah pada item tidak diperlukan kecuali jika Anda ingin bantalan dalam tampilan, tetapi jika tidak ini berfungsi.
RominaV
9

Membangun berdasarkan jawaban busylee , ini adalah bagaimana Anda dapat membuat sudut drawableyang hanya memiliki satu sudut tidak bulat (kiri-atas, dalam contoh ini):

<?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>

Harap dicatat bahwa di atas drawableadalah tidak ditampilkan dengan benar di Android Studio preview (2.0.0p7). Untuk mempratinjau, buat tampilan lain dan gunakan ini sebagai android:background="@drawable/...".

Setan
sumber
6
@AlexG - Tentu saja. Ini relevan hari ini seperti dulu (sebagai bukti - saya butuh sesuatu seperti itu). Anda harus tahu bahwa selama bertahun-tahun beberapa cara melakukan hal-hal menjadi usang dan mungkin perlu diganti dengan yang lebih modern. Seperti yang disebutkan busylee , IDE mengeluh ketika mendefinisikan radius sudut yang berbeda, yang tidak demikian halnya dengan metode ini. Selain itu, karena pertanyaan ini adalah hit pertama saya di Google (iirc), masuk akal bagi saya untuk memperbaruinya. Bagaimanapun, saya yakin SO tidak akan keberatan beberapa KB kode lagi ... :)
Dev-iL
2

Saya mencoba kode Anda dan mendapat tombol sudut bulat atas. Saya memberi warna @ffffffdan stroke yang saya berikan#C0C0C0 .

mencoba

  1. Memberi android: bottomLeftRadius = "0.1dp" alih-alih 0. jika tidak berfungsi
  2. Periksa apa yang dapat digambar dan resolusi emulator. Saya membuat folder yang dapat digambar di bawah res dan menggunakannya. (hdpi, mdpi ldpi) folder yang Anda miliki XML ini. ini adalah output saya.

masukkan deskripsi gambar di sini

Arul T
sumber
Apa versi android ini? Aplikasi saya harus berjalan pada 1.6 - dan emulator 1.6 memiliki masalah.
Aleks G
1

Anda mungkin perlu membaca ini https://developer.android.com/guide/topics/resources/drawable-resource.html#Shape

dan di bawah ada Note.

Catatan Setiap sudut (awalnya) harus disediakan radius sudut lebih besar dari 1, atau sudut tidak dibulatkan. Jika Anda ingin sudut tertentu tidak dibulatkan, penyelesaiannya adalah menggunakan android: radius untuk menetapkan radius sudut default lebih besar dari 1, tetapi kemudian menimpa setiap sudut dengan nilai yang Anda inginkan, memberikan nol ("0dp" ) di mana Anda tidak ingin sudut membulat.

lightman1988
sumber
1

Buat roung_top_corners.xml di drawable dan salin kode di bawah ini

<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>
Manoj Reddy
sumber