eliminar la sombra debajo del widget AppBarLayout de Android


94

Cuando se usa un AppBarLayoutwidget en la biblioteca de soporte de diseño, aparece una sombra en la parte inferior de la barra de herramientas. ¿Cómo puedo eliminar esa sombra?

Respuestas:


233

Simplemente use app:elevation="0dp"dentro de "AppBarLayout" para eliminar la sombra. Siempre me ha funcionado. Espero que funcione para ti.


64
No uses Android: Elevación. Aplicación de uso: elevación.
Radley

4
¿Hay alguna manera de hacerlo programáticamente sin recibir la advertencia de que la configuración de elevación solo está disponible después de L?
davidcv5

2
aplicación: elevación = "0dp", se elimina la sombra, pero ahora no se puede hacer clic en las pestañas.
Sandeep P

8
Establecerlo en 0dp está ocultando la barra de herramientas.
Shajeel Afzal

1
Desafortunadamente, ya no es una respuesta funcional. Vea la respuesta de Liu Teng a continuación consetOutlineProvider
Mateo

49

este problema solo ocurre cuando la versión de api> = 21, si no desea cambiar la elevación, puede usar:

appBar.setOutlineProvider(null);

recuerde verificar la versión de api


EDITAR:

Blow es el código fuente 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();
    }

Se dice 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.

Por lo tanto, si desea eliminar la sombra, será mejor que use este método en lugar de configurar app:elevation. Parece que cambiar la elevación para eliminar la sombra es una especie de efecto secundario. Y cambiar la elevación puede causar otros problemas en algunos casos.


API está disponible solo a partir de la versión 21.
chakrapani

¿Qué hacer con API <21?
DYS

este problema solo ocurre cuando api> = 21
Liu Teng

9

Para todos aquellos que no quieran usar bringToFront()y elevation="0dp"hace desaparecer la barra de herramientas:

app:elevation="0dp"combinado con android:translationZ="0.1dp"funcionó para mí.

<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>

8

Con las últimas versiones de appcompat, la configuración de trucos app:elevation="0.1dp"en xml ya no funciona.

Hasta ahora he encontrado dos soluciones.

  1. En lugar de configurar app:elevation, intente usar un stateListAnimator. Por ejemplo, en código:

    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. Una forma más fácil es seguir configurando app:elevation="0dp"xml como de costumbre, pero en el código:

    appBarLayout.bringToFront();

El crédito va a estas dos discusiones:

ToolBar desaparece al configurar la elevación para AppBarLayout

cuando se establece la aplicación: elevación = "0dp", el menú de hamburguesas no se muestra en la barra de herramientas


3

Utilice android:stateListAnimator="@null". Sin efectos secundarios.

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

2

Lo intenté, app:elevation="0dp"pero la barra de herramientas desapareció, pero el uso app:elevation="0.1dp"hizo el truco.

Espero que esto ayude a alguien más.


0.1dp tampoco funciona, también oculta el menú de la barra de herramientas.
Shajeel Afzal

Tengo una aplicación que funciona con appcompat v23.0.1 usando estos consejos, ¿qué versión tienes?
Gueorgui Obregón

Estoy usando v25.0.0.
Shajeel Afzal

2
Parece que ya no funciona con las versiones actualizadas :(.
Gueorgui Obregon

2

Agregue la aplicación: elevación = "0dp" en su AppBarLayout. como este ejemplo

<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>

Respuesta para salvar vidas :)
user2672052

1

Programáticamente puede usar esto: getSupportActionBar (). SetElevation (0.0f);


0

Esta es la forma que se me ocurrió app:elevation="0dp"para eliminar la sombra. Funciona perfectamente.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.