rimuovere l'ombra sotto il widget Android di AppBarLayout


94

Quando si utilizza il AppBarLayoutwidget nella libreria di supporto alla progettazione, viene visualizzata un'ombra nella parte inferiore della barra degli strumenti. Come posso rimuovere quell'ombra?

Risposte:


233

Usa semplicemente app:elevation="0dp""AppBarLayout" per rimuovere l'ombra. Ha sempre funzionato per me. Spero che funzioni per te.


62
Non utilizzare Android: elevazione. Usa app: elevazione.
radley

3
C'è un modo per farlo a livello di codice senza ricevere l'avviso che l'impostazione dell'elevazione è disponibile solo dopo L?
davidcv5

2
app :lift = "0dp", l'ombra viene rimossa, ma ora le schede non sono selezionabili.
Sandeep P

8
Impostandolo su 0dp si nasconde la barra degli strumenti.
Shajeel Afzal

1
Purtroppo non è più una risposta funzionante. Vedi la risposta di Liu Teng di seguito consetOutlineProvider
Matteo

49

questo problema si verifica solo quando la versione api> = 21, se non si desidera modificare l'elevazione, è possibile utilizzare:

appBar.setOutlineProvider(null);

ricordati di controllare la versione API


MODIFICARE :

Blow è il codice sorgente di 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();
    }

Si dice che 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.

Quindi, se vuoi rimuovere l'ombra, faresti meglio a usare questo metodo invece di impostare app:elevation. Sembra che modificare l'elevazione per rimuovere l'ombra sia una sorta di effetto collaterale. E la modifica dell'elevazione può causare altri problemi in alcuni casi.


L'API è disponibile solo dalla versione 21.
chakrapani

Cosa fare con API <21?
DYS

questo problema si verifica solo quando api> = 21
Liu Teng

9

Per tutti coloro che non vogliono utilizzare bringToFront()e elevation="0dp"fa sparire la barra degli strumenti:

app:elevation="0dp"combinato con android:translationZ="0.1dp"lavorato per me.

<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 le ultime versioni di appcompat, l'impostazione del trucco app:elevation="0.1dp"in xml non funziona più.

Finora ho trovato due soluzioni.

  1. Invece di impostare app:elevation, prova a utilizzare stateListAnimator. Ad esempio, nel codice:

    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 modo più semplice è ancora impostare app:elevation="0dp"in xml come di consueto, ma nel codice:

    appBarLayout.bringToFront();

Il merito va a queste due discussioni:

ToolBar scompare quando si imposta l'elevazione per AppBarLayout

quando impostato app: elevazione = "0dp", hamburgermenu non viene visualizzato nella barra degli strumenti


3

Usa android:stateListAnimator="@null". Nessun effetto collaterale.

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

2

Ho provato app:elevation="0dp"ma la barra degli strumenti scompare, ma usando ha app:elevation="0.1dp"fatto il trucco.

Spero che questo aiuti qualcun altro.


Anche 0.1dp non funziona, nasconde anche il menu della barra degli strumenti.
Shajeel Afzal

Ho un'app funzionante con appcompat v23.0.1 che utilizza questi suggerimenti, quale versione hai?
Gueorgui Obregon

Sto usando v25.0.0.
Shajeel Afzal

2
Sembra che non funzioni più con le versioni aggiornate :(.
Gueorgui Obregon

2

Aggiungi app: elevazione = "0dp" su AppBarLayout. come questo esempio

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

Risposta salvavita :)
user2672052

1

A livello di programmazione è possibile utilizzare questo: getSupportActionBar (). SetElevation (0.0f);


0

Questo è il modo in cui ho escogitato app:elevation="0dp"per rimuovere l'ombra. Funziona perfettamente.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.