移除AppBarLayout小部件android下方的阴影

移除AppBarLayout小部件android下方的阴影,android,android-layout,Android,Android Layout,在设计支持库中使用AppBarLayout小部件时,工具栏底部会出现一个阴影。如何删除该阴影?只需在“AppBarLayout”中使用app:elevation=“0dp”即可删除阴影。它一直对我有用。希望它对您有用。我尝试了app:elevation=“0dp”但工具栏消失了,但使用app:elevation=“0.1dp”成功了 希望这对其他人有所帮助。此问题仅在api版本>=21时出现,如果您不想更改高程,可以使用: appBar.setOutlineProvider(null); 记住

在设计支持库中使用
AppBarLayout
小部件时,工具栏底部会出现一个阴影。如何删除该阴影?

只需在“AppBarLayout”中使用
app:elevation=“0dp”
即可删除阴影。它一直对我有用。希望它对您有用。

我尝试了
app:elevation=“0dp”
但工具栏消失了,但使用
app:elevation=“0.1dp”
成功了


希望这对其他人有所帮助。

此问题仅在api版本>=21时出现,如果您不想更改高程,可以使用:

appBar.setOutlineProvider(null);
记住检查api版本


编辑:

下面是
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();
    }
/**
*设置视图的{@link ViewOutlineProvider},该视图生成定义
*它投射的阴影的形状,并启用轮廓剪裁。
*
*默认的ViewOutlineProvider,{@link ViewOutlineProvider#BACKGROUND}查询大纲
*通过{@link drawable#getOutline(Outline)}从视图的背景可绘制。改变
*使用此方法的大纲提供程序允许重写此行为。
*
*如果ViewOutlineProvider为空,如果查询它的大纲返回false,
*或者,如果生成的轮廓是{@link Outline#isEmpty()},则不会投射阴影。
*
*只有从{@link Outline#canClip()}返回true的轮廓才能用于剪裁。
*
*@see#setClipToOutline(布尔值)
*@see#getClipToOutline()
*@see#getOutlineProvider()
*/
public void setOutlineProvider(ViewOutlineProvider提供程序){
mOutlineProvider=提供者;
无效输出线();
}
据说
如果ViewOutlineProvider为空,如果查询它的轮廓返回false,或者如果生成的轮廓为{@link outline#isEmpty()},则不会投射阴影。


因此,如果你想移除阴影,你最好使用这种方法,而不是设置
app:elevation
,似乎更改高程以移除阴影是一种副作用。在某些情况下,更改高程可能会导致其他一些问题。

这是我提出的去除阴影的方法。

非常有效。

对于最新的appcompat版本,xml中的技巧设置
app:elevation=“0.1dp”
不再有效

到目前为止,我找到了两种解决方案

  • 不要设置
    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);
    }
    
  • 一种更简单的方法是,您仍然可以正常地在xml中设置
    app:elevation=“0dp”
    ,但在代码中:

    appBarLayout.bringToFront();
    
  • 这两个讨论值得赞扬:

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

    您可以通过编程方式使用:
    getSupportActionBar().setElevation(0.0f)

    对于所有不想使用
    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>
    

    使用android:stateListAnimator=“@null”。没有副作用

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

    我正在Kotlin minSdkVersion 21上使用AppBarLayout&TabLayout执行此操作,因此:
    app:elevation=“0dp”
    确实可以帮助我解决阴影问题,但使用此解决方案会使我无法按下TabLayout上的按钮

    因此,结合
    app:elevation=“0.1dp”
    app:elevation=“0dp”
    我可以修复阴影,并且仍然能够与我的选项卡布局交互


    不要使用android:elevation。使用app:elevation。是否有一种方法可以以编程方式执行此操作,而不会收到设置高程仅在L之后可用的警告?app:elevation=“0dp”,阴影被删除,但现在选项卡不可单击。将其设置为0dp将隐藏工具栏。遗憾的是,不再是有效答案。请参见下面刘腾的回答,其中的
    setOutlineProvider
    0.1dp也不起作用,它还隐藏了工具栏菜单。我有一个使用appcompat v23.0.1的应用程序,使用此提示,您有什么版本?我使用的是
    v25.0.0
    。更新版本似乎不再起作用:(.API仅在版本21中可用。如何处理API<21?此问题仅在API>=21救生答案时出现:)