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.

user256239
źródło

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

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

Geoff
źródło
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"/> 
Entreco
źródło
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" />
Moncader
źródło
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.

Williams
źródło
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>
Reaz Murshed
źródło
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>
Sai Gopi Me
źródło