remova a sombra abaixo do widget AppBarLayout android

94

Ao usar o AppBarLayoutwidget na biblioteca de suporte de design, uma sombra aparece na parte inferior da barra de ferramentas. Como posso remover essa sombra?

Abdul Rehman
fonte

Respostas:

233

Basta usar app:elevation="0dp"dentro de "AppBarLayout" para remover a sombra. Sempre trabalhou para mim. Espero que funcione para você.

danialzahid94
fonte
62
Não use android: elevação. Use app: elevação.
radley
3
Existe uma maneira de fazer isso programaticamente sem receber o aviso de que a elevação de configuração só está disponível após L?
davidcv5
2
app: elevation = "0dp", a sombra foi removida, mas agora as guias não são clicáveis.
Sandeep P de
8
Definir como 0dp está ocultando a barra de ferramentas.
Shajeel Afzal
1
Infelizmente, não é mais uma resposta funcional. Veja a resposta de Liu Teng abaixo comsetOutlineProvider
Mateus
49

esse problema só ocorre quando api version> = 21, se você não quiser alterar a elevação, você pode usar:

appBar.setOutlineProvider(null);

lembre-se de verificar a versão da API


EDITAR:

Blow é o código-fonte 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();
    }

É dito 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.

Portanto, se você deseja remover a sombra, é melhor usar este método em vez de configurar app:elevation. Parece que alterar a elevação para remover a sombra é uma espécie de efeito colateral. E alterar a elevação pode causar alguns outros problemas em alguns casos.

Liu Teng
fonte
API está disponível apenas a partir da versão 21.
chakrapani
O que fazer com API <21?
DYS
esse problema só ocorre quando api> = 21
Liu Teng
9

Para todos aqueles que não querem usar bringToFront()e elevation="0dp"faz desaparecer a barra de ferramentas:

app:elevation="0dp"combinada com android:translationZ="0.1dp"funcionou para mim.

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

Com as versões mais recentes do appcompat, a configuração do truque app:elevation="0.1dp"em xml não funciona mais.

Até agora, encontrei duas soluções.

  1. Em vez de definir app:elevation, tente usar um stateListAnimator. Por exemplo, no 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. Uma maneira mais fácil é ainda definir app:elevation="0dp"em xml normalmente, mas em código:

    appBarLayout.bringToFront();

O crédito vai para essas duas discussões:

ToolBar desaparece ao definir a elevação para AppBarLayout

quando set app: elevation = "0dp" then hamburgermenu not show to toolbar

Gaolei
fonte
3

Use android:stateListAnimator="@null". Sem efeito colateral.

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

Tentei, app:elevation="0dp"mas a barra de ferramentas desapareceu, mas o uso app:elevation="0.1dp"fez o truque.

Espero que isso ajude mais alguém.

Gueorgui Obregon
fonte
0.1dp também não está funcionando, também está escondendo o menu da barra de ferramentas.
Shajeel Afzal
Tenho um aplicativo funcional com appcompat v23.0.1 usando essas dicas, qual versão você tem?
Gueorgui Obregon
Estou usando v25.0.0.
Shajeel Afzal
2
Parece não funcionar mais com as versões atualizadas :(.
Gueorgui Obregon
2

Adicione app: elevation = "0dp" em seu AppBarLayout. como este exemplo

<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
fonte
Resposta para salvar vidas :)
user2672052
1

Programaticamente, você pode usar isto: getSupportActionBar (). SetElevation (0.0f);

Iam ByeBlogs
fonte
0

Esta é a maneira que eu app:elevation="0dp"criei para remover a sombra. Funciona perfeitamente.

arc_shiva
fonte