删除AppBarLayout小部件android下面的阴影


Answers:


233

只需app:elevation="0dp"在“ AppBarLayout”内部使用即可删除阴影。它一直为我工作。希望对你有效。


62
不要使用android:elevation。使用app:海拔。
radley

3
有没有一种方法可以通过编程方式做到这一点而又不会收到仅在L之后才提供设置高程的警告?
davidcv5

2
app:elevation =“ 0dp”,阴影已删除,但现在选项卡不可单击。
Sandeep P

8
将其设置为0dp隐藏了工具栏。
Shajeel Afzal

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时才出现此问题
Liu Teng

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的高程时,ToolBar消失

设置app:elevation =“ 0dp”时,hamburgermenu不显示在工具栏上


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

在您的AppBarLayout上添加app:elevation =“ 0dp”。像这个例子

<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"消除阴影的方法。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.