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