Android: disegnabile con angoli arrotondati solo nella parte superiore


151

Ho avuto questo disegno per avere un rettangolo arrotondato come sfondo:

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

Funziona bene, come previsto.

Ora, voglio cambiarlo per arrotondare solo gli angoli superiori, quindi lo cambio in 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 degli angoli è arrotondato e ottengo un semplice rettangolo. Cosa mi sto perdendo qui?


Questa non è davvero una soluzione, ma penso che una volta ho avuto un problema simile. L'aumento dello stoke a 2 pixel ha aiutato, ma sai, non è una soluzione.
Codice poeta

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

Risposte:


304

Prova a dare questi valori:

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

Nota che sono passato 0dpa 0.1dp.

EDIT: vedi il commento di Aleks G sotto per una versione più pulita


131
Esplorando ulteriormente questo, ho trovato una soluzione ancora migliore: <corners android:radius="1dp" android:topLeftRadius="6dp" android:topRightRadius="6dp" android:bottomLeftRadius="0dp" android:bottomRightRadius="0dp"/>- questo produce angoli inferiori perfettamente quadrati senza nemmeno un accenno di arrotondamento. Tuttavia, la tua soluzione funziona praticamente.
Aleks G,

Come farlo nel codice, data una bitmap? E come aggiungere contorno (tratto AKA) attorno ad esso?
Sviluppatore Android

@Aleks G non vedo che è necessario specificareandroid:radius="1dp"
hmac

@hmac è necessario. Leggi la documentazione, lo chiarisce.
Aleks G,

@AleksG Sì, la documentazione è errata, test su Samsung 10, Android 9: "Ogni angolo deve (inizialmente) fornire un raggio d'angolo maggiore di 1, altrimenti nessun angolo è arrotondato. Se si desidera che gli angoli specifici non vengano arrotondati, un aggirare è usare android: raggio per impostare un raggio d'angolo predefinito maggiore di 1, ma poi sovrascrivere "- non è vero, specifico in basso a destra, in alto a destra, in alto a sinistra come zero e in basso a sinistra + ve e in basso a sinistra è correttamente curvo
hmac,

14

Prova a fare qualcosa del genere:

<?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 che non sia adatto per impostare un raggio d'angolo diverso del rettangolo. Quindi puoi usare questo trucco.


Vedi la mia risposta: è perfettamente accettabile avere un raggio diverso per angoli diversi.
Aleks G,

Ho provato questo approccio, non è accettabile, ide dice che non è appropriato avere un rsdius diverso e lo ignora
busylee

11

Nel mio caso sotto il 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>

1
Le proprietà superiore e inferiore sull'elemento non sono necessarie a meno che non si desideri un riempimento nella vista, ma per il resto funziona.
RominaV,

9

Basandosi sulla risposta di busylee , ecco come puoi creare un drawableche ha solo un angolo non 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 noti che quanto sopra nondrawable è mostrato correttamente nell'anteprima di Android Studio (2.0.0p7). Per visualizzare l'anteprima comunque, crea un'altra vista e usa questa come .android:background="@drawable/..."


6
@AleksG - Certo. È rilevante oggi come lo era 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 altri più moderni. Come menzionato da busylee , l'IDE si lamenta quando definisce raggi angolari diversi, il che non è il caso del presente metodo. Inoltre, poiché questa domanda è stata il mio primo successo su Google (iirc), ha avuto senso per me aggiornarlo. Ad ogni modo, sono sicuro che SO non dispiacerà qualche altro KB di codice ... :)
Dev-iL

2

Ho provato il tuo codice e ho ottenuto un pulsante angolo arrotondato in alto. Ho dato i colori come @ffffffe il tratto che ho dato #C0C0C0.

provare

  1. Dare android: bottomLeftRadius = "0.1dp" invece di 0. se non funziona
  2. Controlla in cosa è possibile disegnare e la risoluzione dell'emulatore. Ho creato una cartella disegnabile sotto res e usandola. (hdpi, mdpi ldpi) la cartella in cui hai questo XML. questa è la mia uscita.

inserisci qui la descrizione dell'immagine


Quale versione di Android è questa? La mia app deve funzionare su 1.6 - e l'emulatore 1.6 ha avuto il problema.
Aleks G,

1

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

e sotto c'è una nota.

Nota Ad ogni angolo deve essere (inizialmente) fornito un raggio d'angolo maggiore di 1, altrimenti nessun angolo viene arrotondato. Se desideri che gli angoli specifici non vengano arrotondati, una soluzione alternativa è utilizzare android: radius per impostare un raggio dell'angolo predefinito maggiore di 1, ma quindi sovrascrivere ogni angolo con i valori che desideri, fornendo zero ("0dp" ) dove non si desidera angoli arrotondati.


1

Crea roung_top_corners.xml su drawable e copia il codice qui sotto

<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle" >
<corners
    android:topLeftRadius="22dp"
    android:topRightRadius="22dp"
    android:bottomLeftRadius="0dp"
    android:bottomRightRadius="0dp"
    />
<gradient
    android:angle="180"
    android:startColor="#1d2b32"
    android:centerColor="#465059"
    android:endColor="#687079"
    android:type="linear" />
<padding
    android:left="0dp"
    android:top="0dp"
    android:right="0dp"
    android:bottom="0dp"
    />
<size
    android:width="270dp"
    android:height="60dp"
    /></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.