видаліть тінь під AppBarLayout віджет android


94

При використанні AppBarLayoutвіджета в бібліотеці підтримки дизайну внизу панелі інструментів з’являється тінь. Як я можу зняти цю тінь?

Відповіді:


233

Просто використовуйте app:elevation="0dp"всередині "AppBarLayout", щоб видалити тінь. У мене це завжди працювало. Сподіваюся, це працює для вас.


64
Не використовуйте android: elevation. Використовуйте додаток: висота.
radley

4
Чи є спосіб зробити це програмно, не отримуючи попередження про те, що встановлення висоти доступне лише після L?
davidcv5,

2
app: elevation = "0dp", відтінок видалено, але тепер вкладки не можна натискати.
Sandeep P

8
Встановлення значення 0dp приховує панель інструментів.
Shajeel Afzal 07

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.
чакрапані

Що робити з 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();

Заслуга цих двох обговорень:

Панель інструментів зникає при встановленні висоти для AppBarLayout

коли встановлено додаток: elevation = "0dp", тоді меню hamburger не відображається на панелі інструментів


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

2

Я спробував, app:elevation="0dp"але панель інструментів не відображається, але використовуючиapp:elevation="0.1dp" зробило фокус.

Сподіваюся, це допомагає комусь іншому.


0.1dp також не працює, він також приховує меню панелі інструментів.
Shajeel Afzal

У мене працює додаток з appcompat v23.0.1, користуючись цими порадами, яка у вас версія?
Георгі Обрегон

Я використовую v25.0.0.
Shajeel Afzal

2
Здається, це вже не працює з оновленими версіями :(.
Георгій Обрегон

2

Додайте додаток: 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);


0

Це спосіб, який я придумав, app:elevation="0dp"щоб прибрати тінь. Чудово працює.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.