Android - tylko do rysowania z zaokrąglonymi rogami u góry

151

Miałem to do narysowania, aby mieć zaokrąglony prostokąt jako tło:

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

To działa dobrze, zgodnie z oczekiwaniami.

Teraz chcę to zmienić, aby tylko zaokrąglać górne rogi, więc zmieniam to na to:

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

Ale teraz żaden z rogów nie jest zaokrąglony i otrzymuję zwykły prostokąt. Czego tu brakuje?

Aleks G
źródło
To naprawdę nie jest rozwiązanie, ale myślę, że kiedyś miałem podobny problem. Zwiększenie obrysu do 2 pikseli pomogło, ale wiesz, to nie jest rozwiązanie.
Code Poet
Oto problem z narożnikami kształtu: code.google.com/p/android/issues/detail?id=939
Knickedi,

Odpowiedzi:

303

Spróbuj podać te wartości:

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

Zauważ, że zmieniłem się 0dpna 0.1dp.

EDYCJA: Zobacz komentarz Aleksa G poniżej, aby uzyskać czystszą wersję

aqs
źródło
131
Badając to dalej, znalazłem jeszcze lepsze rozwiązanie: <corners android:radius="1dp" android:topLeftRadius="6dp" android:topRightRadius="6dp" android:bottomLeftRadius="0dp" android:bottomRightRadius="0dp"/>- daje to idealnie kwadratowe dolne narożniki bez śladu zaokrąglenia. Jednak Twoje rozwiązanie działa.
Aleks G
Jak to zrobić w kodzie, mając bitmapę? A jak dodać dookoła kontur (obrys)?
programista Androida
@Aleks G Nie widzę potrzeby określaniaandroid:radius="1dp"
hmac
@hmac jest to konieczne. Przeczytaj dokumentację, to wyjaśnia.
Aleks G
@AleksG Tak, dokumentacja jest nieprawidłowa, testowanie na Samsungu 10, Androidzie 9: „Każdy róg musi mieć (początkowo) promień narożnika większy niż 1, w przeciwnym razie żadne rogi nie są zaokrąglane. Jeśli chcesz, aby określone rogi nie były zaokrąglane, a obejściem jest użycie android: radius do ustawienia domyślnego promienia narożnika większego niż 1, ale potem zastąpienie "- nie prawda, określam dolny prawy, prawy górny, lewy górny jako zero, a dolny lewy + ve i dolny lewy są poprawnie zakrzywione
hmac
14

Spróbuj zrobić coś takiego:

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

Wydaje się, że ustawienie innego promienia narożnika prostokąta jest nieodpowiednie. Możesz więc użyć tego hacka.

busylee
źródło
Zobacz moją własną odpowiedź - całkowicie akceptowalne jest posiadanie innego promienia dla różnych narożników.
Aleks G
Wypróbowałem to podejście, jest to nie do przyjęcia, ide mówi, że nie jest właściwe, aby mieć inny rsdius i ignoruje to
busylee
11

W moim przypadku poniżej 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>
Shekhar
źródło
1
Właściwości górnego i dolnego elementu nie są potrzebne, chyba że chcesz mieć dopełnienie w widoku, ale poza tym to działa.
RominaV
9

Opierając się na odpowiedzi busylee , w ten sposób można utworzyć drawabletylko jeden nie zaokrąglony róg (w tym przykładzie lewy górny róg):

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

Należy pamiętać, że powyższe niedrawable jest poprawnie wyświetlane w podglądzie Android Studio (2.0.0p7). Aby mimo to wyświetlić podgląd, utwórz inny widok i użyj go jako .android:background="@drawable/..."

Diabeł
źródło
6
@AleksG - Oczywiście. Jest aktualne tak, jak było wtedy (jako dowód - potrzebowałem czegoś takiego). Musisz wiedzieć, że z biegiem lat niektóre sposoby robienia rzeczy stają się przestarzałe i mogą wymagać zastąpienia nowszymi. Jak wspomniano w busylee , IDE narzeka podczas definiowania różnych promieni narożników, co nie ma miejsca w przypadku niniejszej metody. Co więcej, ponieważ to pytanie było moim pierwszym hitem w Google (iirc), sensowne było dla mnie zaktualizowanie go. W każdym razie, jestem pewien, że SO nie będzie miał nic przeciwko kilku KB kodu ... :)
Dev-iL
2

Wypróbowałem twój kod i otrzymałem przycisk w górnym rogu. Kolory dałem jak @ffffffi kreskę, którą podałem #C0C0C0.

próbować

  1. Daje android: bottomLeftRadius = "0.1dp" zamiast 0., jeśli nie działa
  2. Sprawdź, w jakim trybie rysowania i rozdzielczości emulatora. Stworzyłem folder do rysowania pod res i używając go. (hdpi, mdpi ldpi) folder, w którym masz ten plik XML. to jest mój wynik.

wprowadź opis obrazu tutaj

Arul T
źródło
Jaka to wersja Androida? Moja aplikacja musi działać w wersji 1.6 - a emulator 1.6 miał problem.
Aleks G
1

Być może będziesz musiał to przeczytać https://developer.android.com/guide/topics/resources/drawable-resource.html#Shape

a poniżej jest uwaga.

Uwaga Każdy narożnik musi (początkowo) mieć promień narożnika większy niż 1, w przeciwnym razie żadne rogi nie są zaokrąglane. Jeśli chcesz, aby określone narożniki nie były zaokrąglane, obejście problemu polega na użyciu android: radius w celu ustawienia domyślnego promienia narożnika większego niż 1, ale następnie nadpisanie każdego narożnika wartościami, które naprawdę chcesz, zapewniając zero („0dp” ), gdzie nie chcesz mieć zaokrąglonych rogów.

lightman1988
źródło
1

Utwórz roung_top_corners.xml na drawable i skopiuj poniższy kod

<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
źródło