web-dev-qa-db-fra.com

Android ScrollView écrêtage de l'ombre d'élévation de l'enfant

Comme le titre l'indique, j'essaie de mettre un CardView à l'intérieur d'un ScrollView, mais l'ombre d'élévation de CardView est désactivée par son parent ...

Voici le XML de mise en page:

<FrameLayout
    xmlns:Android="http://schemas.Android.com/apk/res/Android"
    xmlns:app="http://schemas.Android.com/apk/res-auto"
    xmlns:tools="http://schemas.Android.com/tools"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent"
    tools:context=".TestScrollViewActivity">

    <Android.support.v7.widget.Toolbar
        Android:id="@+id/toolbar"
        Android:layout_width="match_parent"
        Android:layout_height="128dp"
        Android:background="?colorPrimary"
        Android:gravity="bottom"
        Android:minHeight="?actionBarSize"/>

    <ScrollView
        Android:layout_width="wrap_content"
        Android:layout_height="match_parent"
        Android:layout_gravity="center_horizontal"
        Android:clipToPadding="false"
        Android:paddingBottom="40dp"
        Android:paddingTop="60dp">

        <Android.support.v7.widget.CardView
            Android:layout_width="wrap_content"
            Android:layout_height="wrap_content"
            Android:elevation="4dp"
            app:cardBackgroundColor="@Android:color/white"
            app:cardCornerRadius="0dp">

            <LinearLayout
                Android:layout_width="400dp"
                Android:layout_height="600dp"
                Android:orientation="vertical">

            </LinearLayout>

        </Android.support.v7.widget.CardView>

    </ScrollView>

</FrameLayout>

La seule solution de contournement que j'ai trouvée consiste à ajouter un remplissage au ScrollView parent ou à ajouter une marge au CardView enfant ...

Existe-t-il une option pour empêcher cela de se produire sans utiliser de remplissage/marge?

Merci.

Éditer:

Voici à quoi ressemble la disposition sans définir de remplissage sur la vue de défilement parent, comme on peut le voir, les ombres gauche et droite sont coupées: Child's side shadow being cut off by parent scroll view

Maintenant, si un remplissage est ajouté aux côtés de la vue de défilement parent, les ombres sont dessinées correctement comme on peut le voir ici: Child's side shadow now shown correctly after adding padding to right and left side of scrollview

Donc, ma principale question ici est la seule façon d'y parvenir?, Ou il y a une balise ou une configuration sur la vue parent qui permet de dessiner correctement ses vues enfants?

17
vicmns

cela a juste fonctionné pour moi dans un problème similaire:

la bonne façon d'obtenir une vue enfant pour montrer l'ombre est de définir un remplissage sur le parent et de définir Android: clipToPadding = "false" sur ce parent.

comme trouvé ici: "élévation" Android ne montrant pas d'ombre

53
Anthea

J'étais confronté au même problème, je l'ai résolu en ajoutant cardUseCompatPadding attribut à la vue de la carte:

app:cardUseCompatPadding="true"

L'ombre ne sera pas découpée ou recadrée après avoir utilisé cette solution.

33
Sina Masnadi