удалить тень под виджетом AppBarLayout android

96

При использовании AppBarLayoutвиджета в библиотеке поддержки дизайна в нижней части панели инструментов появляется тень. Как мне убрать эту тень?

Абдул Рехман
источник

Ответы:

239

Просто используйте app:elevation="0dp"внутри «AppBarLayout», чтобы удалить тень. У меня это всегда срабатывало. Надеюсь, это сработает для вас.

danialzahid94
источник
71
Не используйте android: elevation. Используйте приложение: высота.
Radley
4
Есть ли способ сделать это программно, не получая предупреждения о том, что установка высоты доступна только после L?
davidcv5
2
app: elevation = "0dp", затемнение удалено, но вкладки теперь неактивны.
Sandeep P
8
Установка его на 0dp скрывает панель инструментов.
Шажил Афзал
1
К сожалению, больше не рабочий ответ. См Лю Тэн ответ ниже сsetOutlineProvider
Матфея
49

эта проблема возникает только при версии api> = 21, если вы не хотите менять высоту, вы можете использовать:

appBar.setOutlineProvider(null);

не забудьте проверить версию API


РЕДАКТИРОВАТЬ :

Blow - это исходный код 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();
    }

Он сказал, что 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.

Итак, если вы хотите убрать тень, вам лучше использовать этот метод вместо настройки app:elevation. Похоже, что изменение высоты для удаления тени - своего рода побочный эффект. А изменение высоты в некоторых случаях может вызвать другие проблемы.

Лю Тэн
источник
API доступен только с версии 21.
chakrapani
Что делать с API <21?
DYS
эта проблема возникает только тогда, когда api> = 21
Лю Тенг
9

Для всех, кто не хочет пользоваться bringToFront()и elevation="0dp"заставляет панель инструментов исчезать:

app:elevation="0dp"в сочетании с android:translationZ="0.1dp"работал у меня.

<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

В последних версиях appcompat настройка трюка app:elevation="0.1dp"в xml больше не работает.

Пока я нашел два решения.

  1. Вместо настройки app:elevationпопробуйте использовать stateListAnimator. Например, в коде:

    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. Более простой способ - вы по-прежнему устанавливаете app:elevation="0dp"в xml как обычно, но в коде:

    appBarLayout.bringToFront();
    

Заслуга этих двух дискуссий:

ToolBar исчезает при установке высоты для AppBarLayout

при установке app: elevation = "0dp" гамбургерменю не отображается на панели инструментов

гаолей
источник
3

Используйте android:stateListAnimator="@null". Никаких побочных эффектов.

<android.support.design.widget.AppBarLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:animateLayoutChanges="true"
    android:stateListAnimator="@null"
    >
Softlion
источник
2

Я попробовал, app:elevation="0dp"но панель инструментов исчезла, но использование помогло app:elevation="0.1dp".

Надеюсь, это поможет кому-то другому.

Георги Обрегон
источник
0.1dp тоже не работает, так же скрывает меню панели инструментов.
Шажил Афзал
У меня есть рабочее приложение с appcompat v23.0.1, использующее эти советы, какая у вас версия?
Георги Обрегон
Я использую v25.0.0.
Шажил Афзал
2
Похоже, что с обновленными версиями больше не работает :(.
Gueorgui Obregon
2

Добавьте app: elevation = "0dp" в свой AppBarLayout. как этот пример

<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>
Факсриддин Абдуллаев
источник
Спасительный ответ :)
user2672052
1

Программно вы можете использовать это: getSupportActionBar (). SetElevation (0.0f);

Iam ByeBlogs
источник
0

Это способ app:elevation="0dp"удаления тени, который я придумал, отлично работает.

arc_shiva
источник