Android - yalnızca üstte yuvarlatılmış köşeleri olan çekilebilir


158

Arka plan olarak yuvarlak bir dikdörtgene sahip olmak için bu çekilebilir öğeye sahiptim:

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

Bu beklendiği gibi iyi çalışıyor.

Şimdi, bunu sadece üst köşeleri yuvarlayacak şekilde değiştirmek istiyorum, bu yüzden şuna değiştiriyorum:

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

Ama şimdi köşelerin hiçbiri yuvarlatılmamış ve düz bir dikdörtgen elde ediyorum. Burada neyi özlüyorum?


Bu gerçekten bir çözüm değil ama sanırım bir zamanlar benzer bir problemim vardı. Görüntüyü 2 piksele çıkarmak yardımcı oldu, ancak biliyorsunuz, bu bir çözüm değil.
Code Poet

Şekil köşeleriyle ilgili bir sorun: code.google.com/p/android/issues/detail?id=939
Knickedi

Yanıtlar:


323

Şu değerleri vermeyi deneyin:

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

Ben değişti unutmayın 0dpetmek 0.1dp.

DÜZENLEME: Daha temiz bir sürüm için aşağıdaki Aleks G yorumuna bakın


136
Bunu daha fazla araştırarak daha da iyi bir çözüm buldum: <corners android:radius="1dp" android:topLeftRadius="6dp" android:topRightRadius="6dp" android:bottomLeftRadius="0dp" android:bottomRightRadius="0dp"/>- bu, en ufak bir yuvarlama bile olmadan mükemmel kare alt köşeler üretir. Ancak çözümünüz hemen hemen işe yarıyor.
Aleks G

Bir bit eşlem verildiğinde kodda nasıl yapılır? Ve etrafına anahat (AKA konturu) nasıl eklenir?
android geliştiricisi

@Aleks G belirtmenin gerekli olduğunu görmüyorumandroid:radius="1dp"
hmac

@hmac gerekli. Belgeleri okuyun, anlaşılır hale getirir.
Aleks G

@AleksG Evet, dokümantasyon yanlış, Samsung 10, Android 9'da test ediliyor: "Her köşeye (başlangıçta) 1'den büyük bir köşe yarıçapı sağlanmalı, yoksa hiçbir köşe yuvarlatılmamış. Belirli köşelerin yuvarlatılmamasını istiyorsanız, geçici bir çözüm, varsayılan bir köşe yarıçapını 1'den büyük ayarlamak için android: radius'u kullanmak, ancak ardından geçersiz kılmaktır "- doğru değil, sağ alt, sağ üst, sol üst sıfır ve alt sol + ve ve sol alt doğru eğimli
hmac

14

Bunun gibi bir şey yapmayı dene:

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

Dikdörtgenin farklı köşe yarıçaplarını ayarlamak uygun görünmüyor. Yani bu hack'i kullanabilirsiniz.


Kendi cevabımı görün - farklı köşeler için farklı yarıçaplara sahip olmak tamamen kabul edilebilir.
Aleks G

Bu yaklaşımı denedim, kabul edilebilir değil, ide farklı rsdius'a sahip olmanın uygun olmadığını söylüyor ve görmezden geliyor
busylee

12

Benim durumumda aşağıdaki kod

    <?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
Görünümde dolgu istemediğiniz sürece öğenin üst ve alt özelliklerine gerek yoktur, ancak aksi takdirde bu işe yarar.
RominaV

9

Üzerine bina busylee cevabı , bu bir hale nasıl olduğunu drawabletek sahip olduğu un yuvarlatılmış köşe (bu örnekte, sol üst):

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

Yukarıdaki O notu Lütfen drawableedilir değil Android Studio önizleme (2.0.0p7) doğru görüntülenecek. Yine de önizlemek için başka bir görünüm oluşturun ve bunu olarak kullanın android:background="@drawable/...".


6
@AleksG - Elbette. O zamanlar olduğu gibi bugün de alakalı (kanıt olarak - böyle bir şeye ihtiyacım vardı). Yıllar geçtikçe bir şeyler yapmanın bazı yollarının kullanımdan kaldırıldığını ve daha modern olanlarla değiştirilmeleri gerekebileceğini bilmelisiniz. Olarak busylee bahsedilen mevcut yöntem ile söz konusu değildir, farklı köşe yarıçaplarına tanımlarken IDE şikayet. Üstelik bu soru Google'daki (iirc) ilk hitim olduğu için güncellemek benim için mantıklıydı. Her neyse, eminim ki birkaç KB kod daha aldırmaz ... :)
Dev-iL

2

Kodunuzu denedim ve bir üst yuvarlak köşe düğmesi aldım. Renkleri @ffffffverdiğim gibi verdim #C0C0C0.

Deneyin

  1. Android: bottomLeftRadius = çalışmıyorsa 0 yerine "0.1dp" verilmesi
  2. Hangi çekilebilirliği ve emülatörün çözünürlüğünü kontrol edin. Res altında ve onu kullanarak çekilebilir bir klasör oluşturdum. (hdpi, mdpi ldpi) bu XML'e sahip olduğunuz klasör. bu benim çıktım.

görüntü açıklamasını buraya girin


Bu hangi android sürümü? Uygulamam 1.6'da çalışmalı - ve öykünücü 1.6'da sorun vardı.
Aleks G

1

Bu https://developer.android.com/guide/topics/resources/drawable-resource.html#Shape'i okumanız gerekebilir

ve aşağıda bir Not var.

Not Her köşeye (başlangıçta) 1'den büyük bir köşe yarıçapı sağlanmalıdır, aksi takdirde hiçbir köşe yuvarlatılmaz. Belirli köşelerin yuvarlanmamasını istiyorsanız, 1'den büyük varsayılan bir köşe yarıçapı ayarlamak için android: radius'u kullanmak, ancak daha sonra her köşeyi gerçekten istediğiniz değerlerle geçersiz kılmak ve sıfır sağlayarak ("0dp" ) yuvarlatılmış köşeler istemediğiniz yer.


1

Drawable üzerinde roung_top_corners.xml oluşturun ve aşağıdaki kodu kopyalayın

<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>
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.