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.