2010-06-16 17 views
62

Voglio fare una forma con con sinistra-alto arrotondati e angolo arrotondato in basso a sinistra:Come creare una forma con angolo superiore arrotondato a sinistra arrotondato e angolo arrotondato a sinistra in basso?

<?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 di cui sopra non mi ha dato quello che voglio. Mi dà un rettangolo senza angoli arrotondati.

Qualcuno può aiutare?

Grazie.

risposta

35

Si presenta come un insetto http://code.google.com/p/android/issues/detail?id=939.

Infine 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 angolo arrotondato in basso a sinistra (un altro bug Qui).

+1

Sì, posso confermare l'ultima frase/errore che viene spostato da sinistra a destra. Ho sperimentato lo stesso anche nella mia app. (SDK 2.1). Hai già inserito un bug report su b.android.com o è già stato segnalato? –

+3

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

13

È possibile utilizzare anche estremamente piccoli numeri per il vostro raggio.

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

è stato il primo che ho provato ... ma nessuna speranza .... sto testando su Android 2.2 ... Qualsiasi altro idee ... Grazie –

53

Anche se questa domanda è stato risposto già (si tratta di un bug che causa bottomLeftRadius e bottomRightRadius essere invertita), il bug è stato risolto in Android 3.1 (API di livello 12 - testato su l'emulatore).

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

+0

Ran in questo esatto problema oggi, che fastidioso bug – onit

+0

+1 Grazie è molto utile per me – Praveenkumar

+5

Questa dovrebbe essere accettata come risposta – Abx

21

Dal documentation:

NOTA: Ogni angolo deve (inizialmente) prevedere un raggio angolo maggiore di 1, oppure senza spigoli arrotondati. Se si desidera specifiche angoli di non essere arrotondati, un work-around è quello di utilizzare Android: distanza per impostare un raggio d'angolo di default maggiore di 1, ma poi ignorare tutti e ogni angolo con i valori che si desidera davvero, fornendo zero ("0dp") in cui non si desidera arrotondare gli angoli.

E.g. è necessario impostare un androide: Raggio = "" per essere in grado di fare ciò che si vuole:

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

Un altro punto, è che se si fa questo genere di cose, l'anteprima in Eclipse non è corretto. In realtà devi avviare la tua app per vedere i risultati effettivi!

+0

Volevo solo sottolineare in eclissi l'anteprima di 3.7.2 mi sembra perfetta – kyle

3

Questo bug è archiviato here. Questo è un bug di dispositivi Android che hanno livello di API inferiore a 12. Hai per mettere le versioni corrette dei vostri layout nella cartella drawable-V12 che saranno utilizzati per il livello di API 12 o superiore. E una versione errata (angoli invertiti/invertiti) dello stesso layout verrà inserita nella cartella 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 'disegnabile' - button.xml: ho dovuto fare nell'angolo inferiore sinistro arrotondato.

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

nella cartella 'drawable-V12' - button.xml: versione corretta del layout è stato messo qui per essere utilizzato per il livello di API 12 o superiore.

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

per gli altri ci sono una soluzione per qualsiasi livello di API, è possibile inserire una voce di 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 visualizzare i tre elementi:

enter image description here

il risultato finale:

enter image description here

Cordiali saluti.

+0

Grazie mille :) –

Problemi correlati