web-dev-qa-db-fra.com

Comment créer un bouton d'action flottant sous Android avec AppCompat v21?

J'aimerais créer un bouton d'action flottant (pour ajouter des éléments à une liste), comme un agenda Google, en maintenant la compatibilité avec les versions antérieures à Lollipop Android (antérieures à la version 5.0).

J'ai créé cette mise en page:

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

Fab.xml dessinable:

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

Style styles.xml

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

Le résultat est similaire, mais il n'y a pas d'ombrage, caractéristique du design des matériaux:

Bouton d'action flottant du calendrier:

Calendar's floating action button

Le bouton d'action flottant de mon application:

My app's floating action button

Comment puis-je ajouter l'ombrage à mon bouton?

J'ai déjà utilisé l'attribut altitude, mais ne fonctionne pas

77
FirestormXYZ

Il n'est plus nécessaire de créer votre propre FAB ni d'utiliser une bibliothèque tierce, elle était incluse dans AppCompat 22.

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

Ajoutez simplement la nouvelle bibliothèque de support appelée design in dans votre fichier de classement:

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

... et vous êtes prêt à partir:

<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" />
99
user1354603

J'ai généralement utilisé XML Drawables pour créer une ombre/élévation sur un widget pré-Lollipop. Voici, par exemple, un dessin XML pouvant être utilisé sur des appareils pré-Lollipop pour simuler l’élévation du bouton d’action flottante.

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

Au lieu de ?attr/colorPrimary, vous pouvez choisir n'importe quelle couleur. Voici une capture d'écran du résultat:

enter image description here

43
Justin Pollard

Il existe de nombreuses bibliothèques qui ajoutent un FAB (bouton d'action flottant) à votre application. En voici quelques-unes que je connais.

FAB de makovkastar

FAB composite de futuersimple

bibliothèque de conception de matériaux incluant FAB également

Toutes ces bibliothèques sont supportées sur les périphériques pré-Lollipop, minimum à api 8

20
QAMAR

Voici une version supplémentaire gratuite bibliothèque de boutons d'action flottants pour Android Elle comporte de nombreuses personnalisations et nécessite le SDK version 9 ou ultérieure.

enter image description here

Full Demo Video

8
Vladyslav Baidak

@Justin Pollard Le code XML fonctionne vraiment bien. En guise de remarque, vous pouvez ajouter un effet d'entraînement avec les lignes XML suivantes.

    <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>
4
Amilcar Andrade

Essayez cette bibliothèque , il supporte les ombres, il y a minSdkVersion=7 et prend également en charge Android:elevation l'attribut pour API-21 implicitement.

La publication originale est ici .

2
Oleksii K.

Ajouter un rembourrage et une élévation:

 Android:elevation="10dp"
 Android:padding="10dp"
0
Simas