移除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);
}
app:elevation=“0dp”
,但在代码中:
appBarLayout.bringToFront();
<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救生答案时出现:)