Làm thế nào để tạo một nút hành động nổi (FAB) trong Android bằng AppCompat v21?


79

Tôi muốn tạo một nút hành động nổi (để thêm các mục vào chế độ xem danh sách), như lịch google, duy trì khả năng tương thích với các phiên bản Android tiền lollipop (trước 5.0).

Tôi đã tạo bố cục này:

Hoạt động main_activity.xml:

<LinearLayout ... >

     <include
         layout="@layout/toolbar"/>

     <RelativeLayout ... >

     <!-- My rest of the layout -->

          <!-- Floating action button -->
          <ImageButton style="@style/AppTheme"
                     android:layout_width="60dp"
                     android:layout_height="60dp"
                     android:text="New Button"
                     android:id="@+id/button"
                     android:src="@drawable/ic_fab"
                     android:background="@drawable/fab"
                     android:layout_alignParentBottom="true"
                     android:layout_alignParentRight="true"
                     android:layout_marginBottom="24dp"
                     android:layout_marginRight="24dp"/>

     </RelativeLayout>

 </LinearLayout>

Có thể vẽ fab.xml:

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
       android:shape="oval">
    <solid android:color="#ffa48bc0"/>
</shape>

Tạo kiểu styles.xml

<resources>
    <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
        <item name="colorPrimary">#ff1d79b1</item>
        <item name="colorPrimaryDark">#ff084d95</item>
    </style>
</resources>

Kết quả là tương tự, nhưng không có bóng mờ, một đặc điểm của thiết kế material design:

Nút tác vụ nổi của lịch:

Nút tác vụ nổi của lịch

Nút tác vụ nổi của ứng dụng của tôi:

Nút tác vụ nổi của ứng dụng của tôi

Làm cách nào để thêm bóng vào nút của tôi?

Tôi đã sử dụng độ cao thuộc tính, nhưng không hoạt động


1
API độ cao chỉ dành cho Lollipop, bạn đã thử trên thiết bị Lollipop chưa?
Marc Plano-Lesay

2
Có lẽ đã đến lúc bạn chấp nhận một trong những câu trả lời đã cho.
Phantômaxx

Trên thực tế, trên chiếc Samsung Galaxy S III 4.4.2 của tôi, bóng tối ở đó, nhờ vào AppCompat.
FractalBob,

Câu trả lời:


100

Không còn cần thiết phải tạo FAB của riêng bạn cũng như sử dụng thư viện của bên thứ ba, nó đã được đưa vào AppCompat 22.

https://developer.android.com/reference/android/support/design/widget/FloatingActionButton.html

Chỉ cần thêm thư viện hỗ trợ mới được gọi là thiết kế trong tệp gradle của bạn:

compile 'com.android.support:design:22.2.0'

... và bạn tốt để đi:

<android.support.design.widget.FloatingActionButton
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="bottom"
        android:layout_margin="16dp"
        android:clickable="true"
        android:src="@drawable/ic_happy_image" />

1
làm thế nào để bạn thay đổi màu nền?
Jjang

2
Theo mặc định, màu nền sẽ là "colorAccent" từ chủ đề của bạn. Tuy nhiên, bạn cũng có thể sử dụng floatActionButton.setRippleColor (color), đừng để cái tên 'ripple' làm bạn sợ hãi, nó cũng hoạt động trên các thiết bị tiền kẹo mút.
dùng1354603

Tôi không có colorAccent, và nếu tôi thêm một cái và đặt màu khác thì nó không hoạt động - màu dính vào màu xanh lá cây / turquise.
Jjang

Tôi đã sử dụng một bên thứ ba cho việc này. Thực sự đã giúp tôi rất nhiều. Cảm ơn. Một vấn đề với điều này là, nó vẫn có cảm giác như nó chưa được phát triển hoàn chỉnh.
V_J

1
@Jjang @ user1354603 từ tài liệuThe background color of this view defaults to the your theme's colorAccent. If you wish to change this at runtime then you can do so via setBackgroundTintList(ColorStateList).
Muhammad Babar

43

Tôi thường sử dụng các bảng có thể kéo xml để tạo bóng / độ cao trên một widget tiền kẹo mút. Ví dụ ở đây là một tệp có thể vẽ xml có thể được sử dụng trên các thiết bị tiền kẹo mút để mô phỏng độ cao của nút tác vụ nổi.

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:top="8px">
    <layer-list>
        <item>
            <shape android:shape="oval">
                <solid android:color="#08000000"/>
                <padding
                    android:bottom="3px"
                    android:left="3px"
                    android:right="3px"
                    android:top="3px"
                    />
            </shape>
        </item>
        <item>
            <shape android:shape="oval">
                <solid android:color="#09000000"/>
                <padding
                    android:bottom="2px"
                    android:left="2px"
                    android:right="2px"
                    android:top="2px"
                    />
            </shape>
        </item>
        <item>
            <shape android:shape="oval">
                <solid android:color="#10000000"/>
                <padding
                    android:bottom="2px"
                    android:left="2px"
                    android:right="2px"
                    android:top="2px"
                    />
            </shape>
        </item>
        <item>
            <shape android:shape="oval">
                <solid android:color="#11000000"/>
                <padding
                    android:bottom="1px"
                    android:left="1px"
                    android:right="1px"
                    android:top="1px"
                    />
            </shape>
        </item>
        <item>
            <shape android:shape="oval">
                <solid android:color="#12000000"/>
                <padding
                    android:bottom="1px"
                    android:left="1px"
                    android:right="1px"
                    android:top="1px"
                    />
            </shape>
        </item>
        <item>
            <shape android:shape="oval">
                <solid android:color="#13000000"/>
                <padding
                    android:bottom="1px"
                    android:left="1px"
                    android:right="1px"
                    android:top="1px"
                    />
            </shape>
        </item>
        <item>
            <shape android:shape="oval">
                <solid android:color="#14000000"/>
                <padding
                    android:bottom="1px"
                    android:left="1px"
                    android:right="1px"
                    android:top="1px"
                    />
            </shape>
        </item>
        <item>
            <shape android:shape="oval">
                <solid android:color="#15000000"/>
                <padding
                    android:bottom="1px"
                    android:left="1px"
                    android:right="1px"
                    android:top="1px"
                    />
            </shape>
        </item>
        <item>
            <shape android:shape="oval">
                <solid android:color="#16000000"/>
                <padding
                    android:bottom="1px"
                    android:left="1px"
                    android:right="1px"
                    android:top="1px"
                    />
            </shape>
        </item>
        <item>
            <shape android:shape="oval">
                <solid android:color="#17000000"/>
                <padding
                    android:bottom="1px"
                    android:left="1px"
                    android:right="1px"
                    android:top="1px"
                    />
            </shape>
        </item>
    </layer-list>
</item>
<item>
    <shape android:shape="oval">
        <solid android:color="?attr/colorPrimary"/>
    </shape>
</item>
</layer-list>

Thay vào đó ?attr/colorPrimarybạn có thể chọn bất kỳ màu nào. Đây là ảnh chụp màn hình kết quả:

nhập mô tả hình ảnh ở đây


1
Cảm ơn vì đã chia sẻ. Tôi sợ phải đào lại mã XML để tạo lại mã này.
Cookster

Tôi đã thực hiện ngay bây giờ và nó là tuyệt vời, chỉ có một điều kỳ lạ. Có vẻ như khi bạn xoay điện thoại, bóng / độ cao bị mất. Bất kỳ suy nghĩ về điều đó? Cảm ơn trước Justin
Amilcar Andrade

@AmilcarAndrade đó là một câu hỏi hay. Tôi đã gặp những điều tương tự với các tệp có thể kéo xml khác, nhưng tôi thực sự đang trích xuất một bitmap từ chính tệp có thể vẽ được. Để giải quyết điều đó, về cơ bản tôi đã sử dụng drawable như một singleton; đặt một lần để nó không bị vẽ lại. Có lẽ bạn có thể lấy drawable dưới dạng biến static và đặt nó làm nền trong onCreate?
Justin Pollard

Ngoài ra, tôi đã thêm một tính năng nâng cao, bạn có thể thêm hiệu ứng riple thực sự dễ dàng, dưới đây là mã.
Amilcar Andrade

2
Đối với các tài liệu tham khảo trong tương lai, đây là một ví dụ tuyệt vời để tránh bóng tối và độ cao -> tò mò
creature.com/2008/



4

@Justin Pollard mã xml hoạt động thực sự tốt. Ngoài ra, bạn có thể thêm hiệu ứng gợn sóng với các dòng xml sau.

    <item>
    <ripple
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:color="?android:colorControlHighlight" >
        <item android:id="@android:id/mask">
            <shape android:shape="oval" >
                <solid android:color="#FFBB00" />
            </shape>
        </item>
        <item>
            <shape android:shape="oval" >
                <solid android:color="@color/ColorPrimary" />
            </shape>
        </item>
    </ripple>
</item>


0

Thêm phần đệm và độ cao:

 android:elevation="10dp"
 android:padding="10dp"
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.