web-dev-qa-db-fra.com

Comment définir correctement la valeur d'altitude sur recyclerview?

Je travaille sur la disposition de la grille en utilisant recyclerview dans Android. La grille occupe une partie de l'écran et comporte une ombre. Pour obtenir l'effet d'ombre souhaité, j'utilise une valeur d'élévation de 12 dp. Mais cela ne semble pas fonctionner car je ne peux voir aucune élévation (ombre) de la grille. Pourquoi cela arrive-t-il? Recyclerview ne prend-il pas en charge l'altitude?

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:tools="http://schemas.Android.com/tools"
Android:layout_width="match_parent"
Android:id="@+id/activity_grid_layout"
Android:background="@drawable/gradient"
Android:layout_height="match_parent"
tools:context="com.mindhive.mindhive.activities.GridActivity">

<Android.support.v7.widget.RecyclerView
    Android:id="@+id/grid_recycler_view"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent"
    Android:layout_marginBottom="110dp"
    Android:layout_marginLeft="15dp"
    Android:layout_marginTop="80dp"
    Android:background="@color/transparent"
    Android:elevation="12dp"
    Android:scrollIndicators="none"
    Android:scrollbars="none"
    Android:padding="0dp" />

<ImageView
    Android:id="@+id/imageView"
    Android:layout_width="wrap_content"
    Android:layout_height="wrap_content"
    Android:layout_alignBottom="@+id/grid_recycler_view"
    Android:layout_alignStart="@+id/grid_recycler_view"
    Android:layout_marginBottom="-18dp"
    Android:layout_marginStart="67dp"
    Android:src="@drawable/main_filter"
    Android:elevation="1dp" />
 ......
12
Neanderthal

J'ai trouvé la réponse après un peu de recherche de ici . Le problème était le fond transparent. Elevation fonctionne uniquement avec des arrière-plans non transparents sur les vues. Pour résoudre ce problème, nous devons définir Android:outlineProvider="bounds" sur la vue et Android:clipToPadding="false" sur le parent de la vue. 

J'espère que ça aide quelqu'un.

19
Neanderthal

Pour Lollipop et vous pouvez utiliser la propriété Android: elevation, mais en dessous des versions de Lollipop, vous devez donner une ombre personnalisée.

card_background.xml 

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:Android="http://schemas.Android.com/apk/res/Android">
<item>
    <shape Android:shape="rectangle">
        <solid Android:color="#CABBBBBB"/>
        <corners Android:radius="2dp" />
    </shape>
</item>

<item
    Android:left="0dp"
    Android:right="0dp"
    Android:top="0dp"
    Android:bottom="2dp">
    <shape Android:shape="rectangle">
        <solid Android:color="@Android:color/white"/>
        <corners Android:radius="2dp" />
    </shape>
</item>
</layer-list>

Donnez ce fichier comme arrière-plan à votre fichier inflage recyclerview qui fonctionnera correctement.

3
Sachin Mandhare

Android: Elevation n'applique que les ombres sur les appareils exécutant Lollipop ou une version ultérieure. Si vous souhaitez prendre en charge des appareils plus anciens, vous devez créer une ombre vous-même.

0
Daniel Zolnai