2012-01-19 4 views
96

ho avuto questo drawable ad avere un rettangolo arrotondato come sfondo:Android - drawable con angoli arrotondati in alto solo

<shape xmlns:android="http://schemas.android.com/apk/res/android"> 
    <solid android:color="@color/white" /> 
    <stroke android:width="1dp" android:color="@color/light_gray" /> 
    <padding android:left="10dp" android:top="10dp" android:right="10dp" android:bottom="10dp" /> 
    <corners android:radius="6dp" /> 
</shape> 

Questo sta lavorando bene, come previsto.

Ora, voglio cambiare questo solo intorno ai angoli superiori, quindi lo cambio a questo:

<shape xmlns:android="http://schemas.android.com/apk/res/android"> 
    <solid android:color="@color/white" /> 
    <stroke android:width="1dp" android:color="@color/light_gray" /> 
    <padding android:left="10dp" android:top="10dp" android:right="10dp" android:bottom="10dp" /> 
    <corners android:topLeftRadius="6dp" android:topRightRadius="6dp" 
      android:bottomLeftRadius="0dp" android:bottomRightRadius="0dp"/> 
</shape> 

Ma ora nessuno dei angoli sono arrotondati e ottengo un rettangolo pianura. Cosa mi manca qui?

+0

Questa non è davvero una soluzione, ma penso che una volta ho avuto un problema simile. Aumentare la potenza a 2 pixel ha aiutato, ma sai, non è una soluzione. –

+0

Ecco un problema con gli angoli delle forme: http://code.google.com/p/android/issues/detail?id = 939 – Knickedi

risposta

191

provare a dare questi valori:

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

Nota che ho cambiato 0dp-0.1dp.

EDIT: si veda il commento di Alex di seguito per una versione più pulita

+95

Esplorando ulteriormente, ho trovato una soluzione ancora migliore: ' '- questo produce angoli di fondo perfettamente quadrati senza nemmeno un accenno di arrotondamento. Comunque la tua soluzione praticamente funziona. –

+1

@AleksG fantastico !! – aqs

+0

Come farlo nel codice, dato un bitmap? E come aggiungere un contorno (tratto AKA) attorno ad esso? –

2

ho provato il codice. ho un bottone d'angolo arrotondato in alto. ho dato i colori come @ffffff e srtoke ho dato # C0C0C0. prova 1) dando android: bottomLeftRadius = "0.1dp" invece di 0. se non funziona 2) controlla in che modo drawable e la risoluzione degli emulatori. Ho creato una cartella drawable sotto res e usandola. (hdpi, mdpi ldpi) cartella hai questo xml. questo è il mio ouput

enter image description here

+0

Che versione di Android è questo? La mia app deve essere eseguita su 1.6 - e l'emulatore 1.6 ha avuto il problema. –

+0

ho provato con Android 2.1 e 2.3 – AD14

11

provare a fare qualcosa di simile:

<?xml version="1.0" encoding="utf-8"?> 
<layer-list xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item android:bottom="-20dp" android:left="-20dp"> 
     <shape android:shape="rectangle"> 
      <solid android:color="@color/white" /> 

      <corners android:radius="20dp" /> 
     </shape> 
    </item> 
</layer-list> 

Sembra non adatto per impostare diversi raggio dell'angolo del rettangolo. Quindi puoi usare questo trucco.

+0

Vedere la mia risposta - è perfettamente accettabile avere un raggio diverso per le diverse curve. –

+0

Ho provato questo approccio, non è accettabile, ide dice che non si appropria di avere rsdius diversi e lo ignora – busylee

+0

sì lo stesso qui non consente un raggio diverso ... – bvsss

7

Basandosi sulle busylee's answer, questo è come si può fare un drawable che ha un solo un angolo arrotondato (in alto a sinistra, in questo esempio):

<?xml version="1.0" encoding="utf-8"?> 
<layer-list xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item> 
     <shape android:shape="rectangle"> 
      <solid android:color="@color/white" /> 
      <!-- A numeric value is specified in "radius" for demonstrative purposes only, 
        it should be @dimen/val_name --> 
      <corners android:radius="10dp" /> 
     </shape> 
    </item> 
    <!-- To keep the TOP-LEFT corner UNROUNDED set both OPPOSITE offsets (bottom+right): --> 
    <item 
     android:bottom="10dp" 
     android:right="10dp"> 
     <shape android:shape="rectangle"> 
      <solid android:color="@color/white" /> 
     </shape> 
    </item> 
</layer-list> 

Si prega di notare che quanto sopra drawable è non visualizzato correttamente nell'anteprima di Android Studio (2.0.0p7). Per visualizzarlo comunque, crea un'altra vista e utilizzala come android:background="@drawable/...".

+0

Grazie. Ti rendi conto che questa domanda ha 4 anni e la soluzione è stata trovata 4 anni fa? –

+6

@AleksG - Certo. È rilevante oggi come allora (come prova - avevo bisogno di qualcosa del genere). Devi sapere che nel corso degli anni alcuni modi di fare le cose diventano deprecati e potrebbe essere necessario sostituirli con quelli più moderni. Come menzionato ** busylee **, l'IDE si lamenta quando si definiscono raggi angolari diversi, il che non è il caso del metodo attuale. Inoltre, poiché questa domanda è stata la mia prima hit su Google (iirc), per me era logico aggiornarla. In ogni caso, sono sicuro che SO non si occuperà di qualche altro KB di codice ... :) –

3

Nel mio caso sottostante Codice

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

     <shape android:shape="rectangle"> 
      <solid android:color="@color/maincolor" /> 

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

    </item> 
    </layer-list> 
+0

Le proprietà superiore e inferiore sull'elemento non sono necessarie a meno che non si desideri un riempimento nella vista, ma in caso contrario ciò funziona. – RominaV

1

potrebbe essere necessario leggere questo https://developer.android.com/guide/topics/resources/drawable-resource.html#Shape

e sotto c'è una nota.

Nota Ogni angolo deve (inizialmente) essere dotato di un raggio dell'angolo maggiore di 1, oppure nessun angolo è arrotondato. Se vuoi che gli angoli specifici non siano arrotondati, un rimedio è utilizzare Android: raggio per impostare un raggio angolare predefinito maggiore di 1, ma poi ignorare ogni angolo con i valori che desideri, fornendo zero ("0dp") dove non vuoi angoli arrotondati.