supprimer l'ombre sous le widget AppBarLayout android

94

Lorsque vous utilisez un AppBarLayoutwidget dans la bibliothèque de support de conception, une ombre apparaît en bas de la barre d'outils. Comment puis-je supprimer cette ombre?

Abdul Rehman
la source

Réponses:

233

Utilisez simplement app:elevation="0dp""AppBarLayout" pour supprimer l'ombre. Cela a toujours fonctionné pour moi. J'espère que ça marche pour toi.

danialzahid94
la source
64
N'utilisez pas Android: élévation. Utilisez l'application: élévation.
radley
4
Existe-t-il un moyen de le faire par programme sans recevoir l'avertissement que le réglage de l'élévation n'est disponible qu'après L?
davidcv5
2
app: elevation = "0dp", l'ombre est supprimée, mais maintenant les onglets ne sont plus cliquables.
Sandeep P
8
Le définir sur 0dp masque la barre d'outils.
Shajeel Afzal
1
Malheureusement, ce n'est plus une réponse de travail. Voir la réponse de Liu Teng ci-dessous avecsetOutlineProvider
Matthew
49

ce problème ne se produit que lorsque la version de l'API> = 21, si vous ne souhaitez pas modifier l'élévation, vous pouvez utiliser:

appBar.setOutlineProvider(null);

n'oubliez pas de vérifier la version de l'API


ÉDITER :

Blow est le code source de setOutlineProvider.

   /**
     * Sets the {@link ViewOutlineProvider} of the view, which generates the Outline that defines
     * the shape of the shadow it casts, and enables outline clipping.
     * <p>
     * The default ViewOutlineProvider, {@link ViewOutlineProvider#BACKGROUND}, queries the Outline
     * from the View's background drawable, via {@link Drawable#getOutline(Outline)}. Changing the
     * outline provider with this method allows this behavior to be overridden.
     * <p>
     * If the ViewOutlineProvider is null, if querying it for an outline returns false,
     * or if the produced Outline is {@link Outline#isEmpty()}, shadows will not be cast.
     * <p>
     * Only outlines that return true from {@link Outline#canClip()} may be used for clipping.
     *
     * @see #setClipToOutline(boolean)
     * @see #getClipToOutline()
     * @see #getOutlineProvider()
     */
    public void setOutlineProvider(ViewOutlineProvider provider) {
        mOutlineProvider = provider;
        invalidateOutline();
    }

Il est dit que If the ViewOutlineProvider is null, if querying it for an outline returns false, or if the produced Outline is {@link Outline#isEmpty()}, shadows will not be cast.

Donc, si vous souhaitez supprimer l'ombre, vous feriez mieux d'utiliser cette méthode au lieu de définir app:elevation. Il semble que changer l'élévation pour supprimer l'ombre soit une sorte d'effet secondaire. Et la modification de l'élévation peut entraîner d'autres problèmes dans certains cas.

Liu Teng
la source
L'API est disponible uniquement à partir de la version 21.
chakrapani
Que faire avec API <21?
DYS
ce problème ne survient que lorsque api> = 21
Liu Teng
9

Pour tous ceux qui ne veulent pas utiliser bringToFront()et elevation="0dp"fait disparaître la barre d'outils:

app:elevation="0dp"combinded avec android:translationZ="0.1dp"travaillé pour moi.

<android.support.design.widget.AppBarLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:theme="@style/AppTheme.AppBarOverlay"
    app:elevation="0dp"
    android:translationZ="0.1dp"
    >

    <android.support.v7.widget.Toolbar
        android:id="@+id/toolbar"
        android:layout_width="match_parent"
        android:layout_height="?attr/actionBarSize"
        android:background="@null"
        app:popupTheme="@style/AppTheme.PopupOverlay"/>

</android.support.design.widget.AppBarLayout>
fupduck
la source
8

Avec les dernières versions appcompat, le paramètre d'astuce app:elevation="0.1dp"en xml ne fonctionne plus.

Jusqu'à présent, j'ai trouvé deux solutions.

  1. Au lieu de définir app:elevation, essayez d'utiliser un stateListAnimator. Par exemple, dans le code:

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
        StateListAnimator stateListAnimator = new StateListAnimator();
        stateListAnimator.addState(new int[0], ObjectAnimator.ofFloat(appBarLayout, "elevation", 0.1f));
        appBarLayout.setStateListAnimator(stateListAnimator);
    }
  2. Un moyen plus simple est de toujours définir app:elevation="0dp"en xml comme d'habitude, mais en code:

    appBarLayout.bringToFront();

Le mérite revient à ces deux discussions:

ToolBar disparaît lors de la définition de l'élévation pour AppBarLayout

lorsque l'application est définie: elevation = "0dp", le menu hamburg ne s'affiche pas dans la barre d'outils

Gaolei
la source
3

Utilisez android:stateListAnimator="@null". Aucun effet secondaire.

<android.support.design.widget.AppBarLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:animateLayoutChanges="true"
    android:stateListAnimator="@null"
    >
Softlion
la source
2

J'ai essayé app:elevation="0dp"mais la barre d'outils disparaît, mais l'utilisation a app:elevation="0.1dp"fait l'affaire.

J'espère que cela aide quelqu'un d'autre.

Gueorgui Obregon
la source
0.1dp ne fonctionne pas non plus, il masque également le menu de la barre d'outils.
Shajeel Afzal
J'ai une application fonctionnelle avec appcompat v23.0.1 en utilisant ces conseils, quelle version avez-vous?
Gueorgui Obregon
J'utilise v25.0.0.
Shajeel Afzal
2
Cela ne semble plus fonctionner avec les versions mises à jour :(.
Gueorgui Obregon
2

Ajoutez app: elevation = "0dp" sur votre AppBarLayout. comme cet exemple

<android.support.design.widget.AppBarLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    app:elevation="0dp"
    android:theme="@style/AppTheme.AppBarOverlay">

    <android.support.v7.widget.Toolbar
        android:id="@+id/toolbar"
        android:layout_width="match_parent"
        android:layout_height="?attr/actionBarSize"
        android:background="?attr/colorPrimary"
        app:popupTheme="@style/AppTheme.PopupOverlay" />

</android.support.design.widget.AppBarLayout>
Faxriddin Abdullayev
la source
Réponse salvatrice :)
user2672052
1

Par programme, vous pouvez utiliser ceci: getSupportActionBar (). SetElevation (0.0f);

Iam ByeBlogs
la source
0

C'est la façon dont j'ai proposé app:elevation="0dp"de supprimer l'ombre. Fonctionne parfaitement.

arc_shiva
la source