web-dev-qa-db-fra.com

android: l'élévation n'a que des effets d'ombre sur le côté inférieur, comment faire apparaître les effets d'ombre sur le côté supérieur?

J'utilise un framelayout en bas d'une activité, afin de montrer les effets d'ombre sur le fragment, j'ajoute Android: élévation. Mais les effets d'ombre n'apparaissent qu'en bas et non en haut, quelqu'un pourrait-il me donner quelques conseils?

<FrameLayout
    Android:id="@+id/bottom_container"
    Android:background="#00737f"
    Android:layout_width="match_parent"
    Android:layout_height="50dp"
    Android:layout_gravity="bottom"
    Android:elevation="4dp"
    Android:layout_alignParentBottom="true"
    Android:layout_marginBottom="50dp"/>
28
Jayce

Il existe une astuce qui peut être utilisée pour afficher une ombre au-dessus d'une vue.

Fondamentalement, nous devons utiliser deux dispositions imbriquées, où la disposition extérieure projette l'ombre avec un elevation et la disposition intérieure définit le background. Ensuite, en définissant un padding sur la disposition extérieure, nous pouvons déplacer la disposition intérieure vers le bas, sans déplacer l'ombre, ainsi une plus grande partie de l'ombre devient visible:

<FrameLayout
    Android:layout_width="match_parent"
    Android:layout_height="50dp"
    Android:layout_alignParentBottom="true"
    Android:layout_marginBottom="50dp"
    Android:elevation="4dp"
    Android:outlineProvider="bounds"
    Android:paddingTop="2dp"
    Android:layout_marginTop="-2dp">

    <FrameLayout
        Android:layout_width="match_parent"
        Android:layout_height="match_parent"
        Android:background="#00737f">

        <!-- content -->

    </FrameLayout>

</FrameLayout>

Une chose importante ici est l'attribut outlineProvider, qui est nécessaire pour faire de la mise en page externe une ombre même sans avoir d'arrière-plan.

De plus, nous spécifions un margin négatif pour compenser le décalage créé par le remplissage. Selon le cas d'utilisation, nous pouvons omettre cela.

Mais attention: si nous décalons trop la vue, certains artefacts de rendu deviennent visibles:

Android elevation shadow offset examples

Source de cet exemple sur Github

27
Floern