Jak utworzyć kształt z lewym górnym zaokrąglonym rogiem i lewym dolnym zaokrąglonym rogiem?


84

Chcę utworzyć kształt z lewym górnym zaokrąglonym rogiem i lewym dolnym zaokrąglonym rogiem:

<?xml version="1.0" encoding="UTF-8"?> 
<shape xmlns:android="http://schemas.android.com/apk/res/android"> 
    <solid android:color="#555555"/>    

    <stroke android:width="3dp"
            android:color="#555555"
            />

    <padding android:left="1dp"
             android:top="1dp"
             android:right="1dp"
             android:bottom="1dp"
             /> 

    <corners android:bottomRightRadius="0dp" android:bottomLeftRadius="2dp" 
     android:topLeftRadius="2dp" android:topRightRadius="0dp"/> 
</shape>

Ale powyższy kształt nie dał mi tego, czego chcę. Daje mi prostokąt bez zaokrąglonych rogów.

Odpowiedzi:


62

Wygląda na to, że http://code.google.com/p/android/issues/detail?id=939 błąd .

Na koniec muszę napisać coś takiego:

 <stroke android:width="3dp"
         android:color="#555555"
         />

 <padding android:left="1dp"
          android:top="1dp"
          android:right="1dp"
          android:bottom="1dp"
          /> 

 <corners android:radius="1dp"
  android:bottomRightRadius="2dp" android:bottomLeftRadius="0dp" 
  android:topLeftRadius="2dp" android:topRightRadius="0dp"/> 

Muszę określić android: bottomRightRadius = "2dp" dla lewego i dolnego zaokrąglonego rogu (kolejny błąd tutaj).


1
Tak, mogę potwierdzić twoje ostatnie stwierdzenie / błąd, że lewy / prawy jest tam przełączony. Doświadczyłem tego samego w mojej aplikacji. (sdk 2.1). Czy zgłosiłeś już błąd na b.android.com, czy już został tam zgłoszony?
— Mathias Conradt

3
Właśnie zgłosiłem błąd, code.google.com/p/android/issues/detail?id=9161 . Smutne jest to, że po naprawieniu błędu muszę ponownie zmienić kod :(
— user256239

58

Chociaż na to pytanie udzielono już odpowiedzi (jest to błąd powodujący odwrócenie bottomLeftRadius i bottomRightRadius), błąd został naprawiony w systemie Android 3.1 (api poziom 12 - testowany na emulatorze).

Tak więc, aby upewnić się, że twoje drawables wyglądają poprawnie na wszystkich platformach, powinieneś umieścić "poprawione" wersje drawables (tj. Gdzie dolny lewy / prawy promień jest rzeczywiście poprawny w xml) w folderze res / drawable-v12 twojej aplikacji. W ten sposób wszystkie urządzenia korzystające z wersji Androida> = 12 będą używać poprawnych plików do rysowania, podczas gdy urządzenia ze starszymi wersjami Androida będą używać elementów rysunkowych „obejścia”, które znajdują się w folderze res / drawables.


4
Inną opcją jest użycie domyślnego values/dimens.xmlpliku zawierającego odwrócone wartości bottom_left i bottom_right oraz nowego values-v12/dimens.xmlpliku, który ma poprawne wartości. W ten sposób możesz zachować tylko jedną wersję pliku XML do rysowania, a tylko wartość wymiaru jest zamieniana na podstawie wersji interfejsu API.
— Joe

35

Z dokumentacji :

UWAGA: Każdy narożnik musi (początkowo) mieć promień narożnika większy niż 1, w przeciwnym razie żadne rogi nie będą 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, a 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.

Np. Musisz ustawić, android:radius="<bigger than 1dp>"aby móc robić to, co chcesz:

<corners 
    android:radius="2dp"
    android:bottomRightRadius="0dp" 
    android:topRightRadius="0dp"/> 

14

Możesz również użyć bardzo małych liczb dla swojego promienia ”.

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

to była pierwsza próba ... ale bez nadziei ... testuję na Androidzie 2.2 ... Wszelkie inne pomysły ... Dzięki
— Aamir Shah,

12

dla innych istnieją rozwiązania dla dowolnego poziomu API, możesz umieścić jeden element jeden na drugim przykład:

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >

<!-- my firt item with 4 corners radius(8dp)
 -->
    <item>
        <shape>
            <solid
                android:angle="270.0"
                android:color="#3D689A" />

            <corners android:topLeftRadius="8dp" />
        </shape>
    </item>
<!-- my second item is on top right for a fake corner radius(0dp)
 -->
    <item
        android:bottom="30dp"
        android:left="50dp">
        <shape>
            <solid android:color="#5C83AF" />
        </shape>
    </item>
<!-- my third item is on bottom left for a fake corner radius(0dp)
 -->
    <item
        android:right="50dp"
        android:top="30dp">
        <shape>
            <solid android:color="#5C83AF" />
        </shape>
    </item>

</layer-list>

wynik w jasnym kolorze, aby pokazać trzy elementy:

wprowadź opis obrazu tutaj

Wynik końcowy :

wprowadź opis obrazu tutaj

Z poważaniem.


8

Ten błąd został zgłoszony tutaj . Jest to błąd związany z urządzeniami z Androidem o poziomie API niższym niż 12. Musisz umieścić poprawne wersje swoich układów w folderze drawable-v12, który będzie używany na poziomie API 12 lub wyższym. Błędna wersja (rogi zamienione / odwrócone) tego samego układu zostanie umieszczona w domyślnym folderze do rysowania, który będzie używany przez urządzenia o poziomie API niższym niż 12.

Na przykład: musiałem zaprojektować przycisk z zaokrąglonym rogiem w prawym dolnym rogu.

W folderze „drawable” - button.xml: musiałem zaokrąglić lewy dolny róg.

<shape>
    <corners android:bottomLeftRadius="15dp"/>
</shape>

W folderze 'drawable-v12' - button.xml: Tutaj została umieszczona poprawna wersja układu do wykorzystania na poziomie API 12 lub wyższym.

<shape>
    <corners android:bottomLeftRadius="15dp"/>
</shape>

7

Spróbuj tego

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<solid android:color="@color/upkia"/>
<corners android:radius="10dp"
    android:topRightRadius="0dp"
    android:bottomRightRadius="0dp" />
</shape>
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.