Come creare una forma con l'angolo arrotondato in alto a sinistra e l'angolo arrotondato in basso a sinistra?


84

Voglio creare una forma con l'angolo arrotondato in alto a sinistra e l'angolo arrotondato in basso a sinistra:

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

Ma la forma sopra non mi ha dato quello che volevo. Mi dà un rettangolo senza angoli arrotondati.

Risposte:


62

Sembra un bug http://code.google.com/p/android/issues/detail?id=939 .

Finalmente devo scrivere qualcosa del genere:

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

Devo specificare android: bottomRightRadius = "2dp" per l'angolo arrotondato in basso a sinistra (un altro bug qui).


1
Sì, posso confermare la tua ultima affermazione / bug secondo cui sinistra / destra è stata cambiata lì. Ho sperimentato lo stesso anche nella mia app. (sdk 2.1). Hai già segnalato un bug su b.android.com o è già segnalato lì?
— Mathias Conradt,

3
Ho appena segnalato un bug, code.google.com/p/android/issues/detail?id=9161 . La cosa triste è che, dopo aver corretto il bug, devo cambiare di nuovo il mio codice :(
— user256239

58

Sebbene a questa domanda sia già stata data una risposta (è un bug che causa l'inversione di bottomLeftRadius e bottomRightRadius), il bug è stato corretto in Android 3.1 (livello API 12 - testato sull'emulatore).

Quindi, per assicurarti che i tuoi drawable siano corretti su tutte le piattaforme, dovresti mettere le versioni "corrette" dei drawables (cioè dove i raggi in basso a sinistra / destra sono effettivamente corretti nell'xml) nella cartella res / drawable-v12 della tua app. In questo modo tutti i dispositivi che utilizzano una versione di Android> = 12 useranno i file disegnabili corretti, mentre i dispositivi che utilizzano versioni precedenti di Android useranno i drawables "workaround" che si trovano nella cartella res / drawables.


4
Un'altra opzione è quella di utilizzare un values/dimens.xmlfile predefinito che contiene i valori bottom_left e bottom_right invertiti e un nuovo values-v12/dimens.xmlfile con i valori corretti . In questo modo puoi mantenere solo una singola versione del file XML disegnabile e solo il valore dimen viene scambiato in base alla versione API.
— Joe

35

Dalla documentazione :

NOTA: ogni angolo deve (inizialmente) avere un raggio dell'angolo maggiore di 1, altrimenti nessun angolo è arrotondato. Se desideri che angoli specifici non vengano arrotondati, una soluzione alternativa consiste nell'usare android: radius per impostare un raggio dell'angolo predefinito maggiore di 1, ma poi sostituire ogni angolo con i valori che desideri veramente, fornendo zero ("0dp" ) dove non vuoi angoli arrotondati.

Ad esempio, devi impostare un android:radius="<bigger than 1dp>"per poter fare ciò che vuoi:

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

14

Puoi anche usare numeri estremamente piccoli per il tuo raggio '.

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

quello è stato il primo che ho provato ... ma nessuna speranza ... sto provando su Android 2.2 ... Altre idee ... Grazie
— Aamir Shah

12

per altri esiste una soluzione per qualsiasi livello API, puoi posizionare un elemento uno sopra l'altro esempio:

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

il risultato con colore chiaro per mostrarti i tre elementi:

inserisci qui la descrizione dell'immagine

il risultato finale:

inserisci qui la descrizione dell'immagine

I migliori saluti.


8

Questo bug è archiviato qui . Questo è un bug dei dispositivi Android con livello API inferiore a 12. Devi inserire le versioni corrette dei tuoi layout nella cartella drawable-v12 che verrà utilizzata per il livello API 12 o superiore. E una versione errata (angoli commutati / invertiti) dello stesso layout verrà inserita nella cartella disegnabile predefinita che verrà utilizzata dai dispositivi con livello API inferiore a 12.

Ad esempio: ho dovuto progettare un pulsante con l'angolo arrotondato in basso a destra.

Nella cartella "drawable" - button.xml: ho dovuto arrotondare l'angolo inferiore sinistro.

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

Nella cartella "drawable-v12" - button.xml: qui è stata posizionata la versione corretta del layout da utilizzare per il livello API 12 o superiore.

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

7

prova questo

<?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>
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.