Android 坐标布局和AppBar布局立面图
我创建了一个像这样的AppBar布局Android 坐标布局和AppBar布局立面图,android,android-layout,coordinator-layout,Android,Android Layout,Coordinator Layout,我创建了一个像这样的AppBar布局 <android.support.design.widget.AppBarLayout xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/appbar_layout" android:layout_height="@d
<android.support.design.widget.AppBarLayout
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/appbar_layout"
android:layout_height="@dimen/app_bar_height"
android:layout_width="match_parent"
android:fitsSystemWindows="true"
android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
app:elevation="20dp">
<android.support.design.widget.CollapsingToolbarLayout...>
</android.support.design.widget.AppBarLayout>
这实际上是折叠工具栏布局的一个实现细节,如图所示:
当折叠工具栏布局
显示未固定的图元时,它将删除高程-默认情况下,只有当仅固定的子项可见时,它才会具有高程。原因如上所述,请尝试以下方法解决:
appBarLayout.addOnOffsetChangedListener(new AppBarLayout.OnOffsetChangedListener() {
@Override
public void onOffsetChanged(AppBarLayout appBarLayout, int verticalOffset) {
//some other code here
ViewCompat.setElevation(appBarLayout, The Elevation In Px);
}
});
解决方案是使用app:elevation=0dp
删除默认高程,并将android:translationZ
设置为所需高程
注意:下面的代码使用最新的AndroidX/Material库,如果使用旧的支持库,则可能无法工作
的文档说明可以使用app:elevation
属性设置自定义高程值,但对于大于0dp
的值,它不适用于我,因此我使用translationZ
作为解决方法。setTargetElevation()
现在不推荐用于AppBarLayout
基于布局状态将自定义高程应用于AppBarLayout的新正确实现是使用StateListAnimator。
如您所见,“材质组件”使用此选项
我在中添加了始终显示AppBarLayout高程的示例实现
你所需要的只是一个。在/res/animator
和2下创建自定义状态列表animator。将AppBarLayout的StateListAnimator设置为:
appBarLayout.stateListAnimator = AnimatorInflater.loadStateListAnimator(context, R.animator.appbar_always_elevated_state_list_animator)
我想知道为什么这个答案获得了很多选票。如果作者没有固定的元素怎么办?@LeoDroidcoder-绝大多数折叠工具栏布局
用法都有固定的工具栏
,因此得名。如果不是这样,您可能根本不想或不需要使用折叠工具栏布局
。可能有一个固定的工具栏
,它将允许在折叠状态下绘制阴影折叠工具栏布局
。但是许多开发人员想要的是在扩展状态下绘制阴影,即使用任何值verticalOffset
。尽管它可能与最新AndroidX库的Android 10上的材质设计指南不一致:有时立面是您要求的,有时是默认的(当在NestedView中滚动时),有时只是消失了(当折叠工具栏布局处于展开状态时)。
if (Math.abs(verticalOffset) == scrollRange) {
// If we have some pinned children, and we're offset to only show those views,
// we want to be elevate
ViewCompat.setElevation(layout, layout.getTargetElevation());
} else {
// Otherwise, we're inline with the content
ViewCompat.setElevation(layout, 0f);
}
appBarLayout.addOnOffsetChangedListener(new AppBarLayout.OnOffsetChangedListener() {
@Override
public void onOffsetChanged(AppBarLayout appBarLayout, int verticalOffset) {
//some other code here
ViewCompat.setElevation(appBarLayout, The Elevation In Px);
}
});
appBarLayout.stateListAnimator = AnimatorInflater.loadStateListAnimator(context, R.animator.appbar_always_elevated_state_list_animator)