usuń cień poniżej widżetu AppBarLayout android


96

Podczas korzystania z AppBarLayoutwidgetu w bibliotece wsparcia projektowania, na dole paska narzędzi pojawia się cień. Jak mogę usunąć ten cień?

Odpowiedzi:


239

Po prostu użyj app:elevation="0dp"wewnątrz „AppBarLayout”, aby usunąć cień. Zawsze mi się to udało. Mam nadzieję, że to działa dla Ciebie.


71
Nie używaj android: Elevation. Użyj aplikacji: wysokość.
radley

4
Czy można to zrobić programowo bez ostrzeżenia, że ​​ustawienie wysokości jest dostępne tylko po L?
davidcv5

2
app: elevation = "0dp", cień zostanie usunięty, ale teraz karty nie są klikalne.
Sandeep P

8
Ustawienie go na 0dp powoduje ukrycie paska narzędzi.
Shajeel Afzal

1
Niestety już nie działa. Zobacz odpowiedź Liu Teng poniżejsetOutlineProvider
Matthew

49

ten problem występuje tylko wtedy, gdy wersja api> = 21, jeśli nie chcesz zmieniać elewacji, możesz użyć:

appBar.setOutlineProvider(null);

pamiętaj, aby sprawdzić wersję api


EDYTOWAĆ :

Blow jest kodem źródłowym 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();
    }

Mówi się, że 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.

Tak więc, jeśli chcesz usunąć cień, lepiej użyj tej metody zamiast ustawiania app:elevation. Wygląda na to, że zmiana elewacji w celu usunięcia cienia jest pewnego rodzaju efektem ubocznym. W niektórych przypadkach zmiana wysokości może powodować inne problemy.


API jest dostępne tylko od wersji 21.
chakrapani

Co zrobić z API <21?
DYS,

ten problem występuje tylko wtedy, gdy api> = 21
Liu Teng

9

Dla wszystkich, którzy nie chcą używać bringToFront()i elevation="0dp"sprawiają, że pasek narzędzi znika:

app:elevation="0dp"w połączeniu z android:translationZ="0.1dp"pracował dla mnie.

<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

Z najnowszymi wersjami appcompat, ustawienie triku app:elevation="0.1dp"w xml już nie działa.

Do tej pory znalazłem dwa rozwiązania.

  1. Zamiast ustawiać app:elevation, spróbuj użyć stateListAnimator. Na przykład w kodzie:

    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. Łatwiejszym sposobem jest to, że nadal ustawiasz app:elevation="0dp"w XML jak zwykle, ale w kodzie:

    appBarLayout.bringToFront();
    

Zasługa tych dwóch dyskusji:

ToolBar znika podczas ustawiania wysokości dla AppBarLayout

po ustawieniu app: elevation = "0dp" wtedy hamburgermenu nie wyświetla się na pasku narzędzi


3

Użyj android:stateListAnimator="@null". Brak efektu ubocznego.

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

2

Próbowałem, app:elevation="0dp"ale pasek narzędzi zniknął, ale używamapp:elevation="0.1dp" .

Mam nadzieję, że to pomoże komuś innemu.


0.1dp również nie działa, ukrywa również menu paska narzędzi.
Shajeel Afzal

Mam działającą aplikację z appcompat v23.0.1 korzystającą z tych wskazówek, jaką masz wersję?
Gueorgui Obregon

Używam v25.0.0.
Shajeel Afzal

2
Wygląda na to, że nie działa już ze zaktualizowanymi wersjami :(.
Gueorgui Obregon,

2

Dodaj app: elevation = "0dp" do swojego AppBarLayout. jak ten przykład

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



0

To jest sposób, w jaki wymyśliłem app:elevation="0dp"usuwanie cienia, działa idealnie.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.