2012-01-19 24 views
96

miałem ten rozciągliwej mieć zaokrąglony prostokąt jako tła:Android - odkształcalne z zaokrąglonymi narożnikami na górze tylko

<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, jak oczekiwano.

Teraz chcę to zmienić tylko okrągły górnych rogach, więc mogę ją zmienić, aby w ten sposób:

<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 nikt z narożników są zaokrąglone i mam zwykły prostokąt. Czego tu mi brakuje?

+0

To naprawdę nie jest rozwiązanie, ale myślę, że kiedyś miałem podobny problem. Zwiększenie efektu do 2 pikseli pomogło, ale wiesz, to nie jest rozwiązanie. –

+0

Oto problem z narożnikami kształtów: http://code.google.com/p/android/issues/detail?id = 939 – Knickedi

Odpowiedz

191

spróbuj podać następujące wartości:

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

pamiętać, że zmieniły 0dp do 0.1dp.

EDIT: Zobacz komentarz Alexa poniżej czystszego wersji

+95

Odkrywając to dalej, znalazłem jeszcze lepsze rozwiązanie: ' "- tworzy idealnie kwadratowe dolne rogi bez nawet śladu zaokrągleń. Jednak twoje rozwiązanie prawie działa. –

+1

@AleksG świetnie! – aqs

+0

Jak to zrobić w kodzie, biorąc pod uwagę bitmapę? A jak dodać kontur (obrys AKA) wokół niego? –

2

Próbowałem swój kod. Mam zaokrąglony narożny guzik. dałem kolory jako @ffffff i srtoke, które dałem # C0C0C0. spróbuj 1) dając android: bottomLeftRadius = "0.1dp" zamiast 0. jeśli nie działa 2) sprawdź, jakie losowanie i rozdzielczość emulatorów. Stworzyłem folder do rysowania w res i używałem go. (hdpi, mdpi ldpi) folder masz ten xml. to moja ouput

enter image description here

+0

Jaka jest wersja Androida? Moja aplikacja musi działać w wersji 1.6 - a emulator 1.6 miał problem. –

+0

Próbowałem z Androidem 2.1 i 2.3 – AD14

11

spróbować 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ę nie nadaje, aby ustawić inny promień narożnika prostokąta. Więc możesz użyć tego hacka.

+0

Zobacz moją własną odpowiedź - całkowicie dopuszczalne jest posiadanie innego promienia dla różnych narożników. –

+0

Próbowałem tego podejścia, jest nie do zaakceptowania, ide mówi, że nie jest to właściwe, aby mieć inny rsdius i ignoruje go – busylee

+0

tak samo tutaj to nie pozwala na inny promień ... – bvsss

7

Opierając busylee's answer, to w jaki sposób można dokonać drawable że ma tylko jeden un zaokrąglony narożnik (góra-lewo, w tym przykładzie):

<?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 drawable jest nie wyświetlane poprawnie 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/...".

+0

Dzięki. Czy zdajesz sobie sprawę, że to pytanie ma 4 lata, a rozwiązanie znaleziono 4 lata temu? –

+6

@AleksG - Oczywiście. Jest to aktualne dzisiaj, tak jak 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 wspomniałem ** busylee **, IDE skarży się przy definiowaniu różnych promieni narożnych, co nie ma miejsca w przypadku niniejszej metody. Co więcej, ponieważ to pytanie było moim pierwszym trafieniem w Google (iirc), miałem sens, aby go zaktualizować. W każdym razie, jestem pewien, że SO nie będzie miał nic przeciwko kilku kilobajtowym KB kodu ... :) –

3

W moim przypadku poniżej kodu

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

Górne i dolne właściwości elementu nie są potrzebne, chyba że chcesz dopełnienia w widoku, ale poza tym to działa. – RominaV

1

może trzeba przeczytać https://developer.android.com/guide/topics/resources/drawable-resource.html#Shape

a poniżej znajduje się Uwaga.

Uwaga Każdy narożnik musi (początkowo) mieć promień naroża większy niż 1, lub też nie zaokrąglić narożników. Jeśli nie chcesz zaokrąglać określonych narożników, użyj polecenia android: radius, aby ustawić domyślny promień narożnika większy niż 1, ale następnie zastąp wszystkie narożniki wartościami, które naprawdę chcesz, zapewniając zero ("0dp"), w którym nie chcesz zaokrąglić narożników.

Powiązane problemy