50

Tiêu đề khá tự giải thích.Làm thế nào để thêm bóng cho FAB được cung cấp với thư viện thiết kế hỗ trợ Android?

Đoạn mã sau không hiển thị bóng bên dưới Nút tác vụ nổi. Có thể làm gì để render bóng? Tính năng này có thực sự không được hỗ trợ ngay cả trên API 21+ không?

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

Lưu ý: Thêm android:elevation không thêm bóng trên API 21.

Example screenshot

Ảnh chụp màn hình lấy từ ví dụ bằng cách dandar3: https://github.com/dandar3/android-support-design

+0

Ít nhất là 21+, điều này có thể áp dụng: https://stackoverflow.com/questions/27080338/android-5-0-androidelevation-works-for-view-but-not-button – CommonsWare

+1

Điều tôi đã cân nhắc nhưng loại bỏ các StateListAnimator không mang lại bóng tối. Điều này có thể là do FAB thực sự là một ImageView mở rộng không phải là một Button. Lạ vì FAB thực sự có một StateListAnimator. –

Trả lời

90

Đơn giản chỉ cần thiết lập app:borderWidth="0dp" quyết vấn đề này cho tôi .

Lưu ý: đừng quên thêm xmlns:app="http://schemas.android.com/apk/res-auto" vào bố cục gốc của bạn.

Điều này issue phải được khắc phục trong bản phát hành tiếp theo của thư viện thiết kế Android.

+1

Chà, điều đó thực sự hoạt động ... hành vi kỳ lạ. Tôi không thể tưởng tượng rằng đây là hành vi mong đợi. –

+0

Làm việc cho tôi. Tại sao nó hoạt động? – Thorinside

+5

@Thorinside đây là lỗi, một lỗi hình vuông: https://code.google.com/p/android/issues/detail?id=175067 –

26

Đối với API 21+ bạn cần đặt app:borderWidth="0dp"app:elevation="[number]dp". Đặt độ cao bạn đang đưa ra kích thước của bóng mà bạn muốn:

Example of values for parameter "elevation"

Dưới đây là một ví dụ về mã cho API trên 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"> 

Một điều quan trọng cần nhớ cho API dưới đây để 21 (Android 4), là dành cho các điều khoản tương thích FAB sẽ đặt một lề xung quanh nút của bạn để vẽ bóng. Sau đó, bạn nên làm một cái gì đó như thế (Tôi hiện đang sử dụng đoạn mã này và công trình):

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

Tôi thích đặt xmlns:app="http://schemas.android.com/apk/res-auto" vào đầu của XML, nhưng tôi đặt ở đó chỉ để nhắc nhở bạn;]

3

Nếu điều này vẫn không làm việc cho một số người, có sự khác biệt đáng kể giữa:

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

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

thứ dường như quan trọng đối với một số lý do (Trình tự đầu tiên hoạt động, thứ hai không) và điều này là từ các thư viện hỗ trợ 23.3.0

3

Kiểm tra biểu hiện trong dự án hoặc các thư viện trong thẻ Application và xóa họ

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

Nhưng nếu bạn cần các tùy chọn sau đó bóng tối và hình ảnh động chuyển đổi sẽ không làm việc

3

tôi đã gặp vấn đề này cùng và tôi đã nhận nó để làm việc bằng cách xóa thẻ này khỏi AndroidManifest.xml của tôi.

android:hardwareAccelerated="false" 

Tôi ban đầu thêm vào đó, cùng với android:largeHeap="true", bởi vì tôi nghĩ rằng tôi cần nó cho một bản đồ nhiệt.Nên trong đó một số lượng lớn các điểm nơi hiển thị, nhưng sau đó tôi nhận ra nó có thể chỉ làm việc với android:largeHeap="true".

Các vấn đề liên quan