Как добавить тень в FAB, предоставляемую библиотекой дизайна поддержки Android?

Название довольно объяснительно.

Следующий код не отображает тень ниже плавающей кнопки действия. Что можно сделать, чтобы сделать тень? Эта функция действительно не поддерживается даже на 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" />

Примечание. Добавление android:elevation не добавляет тень в API 21.

Example screenshot

Снимок экрана, взятый из примера с помощью dandar3: https://github.com/dandar3/android-support-design

Ответ 1

Просто установите app:borderWidth="0dp" для устранения этих проблем.

Примечание. не забудьте добавить xmlns:app="http://schemas.android.com/apk/res-auto" в корневую компоновку.

Этот issue должен быть исправлен в следующей версии библиотеки дизайна Android.

Ответ 2

Для API 21+ вам нужно установить app:borderWidth="0dp" и app:elevation="[number]dp". При настройке высоты вы придаете размер тени, который вы хотите:

Example of values for parameter "elevation"

Вот пример кода для 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">

Одна важная вещь, которую следует помнить для API ниже до 21 (Android 4), - это условия совместимости. FAB добавит поля вокруг вашей кнопки, чтобы нарисовать тень. Тогда вы должны сделать что-то подобное (я в настоящее время использую этот код и работает):

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

Я предпочитаю помещать xmlns:app="http://schemas.android.com/apk/res-auto" в начало XML, но я помещаю туда, чтобы напомнить вам;]

Ответ 3

Если это еще не работает для некоторых, существует значительная разница между:

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

и

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

Порядок, по-видимому, имеет значение по какой-либо причине (первый порядок работает, второй - нет), и это из библиотеки поддержки 23.3.0

Ответ 4

Проверить манифест в проекте или библиотеках в теге Application и удалить их

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

Но если вам нужны эти параметры, тени и анимация преобразования не будут работать

Ответ 5

У меня возникла эта же проблема, и я получил ее для работы, удалив этот тег из моего AndroidManifest.xml.

android:hardwareAccelerated="false"

Я сначала добавил его вместе с android:largeHeap="true", потому что думал, что мне это нужно для HeatMap, в котором показано большое количество точек, но потом я понял, что он может работать только с android:largeHeap="true".