50

Il titolo è piuttosto auto-esplicativo.Come aggiungere ombra al FAB fornito con la libreria di progettazione del supporto Android?

Il seguente codice non esegue il rendering dell'ombra al di sotto del pulsante di azione mobile. Cosa si può fare per rendere l'ombra? Questa funzione non è supportata nemmeno su API 21+?

<android.support.design.widget.FloatingActionButton 
    android:layout_height="wrap_content" 
    android:layout_width="wrap_content" 
    android:src="@drawable/ic_add" 
    android:clickable="true" /> 

Nota: L'aggiunta android:elevation non aggiunge un'ombra su API 21.

Example screenshot

Screenshot tratto dal esempio dandar3: https://github.com/dandar3/android-support-design

+0

Almeno per 21+, questo può essere applicato: https://stackoverflow.com/questions/27080338/android-5-0-androidelevation-works-for-view-but-not-button – CommonsWare

+1

Qualcosa che ho considerato, ma la rimozione di StateListAnimator non ripristina l'ombra. Ciò potrebbe essere dovuto al fatto che il FAB è in realtà un ImageView esteso non un pulsante. Strano perché FAB ha in realtà uno StateListAnimator. –

risposta

90

semplicemente impostando app:borderWidth="0dp" risolvere il problemi per me .

Nota: non dimenticare di aggiungere xmlns:app="http://schemas.android.com/apk/res-auto" al layout principale.

Questo issue dovrebbe essere corretto nella prossima versione della libreria di progettazione Android.

+1

Wow, funziona davvero ... un comportamento strano. Non riesco a immaginare che questo sia un comportamento previsto. –

+0

Funziona anche per me. Perché funziona? – Thorinside

+5

@Thorinside questo è un bug, un bug quadrato: https://code.google.com/p/android/issues/detail?id=175067 –

26

Per API 21+ è necessario impostare app:borderWidth="0dp" e app:elevation="[number]dp". Impostazione elevazione si stanno dando la dimensione d'ombra che si desidera:

Example of values for parameter "elevation"

Ecco un esempio di codice per API 21+:

<android.support.design.widget.FloatingActionButton 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    android:id="@+id/locate_user_FAB" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:src="@drawable/location_off" 
    app:elevation="6dp" 
    app:borderWidth="0dp" 
    android:layout_above="@+id/take_taxi_FAB" 
    app:backgroundTint="@color/colorAccentGrey"> 

Una cosa importante da ricordare per le API di seguito per 21 (Android 4), è per i termini di compatibilità FAB metterà un margine attorno al tuo pulsante per disegnare l'ombra. Poi si dovrebbe fare qualcosa di simile (Attualmente sto usando questo codice e lavora):

<android.support.design.widget.FloatingActionButton 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    android:id="@+id/locate_user_FAB" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:src="@drawable/location_off" 
    app:elevation="6dp" 
    app:borderWidth="0dp" 
    android:layout_above="@+id/take_taxi_FAB" 
    android:layout_alignParentRight="true" 
    android:layout_marginRight="@dimen/map_FAB_marginRight" 
    android:layout_marginBottom="@dimen/locate_user_FAB_marginBottom" 
    app:backgroundTint="@color/colorAccentGrey"> 

preferisco mettere xmlns:app="http://schemas.android.com/apk/res-auto" all'inizio del codice XML, ma io non ci mettere solo per ricordare;]

3

Se questo ancora non funziona per un po ', c'è una differenza significativa tra:

app:elevation="6dp" 
app:borderWidth="0dp" 

e

app:borderWidth="0dp" 
app:elevation="6dp" 

Order sembra importare per qualche motivo (Il primo ordine funziona, secondo non) e questo è dalla libreria di supporto 23.3.0

3

check manifesta nel progetto o biblioteche tag Application e eliminare loro

android:hardwareAccelerated="false" 
android:largeHeap="true" 

Ma se avete bisogno di queste opzioni, allora ombre e le animazioni di trasformazione non funzioneranno

3

stavo sperimentando questo stesso problema e ho preso a lavorare cancellando questo tag dal mio AndroidManifest.xml.

android:hardwareAccelerated="false" 

ho inizialmente aggiunto, unitamente android:largeHeap="true", perché ho pensato di aver bisogno per un HeatMap in cui un gran numero di punti se indicato, ma poi ho capito che potrebbe funzionare soltanto con android:largeHeap="true".